Pinecone 의미 검색 — 밀집 벡터로 유사도 찾기
Pinecone 의미 검색 — 밀집 벡터로 유사도 찾기
의미 검색은 질의와 의미·맥락이 가장 비슷한 레코드를 찾는 검색이에요. 밀집 벡터로 검색하며, 벡터가 다차원 공간에서 가까울수록 의미적으로 유사하다고 봅니다.
텍스트로 검색하기
텍스트 검색은 인덱스에 임베딩 모델이 통합돼 있을 때만 지원돼요. search_records 연산에 네임스페이스, 질의 텍스트, 반환할 top_k를 지정하면 됩니다. 기본 네임스페이스는 "__default__"를 씁니다.
# 질의 텍스트를 Pinecone이 통합 임베딩 모델로 벡터화해 유사도 검색
result = index.search_records(
namespace="example-namespace",
query={ "inputs": {"text": "Which fruits are high in vitamin C?"}, "top_k": 2 }
)
응답의 각 레코드는 인덱스의 유사도 메트릭으로 계산된 _score를 함께 반환해요.
{'result': {'hits': [{'_id': 'rec3',
'_score': 0.8204272389411926,
'fields': {'category': 'immune system',
'chunk_text': 'Rich in vitamin C and other antioxidants...'}},
{'_id': 'rec1',
'_score': 0.7931625843048096,
'fields': {'category': 'digestive system', ...}}]},
'usage': {'embed_total_tokens': 8, 'read_units': 6}}
밀집 벡터로 검색하기
질의를 이미 벡터로 갖고 있다면 query 연산에 vector 파라미터로 넘기면 돼요. include_values·include_metadata를 켜서 응답에 벡터 값이나 메타데이터를 포함할 수 있지만, top_k가 클 때는 벡터 값까지 돌려받는 게 성능을 떨어뜨릴 수 있으니 필요할 때만 켜는 걸 권장합니다.
병렬 질의
Python SDK v6.0.0 이후는 asyncio용 async 메서드를 제공해 FastAPI·Quart 같은 비동기 웹 프레임워크와 잘 어울려요. 동기 방식으로는 스레드 풀을 써서 여러 질의를 동시에 실행할 수 있습니다.
import os
from pinecone import Pinecone
from concurrent.futures import ThreadPoolExecutor
api_key = os.environ.get("PINECONE_API_KEY")
pc = Pinecone(api_key=api_key)
index = pc.Index("docs-example")
def run_query(vector):
return index.query(
namespace="example-namespace",
vector=vector,
top_k=3,
include_values=True
)
with ThreadPoolExecutor(max_workers=4) as executor:
results = list(executor.map(run_query, vectors))
더 알아보기
- 데이터 모델링은 Data modeling 참고
- 검색 방식 전체는 Search overview 참고
- 풀텍스트 검색은 Full-text search 문서 참고