在 RAG 系统中,检索到的文档片段只是“原料”,最终如何组织成可用回答,关键就在于提示词模板。它决定了模型以什么角色、用何种语气、基于哪些材料、遵循什么规则来回答问题。一个设计得当的提示词模板,能让同样的检索结果产出质量截然不同的回答;而一个粗放的模板,则可能让模型忽略约束、自由发挥,甚至编造信息。
提示词模板的核心作用
提示词模板本质上是一个“指令框架”,它把用户问题、检索到的背景知识、系统要求等元素填入一个预定义的结构中,形成完整的上下文发送给大模型。合理的模板可以:
- 约束模型行为:明确告知模型“只能基于提供的资料回答,不知道就说不知道”,从源头抑制幻觉。
- 统一输出格式:强制要求回答中附带来源引用、固定排版风格,便于前端解析和人工复核。
- 适应多场景切换:同一个 RAG 系统,只需更换模板,就能在“客服助手”“内审问答”“摘要生成”等不同模式间切换。
一个基础模板的解剖
以下是一个实际项目中经过多次迭代的模板(以中文客服场景为例):
你是公司的内部知识助手,你的职责是根据提供的资料,准确、简洁地回答员工的问题。
【重要规则】
- 只根据下方的“参考资料”回答。
- 如果参考资料不足以回答问题,请直接说“根据现有资料,我暂时无法回答这个问题”,绝对不要编造任何信息。
- 回答时,请在相关处用【来源:文档名称+章节】的形式注明出处。
【参考资料】
{retrieved_chunks}
【用户问题】
{user_question}
请回答:
这个模板包含了几个关键部分:
- 角色设定(系统提示):明确助手身份,暗示回答风格。
- 行为约束:划定了知识边界,并规定了“不知道”时的标准话术,这是对抗幻觉最直接的手段。
- 引用格式要求:用固定标记让模型输出时可被后处理解析,也方便人工核实。
- 变量占位符:
{retrieved_chunks}和{user_question}在实际调用时被替换为真实内容。
设计模板的几条实用原则
在实际项目中,推导出“好模板”往往比想象中需要更多打磨。以下原则来自真实部署中的经验:
- 先划定边界,再要求发挥
把“只能基于资料回答”放在最前面,比任何技巧都重要。如果允许模型在资料不全时“适当延伸”,很快就会看到幻觉卷土重来。
- 引用格式要简单、可解析
使用固定的符号组合,如 【来源:xxx】,避免让模型自由决定引用方式。这样前端可以自动将引用转换成超链接或折叠引用,而不会被模型生成的冗余文字干扰。
- 为“检索失败”提前设计兜底
总有超出知识库范围的问题。与其让模型敷衍,不如在模板中直接定义兜底话术,并可以考虑在此时触发客服转人工或建议其他问法。
- 在末尾再次强调关键约束
长上下文中,模型对末尾的指令更敏感。如果发现模型仍偶尔忽略约束,可以在提示词末尾重复一句“请再次确认,你只基于提供的参考资料回答”。
- 利用 few-shot 示例提升稳定性
在资源充足的情况下,可以在模板中插入一到两个高质量问答对作为示例,让模型更直观地理解期望的输出格式和严谨程度。但这会增加 token 消耗,对于简单场景并非必须。
多场景模板的轻量变体
一个好的基础模板稍作调整就能适配不同场景:
- 客服场景:增加语气要求,“礼貌、亲切,用短句”,并引导在必要时提供进一步帮助的入口。
- 法务审查场景:加重引用要求,甚至要求逐条对照条款,输出格式化为列表。
- 写作辅助场景:允许模型在资料基础上适度组织语言,但依旧要求所有事实点都有出处。
例如,在法务场景中,模板可以修改为:
你是法务审查助手。请严格根据提供的合同条款回答,每一条结论必须引用具体的条款编号和原文。
【条款】
{retrieved_chunks}
【问题】
{user_question}
请按“结论 → 依据”格式逐一回答,无法判断请明确说明。
模板的调试与迭代
模板不是一次写成的。在实践中,通常采用“小批量验证 + 持续修正”的方式:先用 50-100 条真实问题跑通,人工检查回答的错误类型,然后针对性地收紧约束或调整引用格式。常见调整比如:
- 模型还是爱编造 → 把“绝对不要编造”改为更口语化但更有力的“如果你编造,会误导同事做出错误决策,请务必只基于提供的资料”。
- 引用的来源名太长 → 在检索阶段就给每个 chunk 分配简短标识,在模板中只要求输出该标识。
- 模型回答过于啰嗦 → 直接加入“用不超过 100 字回答”。
正是通过这种务实、迭代的设计方式,提示词模板才能从“能用”走向“好用”,成为整个 RAG 系统稳健输出的最后一道护栏。