WeaviateHybridRetriever
一个检索器,它结合了 BM25 关键字搜索和向量相似性来从 Weaviate Document Store 中获取文档。
| pipeline 中的最常见位置 | 1. 在 RAG 管道的 Text Embedder 之后,PromptBuilder 之前 2. 混合搜索管道中的最后一个组件 3. 在提取式 QA 管道的 Text Embedder 之后,ExtractiveReader 之前 |
| 必需的初始化变量 | "document_store": WeaviateDocumentStore 的一个实例 |
| 强制运行变量 | "query": 一个字符串 "query_embedding": 浮点数列表 |
| 输出变量 | "documents": 文档列表(与查询匹配) |
| API 参考 | Weaviate |
| GitHub 链接 | https://github.com/deepset-ai/haystack-core-integrations/tree/main/integrations/weaviate |
概述
该WeaviateHybridRetriever 结合了基于关键字(BM25)和向量相似性搜索,从 WeaviateDocumentStore 中获取文档。Weaviate 并行执行这两种搜索,并将结果融合为单一的排名列表。检索器需要文本查询及其对应的嵌入。
该alpha 参数控制每种搜索方法对最终结果的贡献程度
alpha = 0.0: 只使用关键字(BM25)评分,alpha = 1.0: 只使用向量相似性评分,- 介于两者之间的值混合了这两种方法;较高的值倾向于向量评分,较低的值倾向于 BM25。
如果您不指定alpha,将使用 Weaviate 服务器的默认值。
您还可以使用max_vector_distance 参数为向量分量设置一个阈值。距离大于此阈值的候选者将在融合之前被排除在向量部分之外。
有关混合搜索参数的更多详细信息,请参阅 官方 Weaviate 文档。
参数
使用运行 WeaviateHybridRetriever,您需要同时提供查询文本及其嵌入。您可以通过向查询管道添加 Text Embedder 来实现这一点。
除了query 和query_embedding 之外,检索器还接受可选参数,包括top_k(要返回的最大文档数),filters 用于缩小搜索范围,以及filter_policy 来确定如何应用过滤器。
用法
安装
要开始使用 Haystack 的 Weaviate,请使用以下命令安装该包:
pip install weaviate-haystack
单独使用
此 Retriever 需要一个 WeaviateDocumentStore 实例和已索引的文档才能运行。WeaviateDocumentStore 和已索引的文档才能运行。
from haystack_integrations.document_stores.weaviate.document_store import WeaviateDocumentStore
from haystack_integrations.components.retrievers.weaviate import WeaviateHybridRetriever
document_store = WeaviateDocumentStore(url="https://:8080")
retriever = WeaviateHybridRetriever(document_store=document_store)
# using a fake vector to keep the example simple
retriever.run(query="How many languages are there?", query_embedding=[0.1]*768)
在 pipeline 中
from haystack.document_stores.types import DuplicatePolicy
from haystack import Document
from haystack import Pipeline
from haystack.components.embedders import (
SentenceTransformersTextEmbedder,
SentenceTransformersDocumentEmbedder,
)
from haystack_integrations.document_stores.weaviate.document_store import (
WeaviateDocumentStore,
)
from haystack_integrations.components.retrievers.weaviate import (
WeaviateHybridRetriever,
)
document_store = WeaviateDocumentStore(url="https://:8080")
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()
document_embedder.warm_up()
documents_with_embeddings = document_embedder.run(documents)
document_store.write_documents(
documents_with_embeddings.get("documents"), policy=DuplicatePolicy.OVERWRITE
)
query_pipeline = Pipeline()
query_pipeline.add_component("text_embedder", SentenceTransformersTextEmbedder())
query_pipeline.add_component(
"retriever", WeaviateHybridRetriever(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},
"retriever": {"query": query}
}
)
print(result["retriever"]["documents"][0])
调整 Alpha 参数
您可以设置在初始化时设置 alpha 参数,或者在查询时覆盖它
from haystack_integrations.components.retrievers.weaviate import WeaviateHybridRetriever
# Favor keyword search (good for exact matches)
retriever_keyword_heavy = WeaviateHybridRetriever(
document_store=document_store,
alpha=0.25
)
# Balanced hybrid search
retriever_balanced = WeaviateHybridRetriever(
document_store=document_store,
alpha=0.5
)
# Favor vector search (good for semantic similarity)
retriever_vector_heavy = WeaviateHybridRetriever(
document_store=document_store,
alpha=0.75
)
# Override alpha at query time
result = retriever_balanced.run(
query="artificial intelligence",
query_embedding=embedding,
alpha=0.8
)
更新于 4 天前
