集成检索器 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={})]  
