跳到主要內容
Open In ColabOpen on GitHub

如何結合多個檢索器的結果

EnsembleRetriever 支援整合來自多個檢索器的結果。 它使用 BaseRetriever 物件的列表初始化。EnsembleRetriever 基於 Reciprocal Rank Fusion 演算法,重新排序組成檢索器的結果。

透過利用不同演算法的優勢,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",
]

# initialize the bm25 retriever and faiss retriever
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})

# initialize the ensemble retriever
ensemble_retriever = EnsembleRetriever(
retrievers=[bm25_retriever, faiss_retriever], weights=[0.5, 0.5]
)
docs = ensemble_retriever.invoke("apples")
docs
[Document(page_content='I like apples', metadata={'source': 1}),
Document(page_content='You like apples', metadata={'source': 2}),
Document(page_content='Apples and oranges are fruits', metadata={'source': 1}),
Document(page_content='You like oranges', metadata={'source': 2})]

運行時配置

我們也可以使用可配置欄位在運行時配置個別的檢索器。 下面我們專門更新 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]
)
API 參考:ConfigurableField
config = {"configurable": {"search_kwargs_faiss": {"k": 1}}}
docs = ensemble_retriever.invoke("apples", config=config)
docs
[Document(page_content='I like apples', metadata={'source': 1}),
Document(page_content='You like apples', metadata={'source': 2}),
Document(page_content='Apples and oranges are fruits', metadata={'source': 1})]

請注意,這僅從 FAISS 檢索器返回一個來源,因為我們在運行時傳遞了相關配置


此頁面是否對您有幫助?