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

OpenSearchHybridRetriever

这是一个 SuperComponent,它将混合检索器集成到一个组件中,后端依赖于 OpenSearch 作为文档存储。

混合检索器结合了传统的基于关键字的搜索(如 BM25)和基于嵌入的搜索来检索文档,从而结合了两者的优点。检索器随后合并并重新排序这两种方法的结果。

pipeline 中的最常见位置需要一个 OpenSearchDocumentStore 实例
必需的初始化变量"document_store": 用于检索的 OpenSearchDocumentStore 实例OpenSearchDocumentStore 以供检索使用

"embedder": 任何实现了 Embedder 协议的 EmbedderTextEmbedder 协议
强制运行变量"query": 查询字符串
输出变量"documents": 与查询匹配的文档列表
API 参考OpenSearch
GitHubhttps://github.com/deepset-ai/haystack-core-integrations/tree/main/integrations/opensearch

概述

OpenSearchHybridRetriever 结合了两种检索方法

  1. BM25 检索:一种基于关键字的搜索,使用 BM25 算法根据词项频率和逆文档频率查找文档。它基于 OpenSearchBM25Retriever 组件,适用于传统的基于关键字的搜索。
  2. 基于嵌入的检索:一种语义搜索,使用向量相似性查找与查询语义相似的文档。它基于 OpenSearchEmbeddingRetriever 组件,适用于语义搜索。

该组件会自动处理

  • 使用提供的嵌入器将查询转换为嵌入,
  • 并行运行两种检索方法,
  • 使用指定的连接模式合并和重新排序结果。

设置与安装

pip install opensearch-haystack

可选参数

此检索器接受各种可选参数。您可以在我们的 API 参考 中验证最新的参数列表。

您可以使用bm25_retrieverembedding_retriever 字典将其他参数传递给底层组件。
DocumentJoiner 的所有参数都暴露在OpenSearchHybridRetriever 类中,因此您可以直接设置它们。

这是一个示例

retriever = OpenSearchHybridRetriever(
    document_store=document_store,
    embedder=embedder,
    bm25_retriever={"raise_on_failure": True},
    embedding_retriever={"raise_on_failure": False}
)

用法

单独使用

此检索器需要OpensearchDocumentStore 填充了文档才能运行。您不能单独使用它。

在 pipeline 中

以下是如何使用OpenSearchHybridRetriever:

您可以使用以下命令通过 Docker 本地运行 OpenSearch。请确保您已安装 Docker 并在机器上运行。请注意,此示例为简单起见禁用了安全插件。在生产环境中,应启用安全功能。

docker run -d \\
  --name opensearch-nosec \\
  -p 9200:9200 \\
  -p 9600:9600 \\
  -e "discovery.type=single-node" \\
  -e "DISABLE_SECURITY_PLUGIN=true" \\
  opensearchproject/opensearch:2.12.0
from haystack import Document
from haystack.components.embedders import SentenceTransformersTextEmbedder, SentenceTransformersDocumentEmbedder
from haystack_integrations.components.retrievers.opensearch import OpenSearchHybridRetriever
from haystack_integrations.document_stores.opensearch import OpenSearchDocumentStore

# Initialize the document store
doc_store = OpenSearchDocumentStore(
    hosts=["<https://:9200>"],
    index="document_store",
    embedding_dim=384,
)

# Create some sample documents
docs = [
    Document(content="Machine learning is a subset of artificial intelligence."),
    Document(content="Deep learning is a subset of machine learning."),
    Document(content="Natural language processing is a field of AI."),
    Document(content="Reinforcement learning is a type of machine learning."),
    Document(content="Supervised learning is a type of machine learning."),
]

# Embed the documents and add them to the document store
doc_embedder = SentenceTransformersDocumentEmbedder(model="sentence-transformers/all-MiniLM-L6-v2")
doc_embedder.warm_up()
docs = doc_embedder.run(docs)
doc_store.write_documents(docs['documents'])

# Initialize some haystack text embedder, in this case the SentenceTransformersTextEmbedder
embedder = SentenceTransformersTextEmbedder(model="sentence-transformers/all-MiniLM-L6-v2")

# Initialize the hybrid retriever
retriever = OpenSearchHybridRetriever(
    document_store=doc_store,
    embedder=embedder,
    top_k_bm25=3,
    top_k_embedding=3,
    join_mode="reciprocal_rank_fusion"
)

# Run the retriever
results = retriever.run(query="What is reinforcement learning?", filters_bm25=None, filters_embedding=None)

>> results['documents']
{'documents': [Document(id=..., content: 'Reinforcement learning is a type of machine learning.', score: 1.0),
  Document(id=..., content: 'Supervised learning is a type of machine learning.', score: 0.9760624679979518),
  Document(id=..., content: 'Deep learning is a subset of machine learning.', score: 0.4919354838709677),
  Document(id=..., content: 'Machine learning is a subset of artificial intelligence.', score: 0.4841269841269841)]}