文档API 参考📓 教程🧑‍🍳 食谱🤝 集成💜 Discord🎨 Studio
文档

ElasticsearchEmbeddingRetriever

一个与 Elasticsearch Document Store 兼容的基于 embedding 的 Retriever。

pipeline 中的最常见位置1. 在 Text Embedder 之后,在 RAG pipeline 的 PromptBuilder 之前 2. 语义搜索 pipeline 中的最后一个组件 3. 在 Text Embedder 之后,在 extractive QA pipeline 的 ExtractiveReader 之前
必需的初始化变量"document_store": ElasticsearchDocumentStore 的一个实例
强制运行变量“query_embedding”:浮点数列表
输出变量"documents": 文档列表
API 参考Elasticsearch
GitHub 链接https://github.com/deepset-ai/haystack-core-integrations/tree/main/integrations/elasticsearch

概述

ElasticsearchEmbeddingRetriever 是一个基于 embedding 的 Retriever,与ElasticsearchDocumentStore 兼容。它会比较查询和文档的 embedding,并根据结果从ElasticsearchDocumentStore 中获取与查询最相关的文档。

使用在你的 NLP 系统中使用 ElasticsearchEmbeddingRetriever,请确保它拥有查询和文档的 embedding。你可以通过在索引管道中添加 Document Embedder,在查询管道中添加 Text Embedder 来实现。

除了query_embedding 之外,ElasticsearchEmbeddingRetriever 也接受其他可选参数,包括top_k(要检索的文档的最大数量)和filters(用于缩小搜索范围)。

初始化 Retriever 时,你还可以设置num_candidates:每个分片上的近似最近邻候选数量。这是一个高级设置,你可以在 Elasticsearch 文档 中找到更多信息。

embedding_similarity_function,用于 embedding 检索,必须在初始化相应的ElasticsearchDocumentStore 时定义。

安装

安装 Elasticsearch,然后启动一个实例。Haystack 支持 Elasticsearch 8。

如果您已设置 Docker,我们建议拉取 Docker 镜像并运行它。

docker pull docker.elastic.co/elasticsearch/elasticsearch:8.11.1
docker run -p 9200:9200 -e "discovery.type=single-node" -e "ES_JAVA_OPTS=-Xms1024m -Xmx1024m" -e "xpack.security.enabled=false" elasticsearch:8.11.1

作为替代方案,您可以前往 Elasticsearch 集成 GitHub,并使用提供的文件启动一个运行 Elasticsearch 的 Docker 容器。docker-compose.yml:

docker compose up

启动 Elasticsearch 实例后,安装elasticsearch-haystack 集成。

pip install elasticsearch-haystack

用法

在 pipeline 中

像这样在查询管道中使用此 Retriever

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.components.embedders import SentenceTransformersTextEmbedder, SentenceTransformersDocumentEmbedder

document_store = ElasticsearchDocumentStore(hosts= "https://: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)  
document_embedder.warm_up()
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)

相关链接

请查看 GitHub 仓库或我们的文档中的 API 参考