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)
- SolrDocumentStore — Solr 기반 문서 저장소
- SolrBM25Retriever — 키워드 기반 리트리버
- SolrHybridRetriever — 하이브리드 리트리버
- Embedders — 텍스트/문서 임베딩 컴포넌트
- Solr API 참조
- GitHub 저장소