OpenSearchEmbeddingRetriever
OpenSearchEmbeddingRetriever
OpenSearch Document Store와 호환되는 임베딩 기반 Retriever예요.
출처: 문서
본문
OpenSearchEmbeddingRetriever는 OpenSearchDocumentStore와 호환되는 임베딩 기반 Retriever예요. 검색어와 문서의 임베딩을 비교해서, 그 결과에 따라 OpenSearchDocumentStore에서 검색어와 가장 관련 있는 문서를 가져와요.
NLP 시스템에서 OpenSearchEmbeddingRetriever를 쓸 때는 검색어와 문서의 임베딩이 준비돼 있어야 해요. 인덱싱 파이프라인에는 Document Embedder를, 검색 파이프라인에는 Text Embedder를 추가하면 되죠.
query_embedding 외에도 OpenSearchEmbeddingRetriever는 top_k(가져올 최대 문서 수)와 검색 공간을 좁히는 filters 같은 선택 파라미터를 받아요.
임베딩을 저장하고 검색하기 위한 embedding_dim은 해당 OpenSearchDocumentStore를 초기화할 때 정의해야 해요.
설정과 설치
OpenSearch 인스턴스를 설치하고 실행해요.
Docker가 설정되어 있다면 Docker 이미지를 받아 실행하는 것을 권장해요.
docker pull opensearchproject/opensearch:3.5.0
docker run -p 9200:9200 -p 9600:9600 -e "discovery.type=single-node" -e "ES_JAVA_OPTS=-Xms1024m -Xmx1024m" -e "OPENSEARCH_INITIAL_ADMIN_PASSWORD=<custom-admin-password>" opensearchproject/opensearch:3.5.0
대안으로 OpenSearch integration GitHub에 가서 제공된 docker-compose.yml로 OpenSearch를 실행하는 Docker 컨테이너를 시작할 수 있어요.
docker compose up
실행 중인 OpenSearch 인스턴스가 준비되면 opensearch-haystack 통합을 설치해요.
pip install opensearch-haystack
더 알아보기 (Learn more)
파이프라인에서 쓰기
검색 파이프라인에서 이 Retriever를 이렇게 쓰세요.
이 페이지의 예제는 sentence-transformers-haystack 패키지의 Sentence Transformers 임베더를 사용해요. 예제를 실행하려면 설치하세요.
pip install sentence-transformers-haystack
from haystack_integrations.components.retrievers.opensearch import (
OpenSearchEmbeddingRetriever,
)
from haystack_integrations.document_stores.opensearch import OpenSearchDocumentStore
from haystack.document_stores.types import DuplicatePolicy
from haystack import Document
from haystack import Pipeline
from haystack_integrations.components.embedders.sentence_transformers import (
SentenceTransformersTextEmbedder,
SentenceTransformersDocumentEmbedder,
)
document_store = OpenSearchDocumentStore(
hosts="http://localhost:9200",
use_ssl=True,
verify_certs=False,
http_auth=("admin", "<custom-admin-password>"),
)
model = "sentence-transformers/all-mpnet-base-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.",
),
]
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",
OpenSearchEmbeddingRetriever(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.7002675)
추가 참고 자료
🧑🍳 Cookbook: PDF-Based Question Answering with Amazon Bedrock and Haystack