Skip to main content

集成检索器 Ensemble Retriever

EnsembleRetriever 接受一个检索器列表作为输入,并根据它们的 get_relevant_documents() 方法的结果进行集成,并根据Reciprocal Rank Fusion算法重新排序结果。

通过利用不同算法的优势,EnsembleRetriever 可以比任何单一算法实现更好的性能。

最常见的模式是将稀疏检索器(如BM25)与密集检索器(如嵌入相似度)结合起来,因为它们的优势是互补的。这也被称为“混合搜索”。稀疏检索器擅长基于关键词查找相关文档,而密集检索器擅长基于语义相似性查找相关文档。

from langchain.retrievers import BM25Retriever, EnsembleRetriever  
from langchain.vectorstores import FAISS

API 参考:

doc_list = [  
"我喜欢苹果",
"我喜欢橙子",
"苹果和橙子是水果",
]

# 初始化 BM25 检索器和 FAISS 检索器
bm25_retriever = BM25Retriever.from_texts(doc_list)
bm25_retriever.k = 2

embedding = OpenAIEmbeddings()
faiss_vectorstore = FAISS.from_texts(doc_list, embedding)
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.get_relevant_documents("苹果")
docs
[Document(page_content='我喜欢苹果', metadata={}),  
Document(page_content='苹果和橙子是水果', metadata={})]