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 字设计要点(为什么这么写):
- 编号注入:每个 chunk 前加
[n] (标题 p页码)——引用有锚点,前端可悬浮原文; - 拒答条款显式化:「不足以回答时说不知道」——不给模型「必须答」的压力,是减幻觉最有效的一条;
- 约束用动词短语(「标注」「不得使用」)而不是形容词(「严谨地」),可执行可校验;
- 格式与长度约束:给下游解析和用户体验兜底;
- 资料排序:相关性最高的放最前和最后(中段易被忽略,lost in the middle);资料条数 3~5 条为宜,塞多了反而错。
进阶变体:多轮对话时加「结合对话历史理解问题,但只依据资料回答」;带元数据的场景声明优先级(「以 updated 最近的资料为准」);结构化任务直接套 JSON schema 输出。
迭代纪律:模板进版本管理,改一处跑一次评测集(faithfulness + 引用正确率)。