检索增强微调(RAFT)深度解析:原理、对比与应用
先说说几个核心判断。把大语言模型真正用起来的时候,往往需要往模型里塞新东西——比如某个垂直领域的专业知识、公司内部的私有数据。这事儿一般靠两条路:要么用检索增强生成(RAG)搭桥,要么直接做微调。但问题来了,哪种方式能把知识喂得最到位?
这里要介绍一个有意思的思路——检索增强微调(RAFT)。它的设计极其干脆:用微调的方式,让模型在一个“开卷考试”的设定下,回答特定领域的问题时表现得更好。所谓“开卷”,就是模型回答问题时可以翻阅给定的文档。RAFT怎么做的?核心是教会模型一件事——眼里有活,心里有数。具体来说,就是当检索系统拉回来一堆文档时,模型得能识别哪些文档是正解来源,哪些是干扰项,然后只盯住有用的那部分信息。此外,RAFT还在回答里加入了思维链(Chain-of-Thought)式的推理,进一步强化模型的逻辑推演能力。实验结果很明确:在PubMed、HotpotQA、Gorilla这些跨领域的数据集上,只要把RAFT用到领域特定的RAG场景里,效果都有显著提升。可以说,它为预训练模型提供了一种相当有价值的后期训练增强手段。
RAFT的基础是早前的Retriever Aware Training(RAT),但它把这件事推广到了API之外更广泛的RAG应用中。
打个比方:怎么给LLM准备“考试”?
RAFT本质上是一种通用的微调方法,目的是把预训练模型调教得适应某个特定领域的RAG场景。这种场景现在很常见——你希望模型基于一堆文档来回答问题,比如企业内部的各种文件。这跟一般意义上的RAG有个关键区别:在通用RAG里,模型不知道考官会考哪个领域的题;但在RAFT的场景里,领域是已知的。为了让理解更直观,我们用考试来打个比方。
封闭书本考试: 这个好理解,就好比模型在考场上不能翻任何参考资料。LLM作为聊天机器人运行时,底层的逻辑就是这个——全靠预训练和监督微调阶段内化到参数里的知识来作答。
开放书本考试: 这就类比模型可以翻书或者上网查资料了。通常情况下,模型旁边会配一个检索器,检索器拉回来k个文档(或者文档片段),塞进用户的提示词里。模型只能通过这堆文档来获取新知识。所以,模型在这种设置下表现好不好,很大程度上取决于检索器给不给力——它能多准地找出最相关的信息片段。
RAFT: 它专注的领域比一般的开放书本考试更具体,也更实际,我们叫它特定领域开放书本考试。也就是说,模型提前就知道要在哪个领域里做题,并且可以随意调取这个领域内的所有资料来回答。比如企业文档、最新新闻、某个组织的代码库等,都属于这类场景。在这些场景下,答案都能从一组预定义的文档里找到。检索技术本身对机制影响不大(当然会影响准确率)。RAFT的核心研究目标,就是怎么让预训练模型适应这个特定的领域,并让模型在面对检索到的文档和干扰项的数量变化时,依然保持稳定。
(图示:RAFT类比于开放书本 如何为LLM准备考试?封闭书本 vs. 开放书本 vs. RAFT)
RAFT:把语言模型调教成领域RAG专家
检索感知微调(RAFT)提出了一套全新的微调数据准备方案,让模型在特定领域开卷考试(其实就是领域RAG)中发挥更好。在RAFT里,训练数据的组织方式是这样的:每个数据点包含一个问题(Q)、一组文档(Dk),以及从其中一个文档(D*)生成的思维链式答案(A*)。关键来了,这里要把文档分成两类:一类是“金文档”(Oracle Document,D*),即能推导出答案的那个;另一类是“干扰文档”(Di),跟答案毫无关系。注意,金文档不一定是单个文档,像HotpotQA这种数据集里,答案可能分散在多个文档里。
然后,对于数据集里P%的问题(qi),保留金文档(di*)再加上k-1个干扰文档;对于剩下(1-P)%的问题,则故意不保留金文档,只塞干扰文档。最后用标准的监督微调(SFT)技术,训练模型根据这些文档和问题来生成答案。下面这个示意图展示了RAFT的整体设计思路:
RAFT的训练数据格式可以概括为:
- P%的数据: Q + D* + D1 + D2 + ... + Dk → A*
- (1-P)%的数据: Q + D1 + D2 + ... + Dk → A*
(图示:RAFT的数据训练和测试配置)
再来看一个具体的训练数据示例,里面包含了问题、上下文、指令以及最终的思维链式答案。值得注意的是,答案中用了##begin_quote##和##end_quote##这种标记,直接把从上下文里引用的部分圈出来。实践证明,这种方式能有效防止模型胡编乱造,全部信息都紧扣提供的上下文。
RAFT的评估效果
实验选用了多个跨领域的数据集来评估模型和所有基线方法,覆盖范围从通用知识到专业领域都有:
- 自然问答(NQ)、Trivia QA、Hotpot QA: 基于维基百科的开放领域问题,主要考察常识(比如电影、体育等)。
- HuggingFace、Torch Hub、TensorFlow Hub: 来自Gorilla论文提出的APIBench,重点看模型能否根据文档生成正确的功能性API调用。
- PubMed QA: 专攻生物医学研究领域的问答,测试模型在医学和生物学问题上基于给定文档集的作答能力。
实验对比了以下基线方法:
- LlaMA2-7B-chat模型 + 0-shot提示: 标准指令微调模型,没有参考文档。
- LlaMA2-7B-chat模型 + RAG(Llama2 + RAG): 加了参考上下文,这是当前处理领域特定问答任务最常见的一招。
- 领域特定微调(DSF) + 0-shot提示: 先在上下文中做标准指令微调,但不给文档。
- 领域特定微调(DSF + RAG): 用RAG给领域微调模型外设知识,解决模型本身不知道的信息。
(图示:RAFT在医学(PubMed)、通用知识(HotPotQA)和API(Gorilla)基准上的结果)
自己动手训练RAFT模型
下面是一份简短的实战指南,帮你从零开始训练一个适用于RAG场景的RAFT模型。
1. 数据集准备: 数据集需要包含问题、上下文和答案三个部分。上下文是一组文档,答案是借助GPT-4从其中一个文档生成的思维链式答案。下面是个参考样例:
2. 模型微调: 训练的目标是让模型根据问题和给定的上下文,输出思维链式答案。这里选用Llama2-7B作为基座模型,它本身具备不错的推理能力、语言理解能力、低延迟推理性能,而且适配性好。对于通用知识问答场景,Llama2-7B表现扎实;再加上4k的预训练长度,解析较长的文档也游刃有余。更实用的是,这个模型规模在4块A100-40G GPU上就能完成训练,单块GPU就能提供服务,在性能、部署便捷性和许可证合规性之间找到了很好的平衡点。如果你感兴趣,借助Microsoft AI Studio也可以尝试Llama-13b或70b等更大模型。下图展示了在Azure AI Studio上进行模型微调时的界面。
3. 模型部署: 训练完成后,你可以自由选择部署方式——既可以部署到你自己的GPU上,也可以通过llama.cpp跑在CPU上;另一个选择是托管在Microsoft AI Studio上。下图演示了在Azure AI Studio上完成模型部署的流程。不得不说,Meta Llama-2和Microsoft AI Studio的配合,大大降低了企业级微调和部署LLM的门槛,为不同业务场景定制模型变得前所未有的便捷。
结论
RAFT是一种目标明确的训练策略,专门用来增强模型在特定领域内以“开卷”方式回答问题的能力。它提供了一套完整的微调配方,适合基于选定文档集合的问答任务。几个关键的设计决策值得关注:让模型跟干扰文档一起训练;在部分训练数据中刻意拿掉金文档;要求模型以思维链方式从相关文本中直接引用原文来组织答案。PubMed、Hotpot QA和Gorilla API Bench上的评估结果,充分展示了RAFT的巨大潜力。可以预见,领域内检索增强生成(RAG)将同时成为工业和学术界持续关注的热点。与通用RAG不同,这项工作解决的是LLM在真实业务场景中利用领域知识回答问题的痛点。研究结果也印证了一个趋势:相比于一味追求更大的通用模型,经过精细化微调的更小模型,在特定领域的问答任务上丝毫不逊色。



