# Pinecone 벡터 DB 입문

안녕하세요! 오늘은 **Pinecone** 벡터 데이터베이스를 사용해서 RAG 앱을 구축하는 방법을 알아봅니다! 🌲
## Pinecone이란?
AI 애플리케이션을 위한 **완전 관리형 벡터 데이터베이스**입니다.
**특징:**
– 고성능 검색
– 무한 확장성
– 간편한 API
– 실시간 업데이트
—
## 1. 계정 생성 및 API 키
1. [Pinecone](https://pinecone.io/) 가입
2. 새 프로젝트 생성
3. API 키 발급
“`bash
# .env 파일
PINECONE_API_KEY=your-api-key-here
“`
—
## 2. 인덱스 생성
“`python
import pinecone
# 클라이언트 초기화
pinecone.init(
api_key=”your-api-key”,
environment=”us-east-1-aws”
)
# 인덱스 생성
pinecone.create_index(
name=”my-index”,
dimension=1536, # OpenAI 임베딩 차원
metric=”cosine”,
pod_type=”p1.x1″
)
“`
—
## 3. 데이터 임베딩
“`python
from openai import OpenAI
import numpy as np
client = OpenAI()
def embed_text(text):
response = client.embeddings.create(
model=”text-embedding-ada-002″,
input=text
)
return response.data[0].embedding
# 예시
documents = [
{“id”: 1, “text”: “Python은 쉬운 언어입니다”},
{“id”: 2, “text”: “JavaScript는 웹 개발에 필수입니다”},
{“id”: 3, “text”: “Rust는 안전하고 빠릅니다”},
]
# 임베딩 생성
for doc in documents:
doc[“embedding”] = embed_text(doc[“text”])
“`
—
## 4. 데이터 삽입
“`python
# 인덱스 연결
index = pinecone.Index(“my-index”)
# 벡터 데이터 준비
vectors = []
for doc in documents:
vectors.append({
“id”: str(doc[“id”]),
“values”: doc[“embedding”],
“metadata”: {“text”: doc[“text”]}
})
# 삽입
index.upsert(vectors=vectors)
print(f”{len(vectors)}개의 벡터 삽입 완료”)
“`
—
## 5. 유사도 검색
“`python
# 검색 쿼리 임베딩
query = “어떤 언어가 빠른가요?”
query_embedding = embed_text(query)
# 검색
results = index.query(
vector=query_embedding,
top_k=3,
include_metadata=True
)
# 결과 출력
for match in results[“matches”]:
print(f”점수: {match[‘score’]:.3f}”)
print(f”텍스트: {match[‘metadata’][‘text’]}”)
print()
“`
—
## 6. 필터링 검색
“`python
# 메타데이터 필터링
results = index.query(
vector=query_embedding,
filter={
“category”: {“$eq”: “programming”}
},
top_k=5,
include_metadata=True
)
“`
—
## 7. RAG 앱 구현
### FastAPI 백엔드
“`python
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from pinecone import Pinecone
from openai import OpenAI
app = FastAPI()
pc = Pinecone(api_key=”your-api-key”)
index = pc.Index(“my-index”)
openai_client = OpenAI()
class Query(BaseModel):
text: str
@app.post(“/chat”)
async def chat(query: Query):
# 1. 검색
query_embedding = embed_text(query.text)
results = index.query(
vector=query_embedding,
top_k=3,
include_metadata=True
)
# 2. 컨텍스트 구성
context = ”
“.join([
match[“metadata”][“text”]
for match in results[“matches”]
])
# 3. 답변 생성
response = openai_client.chat.completions.create(
model=”gpt-4″,
messages=[
{
“role”: “system”,
“content”: “다음 컨텍스트를 사용해서 답변해:”
},
{
“role”: “user”,
“content”: f”컨텍스트:
{context}
질문: {query.text}”
}
]
)
return {
“answer”: response.choices[0].message.content,
“sources”: results[“matches”]
}
“`
—
## 8. LangChain과 통합
“`python
from langchain_community.vectorstores import PineconeStore
from langchain_openai import OpenAIEmbeddings
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
# 임베딩
embeddings = OpenAIEmbeddings()
# 벡터 스토어
vectorstore = PineconeStore.from_documents(
documents,
embeddings,
index_name=”my-index”
)
# 체인
llm = ChatOpenAI(model_name=”gpt-4″)
chain = RetrievalQA.from_chain_type(
llm,
chain_type=”stuff”,
retriever=vectorstore.as_retriever()
)
# 쿼리
result = chain.run(“Rust는 어떤 특징이 있나요?”)
print(result)
“`
—
## 9. 실시간 업데이트
“`python
# 새 문서 추가
def add_document(text: str, doc_id: str):
embedding = embed_text(text)
index.upsert(
vectors=[{
“id”: doc_id,
“values”: embedding,
“metadata”: {“text”: text, “created_at”: str(datetime.now())}
}]
)
# 문서 삭제
index.delete(ids=[“1”, “2”, “3”])
# 문서 업데이트
index.upsert(
vectors=[{
“id”: “1”,
“values”: new_embedding,
“metadata”: {“text”: “업데이트된 텍스트”}
}]
)
“`
—
## 10. 최적화 팁
### 1. 배치 처리
“`python
# 대규모 삽입
batch_size = 100
for i in range(0, len(vectors), batch_size):
batch = vectors[i:i+batch_size]
index.upsert(vectors=batch)
“`
### 2. 메타데이터 최적화
“`python
# 필요한 메타데이터만 저장
index.upsert([{
“id”: “1”,
“values”: embedding,
“metadata”: {
“title”: “제목”,
“category”: “개발”,
“date”: “2024-01-01″
# 텍스트 제외 → 저장 공간 절약
}
}])
“`
### 3. 캐싱
“`python
from functools import lru_cache
@lru_cache(maxsize=1000)
def cached_search(query: str):
return index.query(vector=embed_text(query), top_k=3)
“`
—
## 11. 모니터링
“`python
# 인덱스 통계
stats = index.describe_index_stats()
print(f”총 벡터 수: {stats[‘total_vector_count’]}”)
print(f”차원: {stats[‘dimension’]}”)
“`
—
## 12. 비용 최적화
| 요금제 | 스토리지 | 쿼리 |
|——–|———|——|
| 스타터 | $0.70/GB/월 | $0.02/1,000 쿼리 |
| 표준 | $1.00/GB/월 | $0.03/1,000 쿼리 |
| 엔터프라이즈 | 문의 | 문의 |
—
## 결론
Pinecone은 RAG 앱 구축을 위한 최고의 벡터 DB입니다!
**장점:**
– ✅ 고성능 검색
– ✅ 자동 확장
– ✅ 간편한 API
– ✅ 다양한 SDK
—
## 다음 단계
– 🔐 인증 및 보안
– 📊 모니터링 및 알림
– 🌐 여러 리전 배포
## 참고 자료
– [Pinecone 문서](https://docs.pinecone.io/)
– [Python SDK](https://github.com/pinecone-io/pinecone-python-client)
—
질문이 있나요? 댓글로 남겨주세요! 😊
**다음 포스팅:** AI 에이전트: Auto-GPT 개념과 실전