Pinecone은 클라우드 네이티브 벡터 데이터베이스로, 대규모 벡터 데이터의 저장, 검색, 분석에 특화된 완전 관리형 서비스입니다. 특히 검색 강화 생성(RAG), 추천 시스템, 시맨틱 검색 등의 AI 애플리케이션 구축에 최적화되어 있습니다.
Pinecone은 Dense Vector와 Sparse Vector를 모두 지원하여 하이브리드 검색을 제공합니다:
# Dense Vector (일반적인 임베딩)
dense_vector = [0.1, 0.2, 0.3, 0.4, ...]
# Sparse Vector (키워드 기반)
sparse_vector = {
'indices': [10, 45, 16],
'values': [0.5, 0.5, 0.2]
}
# 하이브리드 검색 수행
query_response = index.query(
namespace="example-namespace",
top_k=10,
vector=dense_vector,
sparse_vector=sparse_vector
)
동일한 인덱스 내에서 데이터를 논리적으로 분리할 수 있습니다:
# 네임스페이스별 데이터 삽입
index.upsert(
vectors=[
{
"id": "vec1",
"values": [0.1, 0.2, 0.3],
"metadata": {"category": "technology"}
}
],
namespace="tech-articles"
)
# 네임스페이스별 검색
results = index.query(
namespace="tech-articles",
vector=[0.1, 0.2, 0.3],
top_k=5
)
벡터와 함께 메타데이터를 저장하고 검색 시 필터링할 수 있습니다:
# 메타데이터와 함께 벡터 저장
vectors_with_metadata = [
{
"id": "article1",
"values": [0.1, 0.2, 0.3],
"metadata": {
"category": "technology",
"published_date": "2024-01-15",
"author": "John Doe"
}
}
]
# 메타데이터 필터링 검색
results = index.query(
vector=[0.1, 0.2, 0.3],
top_k=10,
filter={
"category": {"$eq": "technology"},
"published_date": {"$gte": "2024-01-01"}
}
)
대량의 벡터 데이터를 효율적으로 처리할 수 있습니다:
# 배치 업서트
batch_vectors = []
for i in range(1000):
batch_vectors.append({
"id": f"vec_{i}",
"values": [random.random() for _ in range(1024)],
"metadata": {"batch_id": i // 100}
})
# 배치 단위로 업서트
for i in range(0, len(batch_vectors), 100):
batch = batch_vectors[i:i+100]
index.upsert(vectors=batch)
import pinecone
# 클라이언트 초기화
pc = pinecone.Pinecone(api_key="YOUR_API_KEY")
# 인덱스 연결
index = pc.Index("your-index-name")
# 벡터 검색
results = index.query(
vector=[0.1, 0.2, 0.3],
top_k=5,
include_metadata=True
)
import { Pinecone } from '@pinecone-database/pinecone';
const pc = new Pinecone({
apiKey: 'YOUR_API_KEY'
});
const index = pc.index('your-index-name');
const results = await index.query({
vector: [0.1, 0.2, 0.3],
topK: 5,
includeMetadata: true
});
import io.pinecone.clients.Pinecone;
import io.pinecone.clients.Index;
Pinecone pinecone = new Pinecone.Builder("YOUR_API_KEY").build();
Index index = pinecone.getIndexConnection("your-index-name");
QueryResponse response = index.query(
QueryRequest.newBuilder()
.addAllVector(Arrays.asList(0.1f, 0.2f, 0.3f))
.setTopK(5)
.setIncludeMetadata(true)
.build()
);
# 문서 청킹 및 임베딩
documents = [
"Pinecone은 벡터 데이터베이스입니다.",
"RAG는 검색 강화 생성 기법입니다.",
"임베딩은 텍스트를 벡터로 변환합니다."
]
# 문서를 벡터로 변환 후 저장
vectors = []
for i, doc in enumerate(documents):
embedding = get_embedding(doc) # 임베딩 생성
vectors.append({
"id": f"doc_{i}",
"values": embedding,
"metadata": {"text": doc}
})
index.upsert(vectors=vectors)
# 질문에 대한 관련 문서 검색
query = "벡터 데이터베이스란 무엇인가?"
query_embedding = get_embedding(query)
results = index.query(
vector=query_embedding,
top_k=3,
include_metadata=True
)
# 사용자 행동 데이터를 벡터로 저장
user_preferences = {
"user_123": {
"values": [0.8, 0.2, 0.9, 0.1], # 선호도 벡터
"metadata": {
"age": 25,
"location": "Seoul",
"interests": ["tech", "music"]
}
}
}
# 유사한 사용자 찾기
similar_users = index.query(
vector=user_preferences["user_123"]["values"],
top_k=10,
filter={"location": {"$eq": "Seoul"}}
)
# 인덱스 상태 확인
stats = index.describe_index_stats()
print(f"Total vectors: {stats.total_vector_count}")
print(f"Dimension: {stats.dimension}")
print(f"Namespaces: {stats.namespaces}")
# 환경 변수에서 API 키 로드
import os
api_key = os.getenv("PINECONE_API_KEY")
pc = pinecone.Pinecone(api_key=api_key)
# 벡터 차원 최적화
# 불필요한 차원을 줄여 저장 비용 절약
optimized_vector = vector[:512] # 1024차원 → 512차원
# 배치 처리로 효율성 향상
batch_size = 100
for i in range(0, len(vectors), batch_size):
batch = vectors[i:i+batch_size]
index.upsert(vectors=batch)
from langchain.vectorstores import Pinecone
from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
vectorstore = Pinecone.from_texts(
texts=documents,
embedding=embeddings,
index_name="langchain-index"
)
# 유사도 검색
results = vectorstore.similarity_search("검색 쿼리", k=5)
# 적절한 차원 수 선택 (보통 256-1536)
dimension = 1536 # OpenAI text-embedding-ada-002
# 메타데이터 구조 설계
metadata_structure = {
"content": "문서 내용",
"category": "분류",
"timestamp": "타임스탬프",
"source": "출처"
}
# 정기적인 데이터 정리
def cleanup_old_vectors():
# 30일 이전 데이터 삭제
cutoff_date = datetime.now() - timedelta(days=30)
# 메타데이터 필터로 오래된 벡터 식별
old_vectors = index.query(
vector=[0] * dimension,
top_k=10000,
filter={"timestamp": {"$lt": cutoff_date.isoformat()}}
)
# 삭제 수행
ids_to_delete = [match.id for match in old_vectors.matches]
index.delete(ids=ids_to_delete)
Pinecone은 현대적인 AI 애플리케이션 구축에 필수적인 벡터 데이터베이스로, 특히 대규모 시맨틱 검색, RAG 시스템, 추천 엔진 등에서 핵심적인 역할을 합니다. 완전 관리형 서비스로 제공되어 인프라 관리 부담 없이 벡터 기반 애플리케이션을 빠르게 구축할 수 있습니다.