到目前为止,本系列讲的检索流水线都是开环的:路由器决定检索几次、检索什么,生成模型闷头把答案写完。这条流水线有两个天然短板:简单问题被过度服务(「你好」也过一遍检索,《查询路由》用分流缓解了一部分);复杂问题被服务不足(一次检索拿回的材料不够,模型硬答,答案含糊)。《查询路由》的逃生门思想再往前走一步,就是这篇的主题:让生成模型参与检索决策,边写边判断「我还需不需要材料」——Self-RAG(Asai 等人,2023)与 CRAG(Yan 等人,2024)代表的自适应检索范式。

Self-RAG 的四个反思动作
Self-RAG 原论文训练了一个能输出特殊「反思 token」的模型,让它一边生成一边自评。抛开训练细节,它的决策逻辑可以归纳为四个动作,每个动作都对应流水线上的一个闸门:
动作一:要不要检索(Retrieve on demand)。 模型评估当前问题(或当前写答案写到一半的位置):这个问题靠参数知识能不能答?闲聊、常识、创作类直接写;事实、数据、政策类触发检索。它把《查询路由》的分流逻辑从「独立路由器」搬进了生成模型内部——判断时机更晚、上下文更全(模型知道自己写到哪了、缺什么)。
动作二:这段材料相关吗(Is relevant)。 检索回来的每个片段,先让模型判断与当前问题的相关性,无关片段直接丢弃——相当于把 reranker 的语义精排换成了生成模型自己的判断。
动作三:答案被支撑了吗(Is supported)。 生成过程中(或句子级)检查:我写的这句话,上下文里有证据吗?没有被支撑的句子是幻觉的直接信号。
动作四:这个答案有用吗(Is useful)。 整体评估答案对用户问题的帮助度,多个候选答案之间可以按「支撑度 × 有用度」择优。
原论文用的是专门微调的模型输出这些判断;但工程上不必如此——任何一个够强的指令模型,用 prompt 就能让它执行这四个动作,这正是 Self-RAG 思想能在产品里铺开的原因。
CRAG:先评估检索质量,不行就换路子
CRAG(Corrective RAG)把注意力放在另一个环节:检索结果本身不行怎么办。它的流程是一个轻量的「评估-纠偏」环:一个轻量评估器(可微调的小模型,也可用 LLM prompt)给检索文档打三档分——正确 / 错误 / 存疑。正确:进入精排后生成;错误:放弃这批检索结果,改写查询重新检索(或转向外部搜索);存疑:双路都走,合并知识。
CRAG 修正的是 RAG 的一个经典失败模式:检索层自信地返回了 top-k,但全是「语义沾边、事实无关」的内容,生成模型被噪声带偏后一本正经地胡说。传统流水线里没有人对「检索质量」负责——reranker 排得再好,候选池整体跑偏它也无能为力。CRAG 补的就是这个 accountability:检索质量有个守门员,不合格就重试。
轻量工程实现:prompt 层就够起步
两个范式都不需要训练模型,一个循环就能搭出可用的版本:
def adaptive_answer(question, retriever, llm, max_rounds=2):
docs = retriever.search(question, top_k=5)
for round_i in range(max_rounds):
verdict = llm.json(f"判断这些检索结果能否回答问题:\n{docs}\n"
f"问题:{question}\n"
'输出 {"usable": true/false, "reason": "..."}')
if verdict["usable"]:
break
new_q = llm.text(f"检索结果不理想。基于失败原因 {verdict['reason']}"
f"改写一个更好的检索查询(原查询:{question})")
docs = retriever.search(new_q, top_k=5) # 换个问法再试
answer = llm.text(f"仅依据以下材料回答,材料不足就明说:\n{docs}\n问题:{question}")
check = llm.json(f"答案的每个关键论断在材料中有依据吗:\n{answer}\n{docs}"
f'输出 {{"grounded": true/false, "missing": [...]}}')
return answer, check # grounded=false 转拒答流程
这个骨架里,usable 判断就是 CRAG 的守门员,grounded 校验就是 Self-RAG 的「被支撑」动作,《拒答与校验》的流程在末尾接上。注意 max_rounds 必须设上限——自适应检索最大的工程风险是循环失控:检索不行→改写→再检索→还不行……延迟和成本指数发散。
判断器的质量决定闭环的上限
自适应检索有个隐含假设值得单独拎出来:「判断」本身要可靠。usable 判断错了(把好材料判成废料),系统会误触发改写重检索,白烧一轮;grounded 判断错了(把无据论断判成有据),带病答案照样出街——闭环的守门员自己失明,整个机制形同虚设。判断器的质量要单独评测:拿一组人工标注的「材料-问题可用性」与「答案-材料支撑性」样本(各三五十条),量判断器的一致率;低于八成就先升级判断器(换更强模型、改判断 prompt、拆分成更细的判断题),再谈上线闭环。另一个实用技巧:判断题要单题化——「这五条材料里哪几条可用」的组合判断容易漏,「这一条可用吗」逐条问的准确率显著更高,代价是调用数增加,用小模型摊平成本。
与路由/改写的职责边界
自适应检索上线后,职责边界容易和前几篇的工具打架,划界原则一句话:路由管「大方向」,改写管「表述」,自适应管「质量兜底」。查询路由(《查询路由》)在入口决定要不要检索、走哪条通道——它是便宜的、一次性的、规则可解释的;查询改写管措辞层面的转换(多轮指代消解、口语转关键词);自适应机制不做入口决策(那已经有便宜的层干了),只在生成过程中做质量判断与补救。反例要避免:把「要不要检索」也交给生成过程中的反思判断、让路由层形同虚设——每次判断都是一次 LLM 调用,本可以毫秒级规则拦掉的闲聊流量全进反思环节,成本曲线立刻难看。层次分明,各层做各层的活,是这套体系能跑在合理预算上的前提。
渐进启用:不是全量开关
自适应检索对存量系统是个「渐进组件」,按查询难度分层启用比一刀切务实。第一档(先全量):grounded 校验——它在生成之后,不增加检索轮次,只增加一次轻量判断,对所有流量开放,收益立竿见影(幻觉出街率下降)。第二档(抽样或高价值流量):CRAG 式的检索质量守门——对「负反馈高发的查询类型」或「VIP 场景」启用,观察改写重检索的实际增益再决定扩面。第三档(疑难专属):多轮反思迭代(检索→判→再检索的循环)只对被前两档判定「棘手」的查询开放,且 max_rounds=1 起步——循环是成本黑洞,能用单轮补救解决的绝不开第二轮。三档渐进的好处是每一步的边际成本都可观测,坏处没有——它不会比一刀切更贵。
成本账:什么时候值得开
自适应检索的每一层判断都是一次 LLM 调用,账要算清楚。值得开的场景:查询难度方差大的系统(有的问题一眼答、有的问题得挖三层);检索语料质量参差、噪声率高(CRAG 的守门员价值最大);答案错误代价高(医疗、法律、金融——多花两次调用的钱买 grounded 校验,值)。不值得开的场景:查询模式高度同质(全是「XX 政策是什么」这类一跳问答,固定流水线足够);延迟预算极紧(每轮反思多几百毫秒);模型本身弱(判断不可靠,反思越反思越乱——自适应检索的效果上限取决于判断者,弱模型自我反思反而引入抖动)。
自适应机制的观测指标
自适应机制要单独观测四个数:反思触发率(多少比例的查询触发了「检索不可用」的改写重检索——高企说明检索层或语料有问题,反思在给检索层擦屁股);二轮成功率(改写重检索后可用性判断通过的占比——低了说明改写策略无效,或语料真的没有答案,该走拒答);支撑校验拦截率(grounded 校验拦下的问题答案占比——它同时是幻觉出口率与生成质量的哨兵);循环终结分布(用满轮次上限才终止的比例——高说明闭环在空转,预算黑洞的信号)。四个指标按查询类型分层看(《评测集构建》的分型报告),自适应机制的健康度才有归因能力——否则「答案变差了」永远查不清是检索、生成还是判断层的问题。
与流式输出的协调
自适应检索和流式体验有一处天然冲突:反思与校验发生在生成前后,而流式要求首 token 尽快吐出。三段式协调是常见解法。检索前:按需检索的判断(要不要检索)在生成开始前完成,它只是多了一步快速判断,对流式首 token 的延迟影响可控。生成中:边流边生成,但「需要补检索」的判断如果中途中止流式转检索,用户看到的是打字机突然停住——体验断裂;务实做法是把「中途补检索」降级为「生成完先给基于现有材料的部分答案,再补充检索、追加第二轮回答」(两段式答案),流式不中断,材料以追加形式补上。生成后:grounded 校验照常整段跑,不拦流式只拦「要不要修正标注」——校验发现问题就在答案末尾追加更正说明,而不是撤回已流出的内容。自适应与流式的协调原则一句话:判断可以迟到,体验不能断流。
小结
Self-RAG 与 CRAG 的共同思想一句话:把「检索」从固定工序变成生成过程中可随时启停的工具,并且给检索质量配上守门员。四个反思动作(要不要检索、相不相关、有没有支撑、有没有用)加一个纠偏循环(不行就改写重检索),构成自适应检索的最小闭环。它不是对固定流水线的否定,而是叠加其上的决策层——先用《查询路由》拦住明显流量,再让自适应机制处理剩下的疑难杂症,预算上用 max_rounds 封顶,质量上用 grounded 校验收口。
参考资料
- Asai et al., Self-RAG (arXiv:2310.11511) —— 反思 token 与按需检索的原始提出
- Yan et al., Corrective RAG (arXiv:2401.15884) —— CRAG 的检索评估与纠偏机制
- 本系列前篇:《查询路由》《拒答与校验》《一篇读懂 Reranker》《评测集构建》
读者留言
COMMENTS 暂无还没有留言,来说第一句?