在 RAG 系统中,检索模块完成相关文档片段的召回后,接下来的“临门一脚”就是答案生成。这一步决定了最终输出的质量——是否准确、是否流畅、是否可信。答案生成并不是简单地把检索结果丢给大模型,而是需要通过有策略地构建提示词、控制生成行为和处理边界情况,让模型稳定地产出符合预期的回答。
以下是经过大量实践验证、可直接落地的四种核心生成策略。
策略一:结构化提示模板,明确角色与任务
提示词(Prompt)是控制生成行为的最直接手段。一个好的提示模板应至少包含三部分:
- 角色设定:让模型清楚自己的身份和职责范围。例如,“你是一个专业的企业内部知识助手,只根据提供的资料回答问题。”
- 任务指令:明确要求模型做什么、怎么做。例如,“请根据以下【参考资料】回答用户的问题。如果资料中找不到足够信息,请如实说明‘当前资料未包含相关内容’。”
- 输入结构标记:使用清晰的标记(如
<context>、<question>)将检索到的上下文和用户问题组织起来,降低模型混淆的风险。
真实范式示例:
你是一位严谨的知识库助手,只能基于提供的资料回答问题。
【参考资料】
{检索到的文本片段}
【用户问题】
{用户原始提问}
要求:
1. 回答时优先使用资料中的原意,不要添加资料中不存在的事实。
2. 如果资料足以回答问题,请在每段末尾用【来源:文件名称‑章节】标注出处。
3. 如果资料不充分,请直接回复:“当前资料中未找到相关信息。”
这样的模板确保了模型行为一致、边界清晰,不会因不同提问方式而产生不可预期的输出。
策略二:强制引用来源,用出处约束生成质量
如果只在提示词中“建议”模型引用来源,效果往往不稳定。实践中更有效的做法是将出处信息作为上下文的一部分直接嵌入,并要求模型在回答中携带这些信息。
实现方法:
- 检索阶段保留每个片段的元数据(文件名、章节、页码、更新日期)。
- 在构建提示词时,每条资料片段前加上清晰的源头标记,例如:
【片段1 来源:《员工手册》第3.2条】年假天数为18天...
- 在任务要求中明确指定:“回答中引用该片段时,必须注明对应的来源。”
这样做有两个直接好处:
- 模型生成更收敛:当模型看到每个句子都“带着出处”,它会倾向于更忠实地复述,而不是自由发挥。
- 后续处理更灵活:如果前端需要展示可点击的原文链接,可以用简单的正则匹配提取出【来源:xxx】,渲染成超链接。
处理示例:
用户问:“年假没休完怎么折算?”
生成回答:“根据《员工手册》第5.4条,未休完的年假可按日基础工资的 250% 折算为薪资。具体操作方式请参见该条款的附录说明【来源:《员工手册》第5.4条】。”
策略三:分层处理不确定情况,禁止“硬猜”
即便检索系统用了再好的算法,仍会遇到知识库中没有相关答案、或检索结果相关性很低的情况。此时必须有一套明确的后备策略,杜绝模型为了语言流畅而编造答案。
实际可操作的三种分层处理方式:
| 情况 | 检索结果特征 | 生成策略 |
|------|--------------|----------|
| 信息充足 | 相似度分数 > 阈值,且多个片段指向一致 | 直接引用资料生成完整回答 |
| 信息不足 | 最高相似度较低,或片段明显不相关 | 回复:“关于您的问题,当前资料中未找到明确信息。建议联系对应部门确认。” |
| 信息矛盾 | 不同片段给出冲突信息(如新旧版本并存) | 指出现状并说明差异:“资料中存在两种说法:A版本指出…,B版本指出…。请核实最新版本后确认【来源:A文件、B文件】。” |
“信息不足时不答”比“编造一个看似合理的答案”要好得多。用户对于“查不到”的容忍度远高于“答案错误”,后者会直接摧毁信任。
策略四:后处理质量控制与格式化
模型的原生输出往往不够“整洁”,可能包含冗余解释、不完整的引用标记,甚至偶尔跑题。一个轻量的后处理层能大幅提升最终体验。
常见的后处理动作:
- 截断多余内容:去掉模型自带的客套话(如“希望我的回答能帮到您”)或超出任务范围的发散内容。当然,也可以在提示词中禁用客套,双重保险。
- 格式化引用链接:用程序将原文中的【来源:xxx‑章节】替换为前端可点击的链接,例如
<a href="doc://员工手册#3.2">《员工手册》第3.2条</a>。 - 敏感信息过滤:如果知识库可能包含员工薪资、身份证号等敏感字段,可在最终输出前增加一道正则脱敏或关键词审计,防止意外泄露。
- 置信度标记(可选):在调试阶段或面向高级用户的界面,可附带检索片段的相似度分数,让用户了解回答的可靠性等级。
一个完整的实际案例
某制造企业用 RAG 搭建维修知识库帮手,面对“X‑300 型设备出现 E07 故障码怎么办?”的问题,系统运作如下:
- 检索到两条信息:
- 片段A(0.94 相似度):“E07 表示传感器过热,需清理散热片并重启设备。【来源:《X‑300 故障码手册》第12页】”
- 片段B(0.89 相似度):“若重启无效,请联系技术支持 【来源:《X‑300 故障码手册》第13页】”
- 使用结构化提示模板,携带来源信息。
- 模型生成回答:
“设备出现 E07 故障码通常表示传感器过热。建议首先清理散热片并重启设备;如果故障依然存在,请及时联系技术支持。【来源:《X‑300 故障码手册》第12‑13页】”
- 后处理将【来源】转为超链接,设备维护人员点击即可查看扫描的原版手册对应页面。
整个过程可追溯、不臆造、对新员工足够友好。
答案生成策略的核心,不在于模型的“聪明”,而在于框架设计与行为边界。通过结构化的提示、强制引用、不确定情况下的保守回复以及必要的后处理,一个 RAG 系统就能在真实的业务场景中稳定运行,成为真正可依赖的知识助手。