Prompt 工程与答案生成优化

Prompt 工程与答案生成优化

检索到了相关内容,不代表大模型就能答好。怎么让模型基于资料回答、不编造、引用来源、格式规范?这篇讲 RAG 的 Prompt 设计、减少幻觉的技巧、答案格式控制、以及常见问题的应对方法。

大家好,我是黒漂技术佬。

RAG 不是检索完就完事了,最后一步大模型生成答案也很关键。同样的检索结果,Prompt 写得好不好,答案质量差很多:

  • 会不会编造没提到的内容?
  • 会不会忽略参考资料自己瞎答?
  • 答案结构清不清楚?
  • 有没有引用来源?

这篇讲 RAG 场景下的 Prompt 工程,怎么让大模型答得准、答得稳、不胡说八道。


一、RAG 生成阶段的常见问题

1. 幻觉(编造信息)

检索到的内容里没有,模型自己脑补了一些东西,说得跟真的一样。

这是 RAG 最头疼的问题。

2. 忽略参考资料

模型不用检索到的内容,用自己训练时的知识回答。

3. 答案不完整

检索到了好几段,模型只看了第一段,后面的忽略了。

4. 格式混乱

有时候是列表,有时候是段落,忽长忽短,用户体验差。

5. 不会说「不知道」

知识库没有的内容,模型硬编一个,不会老老实实说不知道。


二、基础 RAG Prompt 模板

最简单的版本

复制代码
你是一个专业的客服助手。请根据以下参考资料回答用户的问题。
如果参考资料里没有答案,请直接说「抱歉,我没有找到相关信息」,不要编造内容。

【参考资料】
{context}

【用户问题】
{question}

【回答】

三个关键要素:

  1. 角色设定:告诉模型它是谁、什么风格
  2. 参考资料:检索到的内容
  3. 规则约束:基于资料回答、不知道就说不知道

为什么要明确说「不要编造」?

因为大模型默认倾向于「给出一个完整的回答」,即使不知道也会硬凑。明确告诉它不知道可以说不知道,能显著减少幻觉。


三、Prompt 优化技巧

1. 角色设定要具体

不要只说「你是一个助手」,说清楚身份、风格、领域:

复制代码
你是XX公司的智能客服,负责解答产品相关问题。
回答要专业、简洁、有条理。
语气友好,像真人客服一样。

角色越具体,回答风格越稳定。

2. 参考资料要编号

给每段资料编号,方便模型引用,也方便后续溯源:

复制代码
【参考资料】
[1] (来源:产品手册v2.3 第3章)
退货需在签收后7天内申请,商品需保持完好...

[2] (来源:售后服务FAQ)
退款会在收到退货后3个工作日内原路返回...

[3] ...

3. 分步指令

把要求拆成几条,模型更容易遵守:

复制代码
回答要求:
1. 只使用上面参考资料中的信息,不要使用你自己的知识
2. 如果资料中没有答案,回答「抱歉,暂无相关信息」
3. 答案要简洁明了,分点说明
4. 引用的内容标注来源编号,如[1][2]

一条一条列出来,比写在一段话里效果好。

4. 给例子(Few-shot)

给一两个正确回答的例子,模型更容易理解要求:

复制代码
例子:
问题:保修期多久?
资料:[1] 产品保修期为一年,从签收日算起。
回答:产品保修期为一年,从签收日算起[1]。

问题:能开发票吗?
资料:(无相关内容)
回答:抱歉,暂无相关信息。

Few-shot 对格式控制、减少幻觉都很有效。

5. 强调「不确定就说不知道」

多强调几次,各种角度说:

复制代码
- 只能使用参考资料中的信息
- 资料中没有的,不要猜测,不要编造
- 不确定的就说不确定
- 严禁使用你自己的知识库回答

重要的事情说三遍,模型确实更听话。


四、减少幻觉的技巧

幻觉是 RAG 的头号敌人,这里专门讲几招。

技巧 1:严格限定信息来源

复制代码
你的所有回答必须完全来自上面的参考资料。
不允许使用任何你自己的知识。
如果资料里没有,直接说不知道。

技巧 2:让模型先找证据再回答

复制代码
请按以下步骤回答:
1. 先在参考资料中找到和问题相关的内容
2. 基于找到的内容组织答案
3. 如果找不到相关内容,回答「暂无相关信息」

强制模型先检索再回答,减少直接脑补的概率。

技巧 3:添加置信度

复制代码
回答末尾加上置信度:
- 完全来自参考资料:【置信度:高】
- 部分来自资料,部分推断:【置信度:中】
- 资料中没有找到:【置信度:低】

让模型自己评估靠不靠谱,低置信度的可以人工审核。

技巧 4:引用溯源

要求答案中的每个要点都标注来源:

复制代码
答案中的每个信息点都要标注对应的资料编号,如[1][2]。
没有标注来源的内容视为无效。

模型为了加引用,会更倾向于用资料里的内容。

技巧 5:降低温度(Temperature)

生成参数 temperature 调低一点(0.1-0.3),输出更稳定更保守,不容易瞎编。

python 复制代码
llm = ChatOpenAI(temperature=0.1)

技巧 6:答案校验(Self-check)

生成答案后,再让模型检查一遍:

复制代码
请检查下面的回答是否完全基于参考资料:
回答:xxx
资料:xxx
如果有内容不是来自资料,请删掉。

两轮生成,成本翻倍,但幻觉更少。重要场景可以用。


五、答案格式控制

1. 固定结构

要求答案按固定格式输出:

复制代码
回答格式:
【一句话总结】
用一句话概括答案。

【详细说明】
分点列出具体内容。
1. ...
2. ...

【相关链接】
- 相关文档1
- 相关文档2

2. Markdown 格式

要求输出 Markdown,方便前端渲染:

复制代码
请用 Markdown 格式回答,适当使用标题、列表、加粗。

3. 结构化输出(JSON)

需要程序解析的话,直接输出 JSON:

复制代码
请以 JSON 格式输出,包含以下字段:
- answer: 回答内容(字符串)
- has_answer: 是否找到答案(布尔值)
- sources: 引用的来源编号列表
- confidence: 置信度 high/medium/lower

配合函数调用或 Output Parser 使用,更稳定。


六、长上下文的处理

检索结果多了,模型可能会忽略中间或后面的内容(Lost in the Middle 现象)。

1. 重要的放首尾

最相关的排第一和最后,中间放次相关的。

2. 去重合并

检索结果可能有重复或高度相似的,先合并去重再给模型。

3. 控制数量

不是越多越好。一般 3-5 段最合适,太多反而噪声大。

4. 重排序后截断

用 Rerank 排好序,取最相关的 Top 3-5,别全塞进去。

5. Map-Reduce 策略(长文档)

文档特别长的话:

  1. 每段分别总结(Map)
  2. 把所有总结再汇总一次(Reduce)

适合超长文档问答,但调用次数多、成本高。


七、「不知道」的处理

为什么重要?

瞎编一个错误答案,比说不知道危害大得多。用户发现被骗一次,就再也不信任了。

怎么让模型学会说不知道?

  1. Prompt 里反复强调
  2. Few-shot 里放「不知道」的例子
  3. 调低 temperature,更保守
  4. 可以加一个分类步骤:先判断资料里有没有答案,有再答

分类 + 回答两阶段

复制代码
第一步:判断参考资料中是否包含问题的答案。
输出 YES 或 NO。

第二步:如果是 YES,基于资料给出回答;如果是 NO,回答「暂无相关信息」。

分两步比一步到位更准,但调用两次模型。


八、引用与溯源

为什么要引用?

  1. 用户可以追溯原文,增加可信度
  2. 方便排查错误答案是从哪来的
  3. 一定程度上减少幻觉

实现方式

方式 1:Prompt 里要求标注编号
复制代码
引用的内容标注来源编号,如[1][2]。
方式 2:最后列出参考资料
复制代码
回答末尾附上参考资料列表:
参考资料:
[1] 产品手册v2.3 第3章
[2] 售后服务FAQ
方式 3:结构化输出里带 sources
json 复制代码
{
  "answer": "...",
  "sources": ["doc_001", "doc_023"]
}

程序可以拿到引用的文档 ID,前端展示来源链接。

注意

模型有时候会乱标引用,标了1但内容其实不是来自1。要求严格的话,可以做后处理校验。


九、不同场景的 Prompt 模板

场景 1:客服问答(简洁型)

复制代码
你是XX公司的智能客服。
请根据参考资料简洁准确地回答用户问题。
只使用资料中的信息,不知道就说「抱歉,暂无相关信息」。
回答控制在 3 句话以内。

【参考资料】
{context}

用户:{question}
客服:

场景 2:技术文档问答(详细型)

复制代码
你是资深技术支持工程师,回答用户的技术问题。
请根据参考技术文档给出详细解答,必要时给出代码示例。
只使用文档中的信息,不要编造。
如果涉及多个步骤,请分点说明。

【技术文档】
{context}

【问题】
{question}

【解答】

场景 3:知识库搜索(带引用)

复制代码
你是企业知识库助手。
请根据检索到的文档回答问题,每个信息点标注来源编号。
回答末尾列出参考的文档标题。

【检索结果】
{context}

【问题】
{question}

【回答】

十、实际案例

企业客服 RAG 的 Prompt 迭代

第一版:简单 Prompt
  • 问题:幻觉多,经常自己编
  • 用户反馈:答非所问、信息不准
第二版:加规则 + 编号引用
  • 明确说「只用参考资料」「不知道就说不知道」
  • 资料编号,要求标注引用
  • 幻觉明显减少,但还是有
第三版:Few-shot + 低温度
  • 加了 3 个例子(正常回答、不知道、多来源引用)
  • temperature 调到 0.2
  • 幻觉进一步减少,格式更稳定
第四版:两阶段(判断+回答)
  • 先判断有没有答案,有再答
  • 「不知道」的准确率大幅提升
  • 缺点:多调用一次,成本翻倍

效果对比

版本 答案准确率 幻觉率 不知道的准确率
v1 简单版 72% 18% 40%
v2 加规则 85% 8% 65%
v3 Few-shot 90% 4% 78%
v4 两阶段 93% 2% 90%

一步步优化,效果稳步提升。


十一、常见坑

坑 1:Prompt 写得太啰嗦

规则写了一大堆,模型记不住。重点突出,3-5 条核心规则就够了。

坑 2:参考资料格式乱

资料没有分隔、没有编号,模型分不清哪段是哪段。用编号和分隔线整理清楚。

坑 3:温度太高

temperature 0.7 以上,输出天马行空,幻觉多。RAG 场景建议 0.1-0.3。

坑 4:塞太多参考资料

一股脑塞 10 段进去,模型看不过来,反而忽略了重要的。3-5 段最相关的就够了。

坑 5:只看答案不看引用

答案看着对,但引用标错了,实际是编的。重要场景要校验引用一致性。


十二、本篇小结

  • 生成阶段的常见问题:幻觉、忽略资料、不完整、格式乱、不会说不知道
  • Prompt 三要素:角色设定、参考资料、规则约束
  • 优化技巧:编号、分步、Few-shot、强调约束
  • 减少幻觉:限定来源、先找证据再回答、引用溯源、低温度、Self-check
  • 控制格式:Markdown、JSON、固定结构,根据场景选
  • 长上下文:去重、排序、控制数量,避免 Lost in the Middle
  • 「不知道」很重要,比瞎编强,两阶段判断更准
  • 引用溯源增加可信度,也方便排查问题

下一篇讲多轮对话与上下文管理:RAG 不是单轮问答,多轮对话怎么处理上下文、怎么记住之前的内容。

我是黒漂技术佬。

相关推荐
Briwisdom2 小时前
Agent 帮我写 CUDA(续):当 Self-Attention 遇上 Causal Mask 和 Cross-Attention
agent·算子开发·flash attention
CaffeinePro2 小时前
Langchain环境搭建与LCEL核心语法
人工智能·agent
人工智能培训2 小时前
大模型驱动下传统大数据架构的变革方向
大数据·人工智能·重构·架构·agent·agi
掉鱼的猫3 小时前
把 OpenAPI 接入 Agent Harness:零代码让 Agent 听懂你的 REST API
java·llm·agent
小月土星4 小时前
Agent 开发思考笔记:LLM + Memory + Tool + RAG + MCP + Skills
langchain·llm·agent
小开_ALSKai4 小时前
Obsidian 最强的 AI 功能,就是它没有 AI 功能
人工智能·agent
带刺的坐椅4 小时前
把 OpenAPI 接入 Agent Harness:零代码让 Agent 听懂你的 REST API
java·ai·llm·agent·solon·restapi·openapi
战场小包5 小时前
AI 写代码越来越快,慢下来的那个人变成了我
人工智能·agent
阿拉斯攀登5 小时前
企业知识库实战:从 0 到 1 落地全记录
agent·ai编程·loop·rag