合力共赢:利用Ensemble Retriever结合多重检索器的强大搜索能力

82 阅读3分钟

引言

在信息检索的世界中,如何更有效地获取高相关性的结果一直是一个热门话题。尽管单一算法有其优势,但它们往往不能满足所有需求。这时,使用组合的方法可大幅提高表现。本文将探讨如何使用Ensemble Retriever结合多种检索器,通过Reciprocal Rank Fusion算法提高检索结果的相关性和准确性。

主要内容

1. 合作的力量:为什么使用Ensemble Retriever

Ensemble Retriever通过组合不同的检索算法,利用不同算法的长处,如关键字匹配的稀疏检索器(BM25)和语义相似度的密集检索器(如基于嵌入的检索),来实现更佳的性能。这种技术通常被称为“混合搜索”。

2. 基础用法

在基本使用中,我们将展示如何组合BM25检索器和FAISS向量存储派生的检索器。

# 使用API代理服务提高访问稳定性
%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})

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

docs = ensemble_retriever.invoke("apples")
print(docs)

3. 运行时配置

Ensemble Retriever允许在运行时配置个别检索器的参数。例如,我们可以调整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)

常见问题和解决方案

问题1:为什么需要使用Ensemble Retriever? 在信息检索中,不同算法有其各自的优势和局限。组合多种算法,可以更大范围地覆盖文档特征,提供更准确的检索结果。

问题2:如果网络不佳如何提高API访问的稳定性? 在某些地区,由于网络限制,开发者可能需要考虑使用API代理服务,以提高访问的稳定性和速度。

总结和进一步学习资源

Ensemble Retriever通过集成不同的检索算法,提高了搜索结果的相关性。这种组合不仅有助于知识丰富的检索,还能在多种场景下提供更好的用户体验。想要深入了解更多相关技术,建议查阅以下资源:

  • "Introduction to Information Retrieval" by Manning, Raghavan, and Schütze
  • LangChain Documentation: www.langchain.com/docs

参考资料

  • EnsembleRetriever API Documentation
  • BM25Retriever API Documentation
  • FAISS API Documentation
  • OpenAIEmbeddings API Documentation

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