探索多检索器结果组合:实现优化的混合搜索

97 阅读2分钟

引言

在信息检索领域,结合多个检索器的结果往往能带来更优的性能。使用 EnsembleRetriever 可以对多个基础检索器的结果进行重排序,从而实现更高效的检索,这一过程通常被称为“混合搜索”。本文将介绍如何结合稀疏检索器(如BM25)和密集检索器(如嵌入相似性),以便更有效地找到相关文档。

主要内容

多检索器成效

不同检索器各有其优势,稀疏检索器擅长基于关键词找到相关文档,而密集检索器则在语义相似性方面表现出色。通过结合这两种类型的检索器,我们能够实现更全面的文档检索。

基本用法

我们将展示如何将 BM25Retriever 与从 FAISS 向量存储派生的检索器进行组合。

# 使用API代理服务提高访问稳定性
%pip install --upgrade --quiet rank_bm25 > /dev/null

from langchain.retrievers import EnsembleRetriever
from langchain_community.retrievers import BM25Retriever
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings

doc_list_1 = [
    "I like apples",
    "I like oranges",
    "Apples and oranges are fruits",
]

# 初始化 bm25 检索器和 faiss 检索器
bm25_retriever = BM25Retriever.from_texts(
    doc_list_1, metadatas=[{"source": 1}] * len(doc_list_1)
)
bm25_retriever.k = 2

doc_list_2 = [
    "You like apples",
    "You like oranges",
]

embedding = OpenAIEmbeddings()
faiss_vectorstore = FAISS.from_texts(
    doc_list_2, embedding, metadatas=[{"source": 2}] * len(doc_list_2)
)
faiss_retriever = faiss_vectorstore.as_retriever(search_kwargs={"k": 2})

# 初始化集成检索器
ensemble_retriever = EnsembleRetriever(
    retrievers=[bm25_retriever, faiss_retriever], weights=[0.5, 0.5]
)

docs = ensemble_retriever.invoke("apples")
docs

常见问题和解决方案

检索器配置

有时需要在运行时配置个别检索器,例如更改 FAISS 检索器的参数:

from langchain_core.runnables import ConfigurableField

faiss_retriever = faiss_vectorstore.as_retriever(
    search_kwargs={"k": 2}
).configurable_fields(
    search_kwargs=ConfigurableField(
        id="search_kwargs_faiss",
        name="Search Kwargs",
        description="The search kwargs to use",
    )
)

ensemble_retriever = EnsembleRetriever(
    retrievers=[bm25_retriever, faiss_retriever], weights=[0.5, 0.5]
)

config = {"configurable": {"search_kwargs_faiss": {"k": 1}}}
docs = ensemble_retriever.invoke("apples", config=config)
docs

在上述示例中,通过配置仅返回一个来自 FAISS 检索器的结果。

总结和进一步学习资源

通过结合多种检索器的结果,我们可以在信息检索中获得更佳的效果。了解不同检索器的能力,以及如何根据需要进行配置,是提升检索质量的重要手段。

进一步的学习资源:

参考资料

  • Langchain 官方文档
  • OpenAI Embeddings 文档
  • Faiss 向量存储指南

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---