SolrEmbeddingRetriever

SolrEmbeddingRetriever

SolrEmbeddingRetriever 는 Solr Document Store와 호환되는 임베딩 기반 리트리버예요. 질의 임베딩과 문서 임베딩을 비교해 질의와 가장 관련 있는 문서를 Solr에서 가져와요.

출처: 문서

본문

개요 (Overview)

SolrEmbeddingRetriever 는 질의와 문서 임베딩을 비교해 SolrDocumentStore에서 질의와 가장 관련 있는 문서를 가져와요. Solr의 {!knn} 쿼리 파서로 밀집 벡터 필드에 대한 근사 최근접 이웃(approximate nearest neighbor) 검색을 수행해요.

파이프라인에서 SolrEmbeddingRetriever 를 쓸 때는 질의를 먼저 임베딩으로 바꿔야 해요. Text Embedder(예: SentenceTransformersTextEmbedder)로 할 수 있어요. 문서는 해당 Document Embedder가 만든 임베딩으로 인덱싱되어 있어야 하고요 — 임베딩 모델이 Document Store를 만들 때 지정한 embedding_dim 과 일치하는지 꼭 확인하세요.

파라미터 (Parameters)

query_embedding 외에도 SolrEmbeddingRetriever 는 다른 옵션 파라미터를 받아요. top_k(가져올 최대 문서 수)와 검색 범위를 좁히는 filters 등이 있죠. 필터는 k-NN 그래프의 사전 필터(pre-filter) 역할을 해서, 필터를 걸어도 여전히 최대 top_k 개 문서를 반환해요.

리트리버는 Document Store의 async 클라이언트를 사용하는 run_async 메서드도 제공해요.

사용법 (Usage)

설치 (Installation)

Solr를 Haystack에서 쓰려면 패키지를 설치하세요:

pip install solr-haystack

단독으로 쓰기

이 리트리버는 SolrDocumentStore 인스턴스와 인덱싱된 문서가 있어야 동작해요.

from haystack_integrations.document_stores.solr import SolrDocumentStore
from haystack_integrations.components.retrievers.solr import SolrEmbeddingRetriever

document_store = SolrDocumentStore(
    url="http://localhost:8983/solr", core="haystack", embedding_dim=384
)
retriever = SolrEmbeddingRetriever(document_store=document_store)
# using a fake vector to keep the example simple
retriever.run(query_embedding=[0.1] * 384)

파이프라인에서 쓰기

이 예시는 문서를 임베딩과 함께 인덱싱한 뒤, 질의를 임베딩해서 리트리버에 전달해요:

from haystack import Document, Pipeline
from haystack.components.embedders import (
    SentenceTransformersDocumentEmbedder,
    SentenceTransformersTextEmbedder,
)
from haystack.components.writers import DocumentWriter
from haystack_integrations.components.retrievers.solr import SolrEmbeddingRetriever
from haystack_integrations.document_stores.solr import SolrDocumentStore

document_store = SolrDocumentStore(
    url="http://localhost:8983/solr", core="haystack", embedding_dim=384
)
model = "sentence-transformers/all-MiniLM-L6-v2"

documents = [
    Document(content="There are over 7,000 languages spoken around the world today."),
    Document(
        content="Elephants have been observed to behave in a way that indicates a high level of self-awareness, such as recognizing themselves in mirrors.",
    ),
    Document(
        content="In certain parts of the world, like the Maldives, Puerto Rico, and San Diego, you can witness the phenomenon of bioluminescent waves.",
    ),
]

indexing_pipeline = Pipeline()
indexing_pipeline.add_component(
    "embedder", SentenceTransformersDocumentEmbedder(model=model)
)
indexing_pipeline.add_component("writer", DocumentWriter(document_store=document_store))
indexing_pipeline.connect("embedder", "writer")
indexing_pipeline.run({"embedder": {"documents": documents}})

query_pipeline = Pipeline()
query_pipeline.add_component(
    "text_embedder", SentenceTransformersTextEmbedder(model=model)
)
query_pipeline.add_component(
    "retriever", SolrEmbeddingRetriever(document_store=document_store)
)
query_pipeline.connect("text_embedder.embedding", "retriever.query_embedding")
result = query_pipeline.run(
    {"text_embedder": {"text": "How many languages are there?"}}
)
print(result["retriever"]["documents"][0])

더 알아보기 (Learn more)