集成检索器 Ensemble Retriever
EnsembleRetriever
接受一个检索器列表作为输入,并根据它们的 get_relevant_documents()
方法的结果进行集成,并根据Reciprocal Rank Fusion算法重新排序结果。
通过利用不同算法的优势,EnsembleRetriever
可以比任何单一算法实现更好的性能。
最常见的模式是将稀疏检索器(如BM25)与密集检索器(如嵌入相似度)结合起来,因为它们的优势是互补的。这也被称为“混合搜索”。稀疏检索器擅长基于关键词查找相关文档,而密集检索器擅长基于语义相似性查找相关文档。
from langchain.retrievers import BM25Retriever, EnsembleRetriever
from langchain.vectorstores import FAISS
API 参考:
- BM25Retriever 来自
langchain.retrievers
- EnsembleRetriever 来自
langchain.retrievers
- FAISS 来自
langchain.vectorstores
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={})]