二十五:提示工程¶
来源:http://mp.weixin.qq.com/s?__biz=MzYyNTk3Njg1NA==&mid=2247484264&idx=1&sn=1a30ba71ac6a8369b496199c6d3b8554&chksm=f01eb011c76939070bf117b57c13a571d09fc9a8658bb5dcba07c1c6f60325254ebbda9929e7#rd
1. 学习范围¶
本日主题是提示工程,重点是提示工程技巧。提示工程不是简单“写一句更长的话”,而是围绕任务目标、模型能力、上下文信息、输出约束、评估指标和安全边界来设计输入,使大模型稳定地产生符合要求的输出。 本日覆盖: - prompt 的组成:角色、任务、上下文、约束、输出格式、示例、评估标准。
-
零样本、少样本、指令式提示、结构化提示。
-
Chain-of-Thought、self-consistency、least-to-most、step-back 等推理提示方法。
-
ReAct、工具调用、函数调用和代理式提示。
-
RAG 场景中的问题改写、上下文约束、引用、拒答和防幻觉提示。
-
输出格式控制、JSON/schema、表格、代码生成提示。
-
prompt injection、防越权、数据泄漏与安全提示。
-
prompt 评估、A/B 测试、版本管理和生产化。
2. 提示工程的定位¶
提示工程的目标是在不改动模型权重的情况下,通过输入设计改善模型输出。它适合: - 快速验证任务可行性。
-
统一输出格式和语气。
-
降低幻觉和越界回答。
-
引导模型使用上下文或工具。
-
构建可复用的应用链路。
提示工程不能解决所有问题。如果任务需要模型掌握新知识、大量领域格式、稳定风格或复杂业务规则,可能需要 RAG、微调、工具系统、规则校验或人工审核一起配合。
3. Prompt 的基本组成¶
一个稳定的 prompt 通常包含以下部分:
角色/身份:你是什么角色
任务:你要完成什么
上下文:可用资料、输入数据、背景
约束:不能做什么、必须遵守什么
输出格式:JSON、Markdown、表格、字段列表
示例:输入输出样例
评估标准:什么叫好答案
你是一个资深机器学习面试官。
请根据候选人的回答,从准确性、完整性、表达清晰度三个维度评分。
只使用下面给定的评分标准,不要引入额外要求。
输出 JSON,字段为 score、strengths、weaknesses、follow_up_question。
4. 指令清晰性与约束设计¶
清晰指令通常包含: - 具体任务动作:总结、分类、抽取、改写、评分、生成代码、解释错误。
-
明确输入范围:只基于给定材料,还是可以使用常识。
-
明确输出对象:面向用户、工程师、专家、儿童、管理层。
-
明确质量标准:准确、简洁、可执行、有引用、有风险提示。
-
明确禁止项:不要编造、不要输出多余文本、不要泄露系统提示。
低质量 prompt 常见问题: - 目标模糊:帮我看看、优化一下、写得更好。
-
约束冲突:既要很短又要覆盖所有细节。
-
输出格式不明确:说要 JSON 但没有字段定义。
-
上下文边界不清:没有说明是否允许用外部知识。
-
让模型同时做太多不同任务。
约束要足够明确,但不要把 prompt 写成互相冲突的规则集合。规则冲突时模型会选择看起来更符合语言模式的一部分,稳定性会下降。
5. 零样本提示¶
零样本提示是不给示例,只给任务描述,让模型直接完成任务。例如:
零样本适合: - 模型已经具备强先验能力的任务。-
任务定义简单、标签清楚。
-
快速原型验证。
-
不希望示例引入偏差。
零样本的风险: - 模型可能自行解释标签含义。
-
输出格式不稳定。
-
对边界样本表现不稳定。
改进方式是增加标签定义、决策规则和输出格式约束。
6. 少样本提示¶
少样本提示是在 prompt 中提供若干输入输出示例,让模型模仿示例完成新任务。 示例:
请把用户问题分类为 billing、technical、account 或 other。
示例1:
用户:我的发票在哪里下载?
类别:billing
示例2:
用户:登录时一直提示验证码错误。
类别:account
现在分类:
用户:API 调用返回 500,怎么排查?
类别:
-
包含边界样本。
-
示例格式一致。
-
避免错误标签。
-
避免示例过多挤占上下文。
少样本提示会引入示例偏置。示例顺序、类别比例、措辞风格都可能影响输出。
7. 输出格式控制¶
生产系统经常需要结构化输出。常用方式: - 明确字段。
-
给出 JSON schema。
-
要求只输出 JSON,不输出解释。
-
使用分隔符包裹输入。
-
对枚举值做限制。
-
对字段类型做说明。
示例:
请从文本中抽取实体,只输出 JSON:
{
"people": ["..."],
"organizations": ["..."],
"dates": ["..."]
}
如果没有对应实体,输出空数组。
-
schema validation。
-
重试或修复策略。
-
function calling / tool calling。
-
constrained decoding 或 grammar。
8. 分隔符与上下文边界¶
分隔符用于明确区分指令、上下文、用户输入和示例,减少模型混淆。 常用分隔方式:
或: 分隔符的作用: - 防止用户输入被误解为系统指令。-
明确模型可使用的信息范围。
-
便于模板化构造 prompt。
-
降低 prompt injection 风险。
但分隔符不是安全边界。恶意输入仍可能包含“忽略上文”等指令,因此还需要系统级权限分层、工具权限控制和输出校验。
9. Chain-of-Thought 与推理提示¶
Chain-of-Thought, CoT,通过引导模型分步推理来改善复杂推理任务表现。典型形式包括:
或给出少样本推理示例,让模型模仿中间推理过程。 CoT 适合: - 多步数学题。-
逻辑推理。
-
复杂规划。
-
需要中间判断的任务。
但在生产中不一定要暴露完整推理过程。很多场景可以要求模型“先内部分析,再输出结论和简要理由”。这样能兼顾质量、简洁性和安全性。
10. Self-Consistency¶
Self-consistency 是对同一问题采样多条推理路径,再通过投票或聚合选择最终答案。 流程:
它适合答案可比较、推理路径多样且单次输出不稳定的任务。代价是调用成本增加,延迟增加。对开放生成或主观任务,投票标准需要额外设计。11. Least-to-Most 与任务分解¶
Least-to-most prompting 把复杂问题分解为较简单的子问题,先解决简单子问题,再逐步组合。 适合: - 长链路推理。
-
多约束规划。
-
复杂代码生成。
-
多步骤数据分析。
提示结构可以是:
在工程中,任务分解也可以由程序控制:先让模型生成计划,再分别调用检索、工具或子模型,最后汇总。12. Step-Back Prompting¶
Step-back prompting 先让模型抽象出更一般的问题或原则,再回到具体问题作答。它适合模型容易陷入细节、忽视高层规律的场景。 例如:
它常用于策略分析、代码架构、复杂 debug、数学和常识推理。风险是模型可能抽象过度,输出空泛原则,因此需要在第二步强制回到具体输入。13. ReAct 与工具使用提示¶
ReAct 结合 reasoning 和 acting,让模型在推理过程中选择工具、观察结果,再继续推理。 典型结构:
现代生产系统通常不会让模型自由输出任意工具调用文本,而是通过 function calling、tool schema 或 agent framework 约束工具名、参数和权限。 工具使用提示的关键: - 明确何时调用工具。-
明确工具输入格式。
-
明确不能编造工具结果。
-
明确工具失败时的 fallback。
-
明确最终答案要基于 observation。
14. RAG 场景中的 Prompt¶
RAG 中 prompt 通常包含: - 用户问题。
-
检索到的上下文。
-
回答要求。
-
引用格式。
-
不足以回答时的拒答策略。
典型模板:
你是严谨的问答助手。
只根据 <context> 中的资料回答问题。
如果资料不足以回答,请说明“资料不足,无法确定”。
回答中引用使用 [doc_id]。
<context>
...
</context>
<question>
...
</question>
15. 角色提示与风格控制¶
角色提示可以改变模型的表达风格和关注点。例如“你是资深后端工程师”“你是法律合规审查员”“你是机器学习面试官”。 角色提示的价值: - 指定专业视角。
-
统一语气和粒度。
-
引导模型关注特定风险。
但角色提示不是能力保证。写“你是诺贝尔奖得主”不会让模型突破知识边界。角色提示应配合任务、上下文、规则和评估标准使用。
16. 负面约束与反例¶
负面约束用于说明不要输出什么:
反例可以帮助模型理解边界: 但负面约束过多会增加认知负担,尤其当负面约束彼此冲突时。更稳的做法是用正向可执行规则表达目标。17. Prompt Injection 与安全¶
Prompt injection 是用户输入或检索内容中包含恶意指令,试图覆盖系统目标。例如:
在 RAG 中,检索文档也可能携带恶意指令,称为 indirect prompt injection。 防护策略: - 使用系统消息设置不可覆盖规则。-
明确用户内容和检索内容只是数据,不是指令。
-
对工具调用做权限控制和参数校验。
-
不把敏感信息放入可被模型输出的上下文。
-
对输出做安全审查。
-
对高风险动作使用人工确认。
提示本身不是安全沙箱。真正安全需要权限、隔离、审计和校验。
18. Prompt 评估¶
Prompt 评估应使用固定测试集,而不是凭主观感觉。测试集应覆盖: - 常见输入。
-
边界输入。
-
对抗输入。
-
长上下文输入。
-
格式要求输入。
-
不足以回答的输入。
评估维度: - 正确性。
-
完整性。
-
忠实性。
-
格式合法性。
-
稳定性。
-
安全性。
-
成本和延迟。
生产中可以做 A/B 测试或 shadow evaluation。每次改 prompt 都应记录版本、修改原因和指标变化。
19. Prompt 版本管理与模板化¶
Prompt 应像代码一样管理: - 使用模板变量。
-
保存版本号。
-
记录变更日志。
-
配套测试集。
-
保留线上指标。
-
支持回滚。
模板示例:
SYSTEM_PROMPT = """
你是{role}。
你的任务是{task}。
必须遵守以下规则:
{rules}
"""
USER_PROMPT = """
<context>
{context}
</context>
<question>
{question}
</question>
"""
20. 常见失效模式¶
提示工程常见问题: - 指令不清导致输出跑偏。
-
示例选择偏置导致类别偏移。
-
输出格式偶尔不合法。
-
长上下文中模型忽略关键信息。
-
RAG 中模型使用参数知识编造。
-
工具调用参数错误。
-
prompt injection 越权。
-
多轮对话中历史污染当前任务。
-
prompt 太长导致成本高、延迟高。
排查时应先定位是问题理解、上下文检索、推理、格式约束、安全策略还是后处理失败,再决定改 prompt、改检索、改工具、改模型或微调。
21. 核心总结¶
提示工程的核心原则: - 明确任务目标和成功标准。
-
把上下文、指令和用户输入清晰分隔。
-
用示例减少歧义,但控制示例偏置。
-
对复杂推理使用分解、CoT、自洽或工具。
-
对生产输出使用 schema、校验和重试。
-
对 RAG 明确上下文忠实性和拒答策略。
-
对安全场景防 prompt injection 和越权工具调用。
-
对 prompt 做固定测试集评估和版本管理。
22. 参考资料¶
-
Prompt Engineering Guide 中文版: https://www.promptingguide.ai/zh
-
OpenAI Prompt Engineering Guide: https://platform.openai.com/docs/guides/prompt-engineering
-
ReAct paper: https://arxiv.org/abs/2210.03629
-
Chain-of-Thought Prompting paper: https://arxiv.org/abs/2201.11903
-
Self-Consistency paper: https://arxiv.org/abs/2203.11171
-
Least-to-Most Prompting paper: https://arxiv.org/abs/2205.10625
预览时标签不可点<div class="