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