深入探讨LOTR:如何利用Merger Retriever提升文档检索的准确性

150 阅读3分钟

引言

在现代信息检索领域,多检索器合并技术正在成为提升文档检索准确性的重要手段。其中,Lord of the Retrievers (LOTR),又称Merger Retriever,是一种能够将多个检索器的结果合并为一个文档列表的技术。本文将探讨LOTR如何通过整合多个检索器的结果来减少偏差并确保最相关文档的优先呈现。

主要内容

1. 什么是Merger Retriever?

Merger Retriever通过合并不同检索器的输出,增强了文档检索的准确性。它不仅减轻了单一检索器可能带来的偏差,还通过排序确保最相关的文档优先返回。

2. 使用不同的嵌入技术

在实现Merger Retriever时,可以利用不同的嵌入模型,如HuggingFaceEmbeddingsOpenAIEmbeddings,从而为不同类型的文档检索器提供更丰富的语义信息。

3. 去除冗余和克服偏差

通过应用嵌入冗余过滤器,我们可以去除多检索器合并后的重复文档。此外,使用嵌入聚类过滤器可以根据文档的语义聚类从而选择最具代表性的文档。

4. 性能优化

在处理超过10个文档的检索时,性能往往会下降。本文介绍了一种通过文档重排序来优化性能的方法,避免长上下文中信息丢失。

代码示例

import os
import chromadb
from langchain.retrievers import (
    ContextualCompressionRetriever,
    DocumentCompressorPipeline,
    MergerRetriever,
)
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
from langchain_community.document_transformers import (
    EmbeddingsClusteringFilter,
    EmbeddingsRedundantFilter,
    LongContextReorder,
)

# 获取不同的嵌入模型
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}
)

# 使用Merger Retriever合并结果
lotr = MergerRetriever(retrievers=[retriever_all, retriever_multi_qa])

# 通过去除冗余和重新排序提高性能
filter = EmbeddingsRedundantFilter(embeddings=filter_embeddings)
reordering = LongContextReorder()
pipeline = DocumentCompressorPipeline(transformers=[filter, reordering])
compression_retriever_reordered = ContextualCompressionRetriever(
    base_compressor=pipeline, base_retriever=lotr
)

常见问题和解决方案

问题1: 多检索器合并可能导致结果冗余。

  • 解决方案: 使用EmbeddingsRedundantFilter减少重复结果。

问题2: 检索超过10个文档时性能下降。

  • 解决方案: 使用LongContextReorder优化文档排序。

总结和进一步学习资源

通过LOTR和其他嵌入过滤器的结合,开发者可以显著提高文档检索的准确性和效率。对于想要进一步探索的读者,建议查阅以下资源:

参考资料

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

---END---