优化长文本检索:如何通过重新排序消除“中间丢失”效应
在基于检索增强生成(RAG)的应用中,随着检索到的文档数量的增长,系统性能可能会显著下降,尤其是在超过十个文档时。这种现象被称为“中间丢失”效应。与之相反的是,向量检索通常会返回按相关性降序排列的文档(例如,通过嵌入的余弦相似度进行测量)。为了缓解这种效应,可以在检索后重新排序文档,使最相关的文档位于前后(例如,第一个和最后一个),而最不相关的文档位于中间。
本篇文章将讨论如何实施这种文档重新排序以优化信息检索的效果。
核心内容
向量检索与文档排序
向量检索系统,如Chroma,可以根据嵌入向量之间的相似度,对文档进行排序。然而,即便相关性高的文档可能会出现在列表的中间,导致重要信息在长上下文中被忽略。
实施重新排序
通过使用 LongContextReorder
文档转换器,我们可以重新排布文档,使最相关的部分在上下文的开头和结尾展示,这可以帮助语言模型(LLM)更好地解析和生成结果。
代码示例
在这一节,我们将展示如何使用长上下文重新排序来改进信息检索。下面是一个具体的代码示例,演示如何对从Chroma向量存储中检索的文档进行重新排序。
# 导入相关的库
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)
# 重新排序文档
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代理服务来提高访问稳定性。
-
嵌入模型选择困难: Hugging Face 提供了多种嵌入模型,选择合适的模型可以极大地影响结果。在开始时可以尝试多个模型,选择最符合需求的。
总结和进一步学习资源
通过使用 LongContextReorder
,我们可以有效地提升语言模型处理长文本的能力,将最相关的信息暴露给模型,以获得更好的生成效果。对于希望深入了解此技术的开发者,可以参考以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!