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

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 来实现这一点。

除了queryquery_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
)