Skip to content

RAG 中如何设计 Prompt 来有效利用检索到的文档? ​

  • 标签:RAG、Prompt 设计

🏛 业务架构师 ​

RAG 中检索文档的 Prompt 设计,我给一套生产级模板与设计逻辑:

核心原则:模型是"开卷考试的考生"——提示词要把"考试纪律"定清楚:只能用卷面资料、要标出处、不会就说不会。

模板骨架:

text
# 角色
你是 XX 公司的知识助手,仅依据下方【参考资料】回答问题。

# 参考资料
[1] {chunk_1}(来源:{doc_title} {section})
[2] {chunk_2}(来源:...)

# 回答要求
1. 仅使用参考资料中的信息,禁止使用资料外的知识
2. 答案中用 [编号] 标注每条论据的来源
3. 资料不足以回答时,明确说"根据现有资料无法回答",
   并建议用户转人工或换个问法
4. 若多个资料冲突,以 {较新版本/官方来源} 为准并说明

# 用户问题
{question}

设计要点解析:分块编号+来源标注是引用机制的基础(可溯源=可信+合规);"禁止使用资料外知识"是幻觉的第一道闸;冲突处理规则把业务口径(以最新版为准)写进提示;拒答出口防止模型硬编;问题放最后让注意力更聚焦。

进阶技巧:要求"先列资料要点再归纳答案"(证据锚定);限定输出长度与格式(成本控制);对高频问题类型做提示词分版(政策类强调时效、操作类强调步骤完整)。

迭代纪律:提示词变更必须过评测集(命中率/忠实度/引用正确率),线上 badcase 回流优化——模板不是写完就定稿,是随业务语料进化半年的活资产。

🏗 系统架构师 ​

RAG Prompt 设计的目标:让模型严格基于检索内容作答、可拒答、可引用。我的生产模板结构:

text
# 角色
你是基于知识库的问答助手,只回答以下资料支撑的问题。

# 资料
<documents>
[1] {chunk_1}
[2] {chunk_2}
[3] {chunk_3}
</documents>

# 回答规则
1. 仅使用【资料】中的信息回答,禁止使用资料外的知识补充;
2. 每个关键论断后标注来源编号,如 [1];
3. 资料不足以回答时,回复"根据现有资料无法回答",并说明缺少什么信息;
4. 资料之间矛盾时,指出矛盾并按更新时间取新;
5. 用简洁中文回答,不要复述问题。

关键设计决策(为什么这么写):

  • 资料编号 [1][2][3]:为引用标注提供锚点,答案可程序化校验引用真实性;
  • 拒答合法化(第 3 条):治幻觉最有效的一句话——没有退路的模型会硬编;
  • 矛盾处理(第 4 条):多版本文档共存时防止模型随机取用——配合元数据(时间戳)过滤更好;
  • 资料块排序:最相关的放最前(attention 对首尾敏感),超长的中间块该裁就裁;
  • few-shot 可选:格式复杂的场景加一组"问题→带引用回答"示例,但注意示例也吃 token(放前缀吃缓存)。

工程闭环:输出过引用校验(引用 ID ⊆ 本次检索集合);faithfulness 抽检进回归集——Prompt 是 RAG 效果链路中"最便宜的调节阀",但要配验证才可靠。

💻 全栈开发专家 ​

RAG 生成阶段的 Prompt 设计,我的生产模板长这样(每一部分都有讲究):

text
你是 {product} 的专业助手。请严格依据下面提供的编号资料回答问题。

资料:
{context}

问题:{question}

要求:
1. 仅使用资料中的信息,不得使用外部知识或推测
2. 回答中的关键论断后标注资料编号,如 [1]
3. 资料不足以回答时,回复"根据现有资料无法回答该问题",不要编造
4. 回答简洁:先结论,再依据,不超过 200 字

设计要点(为什么这么写):

  1. 编号注入:每个 chunk 前加 [n] (标题 p页码)——引用有锚点,前端可悬浮原文;
  2. 拒答条款显式化:「不足以回答时说不知道」——不给模型「必须答」的压力,是减幻觉最有效的一条;
  3. 约束用动词短语(「标注」「不得使用」)而不是形容词(「严谨地」),可执行可校验;
  4. 格式与长度约束:给下游解析和用户体验兜底;
  5. 资料排序:相关性最高的放最前和最后(中段易被忽略,lost in the middle);资料条数 3~5 条为宜,塞多了反而错。

进阶变体:多轮对话时加「结合对话历史理解问题,但只依据资料回答」;带元数据的场景声明优先级(「以 updated 最近的资料为准」);结构化任务直接套 JSON schema 输出。

迭代纪律:模板进版本管理,改一处跑一次评测集(faithfulness + 引用正确率)。