超越“中间遗忘”:优化检索顺序提升AI应用性能

162 阅读3分钟

引言

在构建基于检索增强生成(RAG)的应用程序时,一个常见的问题是“中间遗忘效应”。随着所检索文档的数量增加(如超过十个),模型可能会忽略在长上下文中间的相关信息。这种现象导致性能的显著下降。本文将探讨一种缓解这种问题的解决方案,即重排序检索结果,使最相关的文档置于上下文的两端。

主要内容

1. 什么是“中间遗忘效应”?

在长文本序列中,尤其是当检索的文档超过一定数量时,模型通常会对位于序列中段的信息关注不够。这一效应在RAG应用中尤其明显,因为这些应用依赖于从文档中提取信息进行生成。

2. 重排序的原理

为解决该问题,我们可以在检索后对文档进行重排序,将最相关的文档置于序列的开头和结尾,将不太相关的文档置于中间。这样可以让模型更容易获取关键信息而不受“中间遗忘效应”的影响。

3. 实施重排序

这里我们使用LongContextReorder文档转换器实现这种重排序策略。此工具在LangChain库中提供,旨在调整文档顺序以优化模型的上下文解析。

代码示例

以下是一个基于LangChain实现的完整示例:

# 安装所需库
%pip install --upgrade --quiet sentence-transformers langchain-chroma langchain langchain-openai langchain-huggingface > /dev/null

from langchain_chroma import Chroma
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_community.document_transformers import LongContextReorder
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import PromptTemplate
from langchain_openai import OpenAI

# 获取嵌入
embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")

texts = [
    "Basquetball is a great sport.",
    "Fly me to the moon is one of my favourite songs.",
    "The Celtics are my favourite team.",
    "This is a document about the Boston Celtics",
    "I simply love going to the movies",
    "The Boston Celtics won the game by 20 points",
    "This is just a random text.",
    "Elden Ring is one of the best games in the last 15 years.",
    "L. Kornet is one of the best Celtics players.",
    "Larry Bird was an iconic NBA player.",
]

# 创建检索器
retriever = Chroma.from_texts(texts, embedding=embeddings).as_retriever(
    search_kwargs={"k": 10}
)
query = "What can you tell me about the Celtics?"

# 获取按相关性排序的文档
docs = retriever.invoke(query)

# 使用LongContextReorder进行重排序
reordering = LongContextReorder()
reordered_docs = reordering.transform_documents(docs)

# 使用重排序后的文档进行问答
llm = OpenAI()
prompt_template = """
Given these texts:
-----
{context}
-----
Please answer the following question:
{query}
"""
prompt = PromptTemplate(template=prompt_template, input_variables=["context", "query"])
chain = create_stuff_documents_chain(llm, prompt)
response = chain.invoke({"context": reordered_docs, "query": query})
print(response)
# 使用API代理服务提高访问稳定性

常见问题和解决方案

  1. 为何会出现“中间遗忘效应”?

    • 模型在处理长文本时,注意力机制的局限性会导致对中段信息关注不够。这是自然语言处理中的一个普遍问题。
  2. 如何调整排序策略?

    • 可以根据具体业务需求更改排序策略,通过实验找到最佳的排序规则。
  3. API访问不稳定怎么办?

    • 由于某些地区的网络限制,建议考虑使用API代理服务提高访问的稳定性。

总结和进一步学习资源

重排序是提高AI系统性能的简单而有效的手段之一。通过在上下文的两端放置最相关的文档,可以显著提高信息提取的精确性。进一步的学习可以参考以下资源:

参考资料

  • LangChain: A framework for building generative language models
  • Hugging Face: An open-source platform for NLP models
  • Sentence Transformers: Effective embeddings for sentence-based text

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

---END---