如何使用EnsembleRetriever组合多个检索器的搜索结果

80 阅读2分钟
# 如何使用EnsembleRetriever组合多个检索器的搜索结果

在信息检索领域,单一的检索算法往往难以同时满足精确性和广泛性的需求。本文将介绍如何使用`EnsembleRetriever`进行多检索器的结果组合,通过不同算法的优势互补来提升检索性能。

## 引言

`EnsembleRetriever`支持合并多个检索器的结果,并基于互逆等级融合算法(Reciprocal Rank Fusion)对结果进行重新排序。常见的组合模式是将稀疏检索器(如BM25)与密集检索器(如嵌入相似度)结合使用,这种方法也被称为“混合搜索”。稀疏检索器擅长基于关键词查找相关文档,而密集检索器则在语义相似性方面表现优异。

## 主要内容

### EnsembleRetriever的基本用法

在下面的例子中,我们将演示如何将`BM25Retriever`与从`FAISS`向量存储派生的检索器进行组合。

```python
# 安装必要的包
%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})

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

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

运行时配置

我们可以在运行时通过可配置字段来调整个体检索器的参数。以下示例展示了如何更新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)

常见问题和解决方案

  • 访问稳定性:由于某些地区的网络限制,访问OpenAI的API可能会不稳定。建议使用API代理服务来提高访问的稳定性。
  • 参数调整:针对不同的数据集,可能需要对各检索器的权重和参数进行调整,以获得最佳效果。

总结和进一步学习资源

EnsembleRetriever能够通过结合多个检索器的优势来提供更全面的搜索结果。如果你对检索器集成和优化感兴趣,可以查阅以下资源:

参考资料

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


---END---