ElasticsearchEmbeddingRetriever
ElasticsearchEmbeddingRetriever
Elasticsearch Document Store와 호환되는 임베딩 기반 리트리버예요.
출처: 문서
본문
- 파이프라인에서의 일반적인 위치: 1. RAG 파이프라인에서 Text Embedder 뒤,
PromptBuilder앞. 2. 시맨틱 검색 파이프라인의 마지막 컴포넌트. 3. 추출형 QA 파이프라인에서 Text Embedder 뒤,TransformersExtractiveReader앞. - 필수 초기화 변수:
document_store(ElasticsearchDocumentStore 인스턴스) - 필수 실행 변수:
query_embedding(float 리스트) - 출력 변수:
documents(문서 리스트)
개요 (Overview)
ElasticsearchEmbeddingRetriever는 ElasticsearchDocumentStore와 호환되는 임베딩 기반 리트리버예요. 쿼리와 문서 임베딩을 비교하고, 그 결과에 따라 ElasticsearchDocumentStore에서 쿼리에 가장 관련 있는 문서를 가져와요.
NLP 시스템에서 ElasticsearchEmbeddingRetriever를 사용할 때는 쿼리와 문서 임베딩이 준비되어 있어야 해요. 인덱싱 파이프라인에 Document Embedder를, 쿼리 파이프라인에 Text Embedder를 추가하면 됩니다.
ElasticsearchEmbeddingRetriever는 query_embedding 외에도 top_k(검색할 최대 문서 수)와 filters(검색 공간을 좁히는 용도) 같은 다른 선택적 파라미터를 받아요.
리트리버를 초기화할 때 num_candidates도 설정할 수 있어요. 각 샤드에서의 근사 최근접 이웃(approximate nearest neighbor) 후보 수를 말해요. 이는 고급 설정이며 Elasticsearch 문서에서 더 자세히 읽을 수 있어요.
임베딩 검색에 사용할 embedding_similarity_function은 해당 ElasticsearchDocumentStore를 초기화할 때 정의해야 해요.
설치 (Installation)
Elasticsearch를 설치한 뒤 인스턴스를 시작하세요. Haystack은 Elasticsearch 8을 지원해요.
Docker가 설정되어 있다면 Docker 이미지를 받아 실행하는 것을 권장해요.
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.19.7
docker run -p 9200:9200 -e "discovery.type=single-node" -e "ES_JAVA_OPTS=-Xms1024m -Xmx1024m" -e "xpack.security.enabled=false" elasticsearch:8.19.7
대안으로 Elasticsearch 통합 GitHub에서 제공하는 docker-compose.yml을 사용해 Elasticsearch를 실행하는 Docker 컨테이너를 시작할 수 있어요.
docker compose up
실행 중인 Elasticsearch 인스턴스가 있으면 elasticsearch-haystack 통합을 설치하세요.
pip install elasticsearch-haystack
이 페이지의 예시는 sentence-transformers-haystack 패키지의 Sentence Transformers 임베더를 사용해요. 예시를 실행하려면 설치하세요.
pip install sentence-transformers-haystack
사용법 (Usage)
파이프라인에서 사용 (In a pipeline)
이 리트리버를 쿼리 파이프라인에서 이렇게 사용해요.
from haystack_integrations.components.retrievers.elasticsearch import (
ElasticsearchEmbeddingRetriever,
)
from haystack_integrations.document_stores.elasticsearch import (
ElasticsearchDocumentStore,
)
from haystack.document_stores.types import DuplicatePolicy
from haystack import Document, Pipeline
from haystack_integrations.components.embedders.sentence_transformers import (
SentenceTransformersTextEmbedder,
SentenceTransformersDocumentEmbedder,
)
document_store = ElasticsearchDocumentStore(hosts="http://localhost:9200/")
model = "BAAI/bge-large-en-v1.5"
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.",
),
]
document_embedder = SentenceTransformersDocumentEmbedder(model=model)
documents_with_embeddings = document_embedder.run(documents)
document_store.write_documents(
documents_with_embeddings.get("documents"),
policy=DuplicatePolicy.SKIP,
)
query_pipeline = Pipeline()
query_pipeline.add_component(
"text_embedder",
SentenceTransformersTextEmbedder(model=model),
)
query_pipeline.add_component(
"retriever",
ElasticsearchEmbeddingRetriever(document_store=document_store),
)
query_pipeline.connect("text_embedder.embedding", "retriever.query_embedding")
query = "How many languages are there?"
result = query_pipeline.run({"text_embedder": {"text": query}})
print(result["retriever"]["documents"][0])
예시 출력은 다음과 같아요.
Document(id=cfe93bc1c274908801e6670440bf2bbba54fad792770d57421f85ffa2a4fcc94, content: 'There are over 7,000 languages spoken around the world today.', score: 0.87717235, embedding: vector of size 1024)