what is rag prompting

接入与开发

讲清 RAG 提示词工程是什么,给出把检索片段真正用进回答的提示词写法、拼装顺序与失效排查清单。

你大概遇到过这种情况:检索明明召回了正确的那几段资料,模型回答却像没看见,照样自己编。这不是检索坏了,多半是提示词没把「以资料为准」这件事说清楚。这篇只讲 RAG 里提示词这一层——片段怎么摆、指令怎么写、引用怎么留、答不出来怎么办,给一份能直接抄进项目的写法和排查顺序。

你大概遇到过这种情况:检索明明召回了正确的那几段资料,模型回答却像没看见,照样自己编。这不是检索坏了,多半是提示词没把「以资料为准」这件事说清楚。这篇只讲 RAG 里提示词这一层——片段怎么摆、指令怎么写、引用怎么留、答不出来怎么办。

普通提示词是「把任务说清楚」,RAG 提示词多了两件事:把检索到的片段塞进上下文,并约束模型只能基于这些片段作答。它解决的是「模型看不到你的私域资料」这个断层,不是替代检索。召回错了,提示词再怎么写也救不回来,该先回去处理检索和进料。

RAG 提示词工程到底在做什么

它和纯提示词工程最大的区别在于:上下文不再由你手写,而是每次请求动态拼装,长度和内容都不可控。同一个提示词模板,今天塞进去的是三份 PDF 片段,明天可能是二十条聊天记录。所以 RAG 提示词的重点不是把话说漂亮,而是把「什么算合格材料、什么算答不出来」的判据写死。

  • 检索质量决定上限,提示词决定下限:召回对了但答得飘,先别怀疑向量库,去看提示词。
  • 问题需要最新事实而库里没有时,RAG 提示词不适用,硬写只会让模型编得更像真的。
  • 资料本身就是噪声、同一段落里混着多条互相矛盾的规定时,先做数据清洗,提示词救不了脏进料。
  • 上下文窗口有限,片段不是越多越好,塞满之后模型反而更容易忽略中间部分。

一段 RAG 提示词由哪几块拼成

区块放在哪必须写清什么
角色与边界最前你是什么角色、只能依据什么作答
检索片段中间每段带来源标识,段间加分隔符
用户问题片段之后保持原样,别和指令揉在一起
输出与引用要求最后引用格式、答不出来的说法

顺序很关键。片段放在问题前面,模型更容易把问题当「查询」而不是「闲聊」。每段片段都要带来源标识——文件名、段落号或链接都行,否则你后面没法要求它标注出处。片段之间加清晰分隔符,比如成对的三引号或 XML 标签,别让两段资料黏成一句。

你是资料问答助手。只能依据 <材料> 中的内容回答,不得使用任何外部知识。
<材料>
[来源: 员工手册.pdf] ……段落内容……
---
[来源: 报销制度.md] ……段落内容……
</材料>
用户问题:出差住宿发票丢了还能报吗?
要求:每句结论后用 [来源: 文件名] 标注;材料中没有就回答「材料未涉及」。"

指令部分写死三件事

  1. 只用给的材料把「请参考」改成「只能依据」,前者是建议,后者是约束,模型对这两句的反应差别很大。
  2. 材料不足就直说明确给它一个出口:材料里没有就说没有,不要用常识补。不写这句,八成会硬编。
  3. 每条结论跟来源给格式样例,比如句尾写 [来源: 文件名];只喊「要引用」,引用会变得很随机。

写的时候容易踩的几个坑

  • 别把片段一股脑全塞进去,无关片段会稀释信号,宁少而准;超长时先做重排或截断,具体阈值到 /tools/token-price-calculator 换算成 token 再定。
  • 别只要求「引用来源」却不给格式,模型会自创标注方式,后面没法做自动化校验。
  • 别在系统提示里塞大段与本次无关的产品说明,片段会被挤到很后面,容易被忽略。
  • 别让指令和片段用同一种排版,视觉上分不开,模型分不清哪句是规矩哪句是资料。
  • 拒答模板要单独给一句,别指望模型从「只能依据材料」自行推导出「不知道就说不知道」。

检索到了但回答没用上,按这个顺序查

  1. 看片段有没有进请求体打印一次完整 prompt,确认拼接逻辑没把片段丢掉,也确认没被截断在中间。
  2. 看位置和长度片段是否被塞在超长系统提示之后、是否已经超出上下文被截尾,这两处最容易出问题。
  3. 看指令强度把「请参考」改成「只能依据」试一次,多数情况这一改就有变化。
  4. 看模型本身换一个更服从指令的模型对照测试,判断是提示词问题还是模型服从性问题;模型规格与价格到 /official-api 对照当时的数字。

改完怎么知道真的变好了

准备一小批固定问题,每题标注「答案应该来自哪份资料」,改提示词前后各跑一遍看通过率。重点看两类错:该引用时没引用、材料里没有却答了。这两类比措辞好不好重要得多,因为前者说明约束没生效,后者说明边界没写清。

现象最可能的原因先动哪里
答得对但没标来源引用格式没给样例在输出要求里加一句格式示例
材料里有却说不知道片段被截尾或没拼进去打印完整 prompt 核对
材料里没有却给了答案缺拒答指令补一句「材料未涉及就直说」
引用标了但标错段片段间没有分隔符给每段加来源头 + 分隔线

提示词改动要留版本,别在一个文件里反复覆盖,否则回退时说不清哪版更好。评测用例和小规模回归的做法可参考站内提示词版本管理相关文章,别只靠手感判断。

RAG 提示词不是让模型更聪明,而是把它按在材料上,不让它乱跑。
下一步想确认你项目里到底卡在检索还是提示词,可以先去站内看看各家 API 的模型规格与提示词服从度对照,再决定要不要换模型。

常见问题

RAG 提示词和普通提示词有什么本质区别?

普通提示词的任务描述由你一次写好;RAG 提示词是模板,检索片段每次请求现拼进去,所以长度、顺序、分隔和「只用这些材料」的约束才是重点。任务描述反而简单。

检索结果明明是对的,模型为什么还是答偏?

常见三个原因:片段被截断或淹没在超长上下文里、指令写成了建议性的「请参考」、没有拒答出口导致模型自己补。按「请求体 → 位置长度 → 指令强度 → 换模型对照」这个顺序查。

需要让模型在回答里标出来源吗?

建议要,而且要给出固定格式。带来源的回答方便你核对,也能顺带暴露「引用了一段不存在的资料」这种幻觉。但如果只是内部临时问答、不要求可追溯,可以省掉,避免答得啰嗦。

本文依据各平台公开文档与官方公告整理,只做中文归纳;具体做法、参数与限制以官方文档为准。