RAG 场景的提示工程:把检索结果用对

RAG 提示的特殊性

检索增强生成(RAG)由 Lewis 等人在 2020 年提出(NeurIPS 2020,arXiv:2005.11401),其核心是把预训练 seq2seq 模型的参数化记忆,与以维基百科稠密向量索引为代表的非参数化记忆结合起来。普通提示只依赖模型自身权重,而 RAG 提示的上下文来自检索器实时召回的片段,因此提示不再是自洽闭包,而是一副围绕外部证据搭建的脚手架。

这一区别带来三项提示设计要求:第一,要把检索到的证据有序组织进提示;第二,要要求模型标注出处,避免把参数化知识与检索知识混为一谈;第三,要抑制无关片段的干扰。检索结果用得对不对,往往比模型本身更决定回答质量。

上下文拼接与压缩

最朴素的写法是把 top-K 召回片段直接拼接。但过长的检索上下文会带来两个已知问题:一是成本与延迟上升,二是「中间丢失」(lost in the middle)——模型对位于长上下文中部的信息利用更弱。LongLLMLingua(Jiang 等人,arXiv:2310.06839)采用问题感知的粗到细压缩与文档重排序,把相关文档放到首尾更显著的位置,在 NaturalQuestions 上以约 1/4 的 token 取得最高 21.4% 的提升。

提示设计上的启示是:在装入上下文前先做压缩与重排,并在指令中告诉模型哪些片段更相关、把最相关的放在前面,而不是无差别堆砌。

出处标注与可信

可信的 RAG 必须可溯源。提示应明确要求模型只用给定上下文作答,并对每条事实标注来源编号(如 [1]、[2]),同时禁止在证据存在时调用外部参数化知识。Self-RAG 的实验表明,反思式生成能显著提升引用准确性。一个稳妥的写法是:「若上下文不足以回答,请明确说明无法回答」,把「不知道」作为合法输出,而非强迫生成。

抑制检索噪声

召回片段常含无关内容。提示层面有三种有效做法:其一,显式声明「部分片段可能不相关,请忽略」;其二,要求模型先判断相关性再作答,相当于用提示模仿 Self-RAG 的 ISREL 机制;其三,优先使用经重排后的高相关片段,并限制装入数量。结合压缩,可显著降低噪声对生成的污染。

自适应检索提示(Self-RAG 思路)

Self-RAG(Asai 等人,2023,arXiv:2310.11511)训练单一模型输出四类反思令牌:Retrieve(是否需要检索,取值 Retrieve / No Retrieval / Continue)、ISREL(片段是否相关)、ISSUP(生成内容是否被片段支持,取值 Fully / Partially / No Support)、ISUSE(整体效用,1 至 5)。它用按需检索取代「每问必取固定 K 篇」,避免在不必要时注入噪声。

在纯提示层面,可借用这套思路:指示模型先判断是否真需要外部检索,再对召回片段做相关性与支持度自评,最后对答案做效用自检。这样即便不微调模型,也能让提示具备「自适应」的克制感。

常见反模式

  • 不加排序与压缩,把全部召回文本一dump 了事。
  • 不要求标注出处,默许模型把参数化知识与检索内容随意混合。
  • 禁止回答「不知道」,迫使模型在证据不足时幻觉。
  • 把所有片段平铺在中部,触发中间丢失。
  • 用固定指令忽视相关性与效用,检索多少都照单全收。

以下是一段可直接套用的 RAG 系统提示示意:

你是一名严谨的研究助手。只能使用下面提供的上下文作答。

上下文(每段带编号):
[1] <检索片段一>
[2] <检索片段二>
...

要求:
1. 部分片段可能不相关,请自行判断并忽略。
2. 用中文作答,正文中以 [1]、[2] 形式标注出处。
3. 若没有任何片段支持该问题,请回答:根据提供的资料无法回答。
4. 不要使用上下文之外的知识。

问题:<用户问题>

小结

RAG 提示工程的关键在于「用对检索结果」:先压缩与重排上下文、把最相关者前置;再强制出处标注并把「不知道」设为合法输出;随后用提示层面的相关性、支持度、效用自检来抑制噪声、逼近 Self-RAG 的按需检索思路;最后避开无差别堆砌与禁止拒答等反模式。提示设计得当,检索增强的价值才能真正落到回答质量上。

参考与延伸阅读

本文累计阅读