본문으로 건너뛰기 Pinecone 완벽 가이드 | Vector Database·임베딩·유사도 검색·RAG·실전 활용

Pinecone 완벽 가이드 | Vector Database·임베딩·유사도 검색·RAG·실전 활용

Pinecone 완벽 가이드 | Vector Database·임베딩·유사도 검색·RAG·실전 활용

이 글의 핵심

Pinecone으로 벡터 검색을 구현하는 완벽 가이드. 임베딩 저장, 유사도 검색, Metadata 필터링, RAG 구현까지 실전 예제로 정리. Pinecone·Vector Database·Embedding 중심으로 설명합니다.

이 글의 핵심

Pinecone으로 벡터 검색을 구현하는 완벽 가이드입니다. 임베딩 저장, 유사도 검색, Metadata 필터링, RAG 구현까지 실전 예제로 정리했습니다.

실무 경험 공유: 키워드 검색을 벡터 검색으로 전환하면서, 검색 정확도가 40% 향상되고 사용자 만족도가 크게 증가한 경험을 공유합니다.

들어가며: “키워드 검색이 부정확해요”

실무에서 마주치는 문제들

의미 기반 검색이 필요해요

키워드는 제한적입니다. 벡터 검색은 의미를 이해합니다. 추천 시스템이 필요해요

규칙 기반은 부족합니다. 벡터 유사도로 정확한 추천이 가능합니다. RAG 구현이 필요해요

문서 검색이 복잡합니다. Pinecone으로 간단히 구현할 수 있습니다.

1. Pinecone이란?

핵심 특징

Pinecone은 관리형 벡터 데이터베이스입니다. 주요 장점

  • 빠른 검색: 밀리초 단위
  • 확장성: 수십억 벡터
  • Metadata 필터링: 정교한 검색
  • 관리형: 인프라 관리 불필요
  • 간단한 API: 쉬운 통합

2. 설치 및 설정

설치

pip install pinecone-client openai

초기화

from pinecone import Pinecone
pc = Pinecone(api_key="your-api-key")
# Index 생성
pc.create_index(
    name="my-index",
    dimension=1536,  # OpenAI embedding dimension
    metric="cosine",
    spec={"serverless": {"cloud": "aws", "region": "us-east-1"}}
)
# Index 연결
index = pc.Index("my-index")

3. 임베딩 생성

OpenAI Embedding

from openai import OpenAI
client = OpenAI(api_key="your-api-key")
def get_embedding(text: str) -> list[float]:
    response = client.embeddings.create(
        model="text-embedding-3-small",
        input=text
    )
    return response.data[0].embedding
# 사용
embedding = get_embedding("Hello, world!")
print(len(embedding))  # 1536

4. 데이터 저장

Upsert

# 단일 저장
index.upsert(
    vectors=[
        {
            "id": "doc1",
            "values": embedding,
            "metadata": {
                "title": "Document 1",
                "category": "tech",
                "date": "2024-01-01"
            }
        }
    ]
)
# 배치 저장
vectors = []
for i, doc in enumerate(documents):
    embedding = get_embedding(doc[text])
    vectors.append({
        "id": f"doc{i}",
        "values": embedding,
        "metadata": doc[metadata]
    })
index.upsert(vectors=vectors)

5. 검색

유사도 검색

query = "How to use Python?"
query_embedding = get_embedding(query)
results = index.query(
    vector=query_embedding,
    top_k=5,
    include_metadata=True
)
for match in results[matches]:
    print(f"ID: {match['id']}")
    print(f"Score: {match['score']}")
    print(f"Metadata: {match['metadata']}")
    print()

Metadata 필터링

results = index.query(
    vector=query_embedding,
    top_k=5,
    filter={
        "category": {"$eq": "tech"},
        "date": {"$gte": "2024-01-01"}
    },
    include_metadata=True
)

6. RAG 구현

문서 인덱싱

from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 문서 로드
loader = TextLoader("document.txt")
documents = loader.load()
# 청크 분할
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200
)
chunks = text_splitter.split_documents(documents)
# Pinecone에 저장
for i, chunk in enumerate(chunks):
    embedding = get_embedding(chunk.page_content)
    index.upsert(
        vectors=[{
            "id": f"chunk{i}",
            "values": embedding,
            "metadata": {
                "text": chunk.page_content,
                "source": chunk.metadata.get("source")
            }
        }]
    )

RAG Chain

from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
def rag_query(question: str) -> str:
    # 1. 질문 임베딩
    query_embedding = get_embedding(question)
    # 2. 유사 문서 검색
    results = index.query(
        vector=query_embedding,
        top_k=3,
        include_metadata=True
    )
    # 3. 컨텍스트 구성
    context = "\n\n".join([
        match[metadata][text]
        for match in results[matches]
    ])
    # 4. LLM 호출
    template = ChatPromptTemplate.from_messages([
        ("system", "Answer the question based on the following context:\n\n{context}"),
        ("human", "{question}")
    ])
    llm = ChatOpenAI(model="gpt-4")
    prompt = template.format_messages(context=context, question=question)
    response = llm.invoke(prompt)
    return response.content
# 사용
answer = rag_query("What is LangChain?")
print(answer)

7. LangChain 통합

from langchain.vectorstores import Pinecone as LangchainPinecone
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
vectorstore = LangchainPinecone.from_documents(
    documents=chunks,
    embedding=embeddings,
    index_name="my-index"
)
# 검색
docs = vectorstore.similarity_search("Python tutorial", k=3)
for doc in docs:
    print(doc.page_content)

8. 실전 예제: 문서 챗봇

from langchain.chains import RetrievalQA
from langchain.vectorstores import Pinecone as LangchainPinecone
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
# Vector Store
embeddings = OpenAIEmbeddings()
vectorstore = LangchainPinecone.from_existing_index(
    index_name="my-index",
    embedding=embeddings
)
# QA Chain
llm = ChatOpenAI(model="gpt-4", temperature=0)
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=vectorstore.as_retriever(search_kwargs={"k": 3})
)
# 챗봇
def chatbot(question: str) -> str:
    response = qa_chain.invoke({"query": question})
    return response[result]
# 사용
print(chatbot("What is the pricing?"))
print(chatbot("How do I get started?"))

정리 및 체크리스트

핵심 요약

  • Pinecone: Vector Database
  • 임베딩: 텍스트를 벡터로 변환
  • 유사도 검색: 의미 기반 검색
  • Metadata 필터링: 정교한 검색
  • RAG: 문서 기반 응답
  • LangChain 통합: 완벽한 호환

구현 체크리스트

  • Pinecone 계정 생성
  • Index 생성
  • 임베딩 생성
  • 데이터 저장
  • 검색 구현
  • RAG 구현
  • LangChain 통합

같이 보면 좋은 글


이 글에서 다루는 키워드

Pinecone, Vector Database, Embedding, RAG, AI, Search, Backend

자주 묻는 질문 (FAQ)

Q. Elasticsearch와 비교하면 어떤가요?

A. Pinecone이 벡터 검색에 특화되어 더 빠르고 정확합니다.

Q. 무료로 사용할 수 있나요?

A. 네, Starter 플랜이 무료입니다. 1 Index, 100K 벡터까지 무료입니다.

Q. 다른 임베딩 모델을 사용할 수 있나요?

A. 네, OpenAI 외에도 Cohere, HuggingFace 등 다양한 모델을 사용할 수 있습니다.

Q. 프로덕션에서 사용해도 되나요?

A. 네, 많은 AI 스타트업에서 안정적으로 사용하고 있습니다.