Pinecone 의미 검색 — 밀집 벡터로 유사도 찾기

Pinecone 의미 검색 — 밀집 벡터로 유사도 찾기

의미 검색은 질의와 의미·맥락이 가장 비슷한 레코드를 찾는 검색이에요. 밀집 벡터로 검색하며, 벡터가 다차원 공간에서 가까울수록 의미적으로 유사하다고 봅니다.

출처: https://docs.pinecone.io/guides/search/semantic-search

텍스트로 검색하기

텍스트 검색은 인덱스에 임베딩 모델이 통합돼 있을 때만 지원돼요. 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 이후는 asyncioasync 메서드를 제공해 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 문서 참고