解锁RAG的关键:文档重排技术全解析
📖阅读时长:19分钟
🕙发布时间:2025-02-18
近日热文:全网最全的神经网络数学原理(代码和公式)直观解释
欢迎关注知乎和公众号的专栏内容
LLM架构专栏
知乎LLM专栏
知乎【柏企】
公众号【柏企科技说】【柏企阅文】
RAG的第一步是针对每个查询检索多个文档,但往往这些文档并非都与查询相关。因此,我们需要借助一些外部技术来优化检索结果。毕竟,搜索的强大与否,最终取决于其结果的相关性。
在应用向量搜索时,由于一些原因,丢失部分语义信息的情况时有发生。比如,文档需要被拆分成较小的子文档,这一过程就可能导致上下文信息的缺失。结果就是,RAG模型在有效连接多个检索文档的信息时,可能会遇到困难。
在RAG框架中引入了文档重排技术。其实,有多种方法可以对检索到的文档进行重新排序。
什么是文档重新排名
随着RAG领域的持续发展,重新排名在释放RAG全部潜力方面,已成为至关重要的一环。重新排名可不是简单地对检索结果进行重新整理,它是一个极具策略性的过程,能够显著提升呈现给用户信息的相关性、多样性和个性化程度。
通过利用额外的信号和启发式方法,RAG的重排阶段可以优化初始的文档检索,确保最相关、最有价值的数据排在前列。而且,重排支持迭代优化,逐步完善结果,让输出更加准确,与上下文的关联也更强。
重新排名文档
文档重排这一过程,会根据查询的上下文,对文档的优先级进行调整,优化检索结果。这样的优化能提升模型生成最终输出时所使用信息的整体质量和准确性。
使用Transformer重新排名
用Transformer模型进行文档重排的历史,甚至比RAG的出现还要早。2020年,研究人员就采用了预训练的(seq2seq)Transformer来进行文档重排。这个系统以文档作为输入,输出该文档是否与查询相关。在筛选出相关文档(即标记为“true”的文档)后,他们使用Softmax作为概率函数对这些文档进行重新排序。
注意:由于这些sequence-to-sequence模型原本也会返回一个序列,为了满足需求,它被修改为仅返回“true”或“false”。
使用LLM
如今,借助大语言模型(LLM)的强大能力来优化RAG的做法越来越普遍。
在一种方法中,研究人员利用GPT-3,通过纯粹的提示来进行排名,并将其命名为LRL(使用LLM的Listwise Reranker)。他们使用的提示非常简洁。
使用LLM重新排名
为了提高文档相关性判断的可信度,研究人员还针对分类使用了一种提示,并将其命名为PRL(Pointwise Reranker with an LLM)。
使用LLM重新排名
还有一种更具方法论的做法,就是利用LLaMA进行文档重排(RankLLaMA)。该方法对检索到的文档应用排名函数:
在应用重排函数之后,研究人员会使用InfoNCE损失进一步优化(我们之前在MoCo的对比学习中见到过这种方法) 。
使用交叉编码器
交叉编码器是另一种常用于文档重排的Transformer。从名字就能看出,交叉编码器会同时对查询和(每个)文档进行编码,其输出展示的是两者之间的交叉相似性或相关性。
使用Cross - encoders重新排名
显然,将每个文档都与查询进行交叉匹配并不现实。所以,我们会先筛选出一部分文档,从较小的文档池中进行交叉匹配。常用的预选方法有两种:
- 使用bi - encoder
- 使用稀疏搜索方法(如BM25)
甚至在被应用于RAG之前,交叉编码器就凭借更高的精度和更好的上下文理解能力,展现出比双编码器更优的性能。如今,它在RAG的文档重排中被广泛应用,也就不足为奇了。下面是使用HuggingFace和PyTorch的基本实现代码:
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
tokenizer = AutoTokenizer.from_pretrained("cross-encoder/ms-marco-TinyBERT-L-6")
model = AutoModelForSequenceClassification.from_pretrained("cross-encoder/ms-marco-TinyBERT-L-6")
def ReRank(query, documents):
scores = []
for doc in documents:
inputs = tokenizer(query, doc, return_tensors="pt", padding=True, truncation=True, max_length=512)
with torch.no_grad():
outputs = model(**inputs)
scores.append(outputs.logits.squeeze().item())
rankedDocs = [doc for _, doc in sorted(zip(scores, documents), reverse=True)]
return rankedDocs
对于示例查询,我们可以这样使用:
query = "Which month is most suitable to visit Bali?"
rankedDocs = ReRank(query, docs)
print(rankedDocs)
使用图形重新排名
如果你使用过Litmaps和Connected Papers,它们是语义关系图的优秀范例。在这些图中,文档用节点表示,节点之间的边则代表文档的语义关系。
Litmap和Connected Papers
构建好文档图后,我们会借助图神经网络(GNN)进行消息传递,根据相邻节点来更新节点特征。这样一来,模型就能从相关文档提供的上下文中学习,即便与查询的直接关联较弱,也能增强识别相关内容的能力。
抽象意义表示(AMR)
虽然文档图构建和消息传递机制对GNN用户来说并不陌生,但抽象意义表示(AMR)还是值得专门介绍一下。
AMR是句子的语义图表示,它以抽象的方式捕捉句子含义,重点关注表达的概念及其关系,而非句法细节。与自然语言的一般形式相比,AMR图包含更结构化的语义信息。在基于图的文档重排(用于检索增强生成,即RAG)中,AMR特别有用,因为它能将丰富的语义和结构信息融入重排过程。
G-RAG
最近,有一种利用AMR在RAG中进行重排的方法——G-RAG。在其设定中,研究人员构建AMR,选取前100个文档来构建文档图。与传统的交叉熵损失不同,G-RAG利用成对排名损失直接优化相关性排名,这与重排的目标更加契合。
MyScale的两阶段检索
MyScaleDB采用两阶段检索过程来优化信息检索,具体包括:
- 初始检索:运用向量搜索等方法,快速检索出大量可能相关的文档。向量搜索会基于数字表示(向量)查找相似文档。
- 重新排名:利用交叉编码器等先进技术,对检索到的文档进行优化和排名,确保根据用户查询呈现最相关的结果。
两阶段检索
这种两阶段检索的方式,将高效检索与精准排名相结合,帮助MyScaleDB提供更快、更准确的搜索结果。
使用MyScale和Cohere重新排名
最后,我们通过一个完整示例来结束今天的分享。在这个示例中,我们会使用MyScale向量数据库,在RAG流程中对文档进行重排。在嵌入环节,我们使用Cohere,当然,也可以选择OpenAI或BedRock等其他服务。
from langchain_community.vectorstores import MyScale, MyScaleSettings
from langchain_cohere import CohereEmbeddings
config = MyScaleSettings(host='host-name', port=443, username='your-user-name', password='your-passwd')
index = MyScale(CohereEmbeddings(), config)
接下来,我们要把文档添加到MyScale中。在添加之前,需要先加载并拆分文档:
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
documents = TextLoader("../file.txt").load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=100)
texts = text_splitter.split_documents(documents)
index.add_documents(texts)
正如我们前面提到的,在进行重排之前,需要先获取一个文档子集,所以我们这样操作:
retriever = index.as_retriever(search_kwargs={"k": 20})
query = "Which place on earth is farthest away from its centre?"
docs = retriever.invoke(query)
现在,一切准备就绪,可以进行重排了。我们将用Cohere初始化一个语言模型,用CohereRerank设置重排器,并在ContextualCompressionRetriever中把它与基础检索器结合起来。这样的设置可以对检索结果进行压缩和重排,根据上下文相关性优化输出。
from langchain.retrievers.contextual_compression import ContextualCompressionRetriever
from langchain_cohere import CohereRerank
from langchain_community.llms import Cohere
llm = Cohere(temperature=0)
compressor = CohereRerank()
compression_retriever = ContextualCompressionRetriever(
base_compressor=compressor, base_retriever=retriever
)
compressed_docs = compression_retriever.invoke(
"Your-query-here"
)
添加重排器之后,RAG系统的响应会更加精准,不仅能提升用户体验,还能减少使用的令牌数量。
引用
- Dong, J., Fatemi, B., Perozzi, B., Yang, L. F., & Tsitsulin, A. (2024). Don’t Forget to Connect! Improving RAG with Graph-based Reranking. ArXiv. https://arxiv.org/abs/2405.18414
- Nogueira, R., Jiang, Z., & Lin, J. (2020). Document Ranking with a Pretrained Sequence-to-Sequence Model. ArXiv. https://arxiv.org/abs/2003.06713
Dengrong Huang, Zizhong Wei, Aizhen Yue, Xuan Zhao, Zhaoliang Chen, Rui Li, Kai Jiang, Bingxin Chang, Qilai Zhang, Sijia Zhang, et al. Dsqa-llm: Domain-specific intelligent question answering based on large language model. In International Conference on AI-generated Content, pages 170–180. Springer, 2023. - Xueguang Ma, Xinyu Zhang, Ronak Pradeep, and Jimmy Lin. Zero-shot listwise document reranking with a large language model. arXiv preprint arXiv:2305.02156, 2023
- Xueguang Ma, Liang Wang, Nan Yang, Furu Wei, and Jimmy Lin. Fine-tuning llama for multi-stage text retrieval. arXiv preprint arXiv:2310.08319, 2023.
- Lewis, P., Perez, E., Piktus, A., Petroni, F., Karpukhin, V., Goyal, N., Küttler, H., Lewis, M., Yih, W., Rocktäschel, T., Riedel, S., & Kiela, D. (2020). Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks. NeurIPS. https://arxiv.org/abs/2005.11401
- Zhang, L., Zhang, Y., Long, D., Xie, P., Zhang, M., & Zhang, M. (2023). A Two-Stage Adaptation of Large Language Models for Text Ranking. ArXiv. https://arxiv.org/abs/2311.16720
Cunxiang Wang, Zhikun Xu, Qipeng Guo, Xiangkun Hu, Xuefeng Bai, Zheng Zhang, and Yue Zhang. Exploiting Abstract Meaning Representation for open-domain question answering. In Anna Rogers, Jordan Boyd-Graber, and Naoaki Okazaki, editors, Findings of the Association for Computational Linguistics: ACL 2023, pages 2083–2096, Toronto, Canada, July 2023b. Association for Computational Linguistics. doi: 10.18653/v1/2023.findings-acl.131.
## 推荐阅读
1. DeepSeek-R1的顿悟时刻是如何出现的? 背后的数学原理
2. 微调 DeepSeek LLM:使用监督微调(SFT)与 Hugging Face 数据
3. 使用 DeepSeek-R1 等推理模型将 RAG 转换为 RAT
4. DeepSeek R1:了解GRPO和多阶段训练
5. 深度探索:DeepSeek-R1 如何从零开始训练
6. DeepSeek 发布 Janus Pro 7B 多模态模型,免费又强大!
本文由mdnice多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。