本文是Agent四大工程支柱的首篇:Prompt Engineering,旨在帮助读者系统性地理解提示工程的核心思想与技术体系。
一、什么是 Prompt Engineering?
Prompt Engineering(提示工程)是 AI 工程化中最基础也最核心的环节。它回答的是所有 AI 交互中的第一个问题:"怎么问?"
从技术本质上看,Prompt 是用户意图与模型能力之间的翻译层。大语言模型(LLM)本质上是一个基于概率的文本续写器,它不会"理解"用户的真实需求------它只会根据输入的上下文,预测下一个最可能的 token。Prompt Engineering 的目标,就是通过精心设计的输入文本,最大化模型输出符合预期的概率。
这个定义看似简单,但背后蕴含着一个深刻的工程化命题:如何将模糊的人类意图,转化为机器可精确执行的指令?
在实际应用中,Prompt Engineering 远不止"写一段话问 AI"。它涵盖了角色设定、任务分解、格式约束、示例引导(Few-shot)、思维链引导(Chain-of-Thought)、输出校验等多个维度,是一门融合了语言学、认知心理学和软件工程的交叉学科。
二、Prompt 的基本结构
一个完整的 Prompt 通常由以下组件构成:
2.1 系统指令(System Prompt)
系统指令是整个对话的"宪法",定义了模型的行为边界、角色身份和回答风格。它通常位于对话的最开始,对模型的全局行为产生持续影响。
markdown
你是一个资深的后端架构师,擅长分布式系统设计。
回答问题时请遵循以下原则:
1. 先给出结论,再展开解释
2. 涉及代码时,标注语言和关键行号
3. 不确定的地方明确说明,不要编造
系统指令的质量直接决定了后续所有交互的上限。一个模糊的系统指令(如"你是一个编程助手")会导致模型在后续交互中频繁越界、风格不一致。
2.2 任务描述(Task Description)
任务描述是单次交互的核心,明确告诉模型"这一次要做什么"。好的任务描述应满足 3C 原则:
- Clear(清晰):无歧义,无二义性
- Complete(完整):包含所有必要信息
- Constrained(约束):明确输出边界和限制
差的示例:
帮我写个排序函数
好的示例:
用 TypeScript 实现一个泛型快速排序函数
quickSort<T>(arr: T[], compareFn: (a: T, b: T) => number): T[]。要求:
- 原地排序(in-place),不使用额外数组
- 包含完整的 JSDoc 注释
- 附上 3 个不同数据类型的测试用例
2.3 Few-shot 示例(示例引导)
Few-shot 是提示工程中性价比最高的技巧之一。通过在 Prompt 中提供 2-5 个输入-输出示例,模型可以快速理解期望的输出格式和推理模式。
markdown
将以下中文句子翻译成英文,要求:
- 保留原文的语气
- 专业术语使用行业标准译法
示例1:
输入:请尽快完成代码审查
输出:Please complete the code review as soon as possible.
示例2:
输入:这个接口的 QPS 上限是多少?
输出:What is the QPS limit for this API?
现在请翻译:
输入:我们需要在下一轮迭代中引入熔断机制
2.4 输出格式约束
明确的格式约束能大幅降低后处理的复杂度。常见做法包括:
- 结构化输出:要求 JSON、YAML、Markdown 表格等格式
- Schema 定义:给出字段名、类型、描述
- 正反例说明:告诉模型什么是对的,什么是错的
markdown
请分析以下代码的性能瓶颈,输出 JSON 格式:
{
"bottlenecks": [
{
"location": "文件和行号",
"severity": "critical | major | minor",
"description": "问题描述",
"suggestion": "优化建议"
}
],
"overall_score": "1-10 的整体评分"
}
三、进阶 Prompt 技巧
3.1 Chain-of-Thought(思维链,CoT)
思维链提示是 2022 年由 Google 研究团队提出的重要技术,核心思想是:让模型在给出最终答案之前,先展示推理过程。
最简单的触发器是加入一句:"Let's think step by step"(让我们一步一步思考)。但更有效的做法是设计结构化的推理框架:
markdown
请解决以下问题。在回答时,请按以下步骤思考:
问题:一个水箱有两个进水管,A管单独充满需要3小时,B管单独充满需要6小时,
同时还有一个出水管C,单独排空需要4小时。如果三个管子同时打开,水箱
需要多久才能充满?
步骤1:分析题目,列出已知条件
步骤2:计算每个管子的工作速率
步骤3:建立方程
步骤4:求解并验证
步骤5:给出最终答案
CoT 的变体还包括:
- Zero-shot CoT:仅用"Let's think step by step"触发,无需示例
- Auto-CoT:自动生成多样化的推理链作为示例
- Tree of Thoughts(ToT):在每一步探索多个推理分支,选择最优路径
- Graph of Thoughts(GoT):将推理过程建模为有向图,支持分支合并和回溯
3.2 ReAct(Reasoning + Acting)
ReAct 范式将推理(Reasoning)和行动(Acting)交织在一起,是 Agent 系统的核心 Prompt 模式。模型在推理过程中可以调用外部工具获取信息,然后基于新信息继续推理。
markdown
你可以使用以下工具:
- search(query: string): 搜索互联网信息
- calculator(expression: string): 执行数学计算
请使用"思考→行动→观察→思考→..."的循环模式回答问题。
问:2024年诺贝尔物理学奖得主的年龄之和是多少?
思考:我需要先知道2024年诺贝尔物理学奖得主是谁,以及他们的年龄。
行动:search("2024 Nobel Prize in Physics winners")
观察:[搜索结果...]
思考:根据搜索结果,得主是John Hopfield和Geoffrey Hinton。我需要查他们的年龄。
行动:search("John Hopfield age")
观察:[搜索结果...]
...
3.3 Self-Consistency(自洽性)
自洽性是一种通过多次采样+投票来提升推理准确率的技术。对于同一个问题,让模型生成多条推理路径(temperature > 0),然后取出现频率最高的答案。
这种方法特别适合数学推理、逻辑推理等有明确正确答案的任务。研究表明,在 GSM8K 等数学推理基准上,Self-Consistency 可以将准确率提升 5-10 个百分点。
3.4 角色扮演与情绪注入
看似"花哨"的技巧,实际上有研究支撑。论文《Large Language Models Understand and Can Be Enhanced by Emotional Stimuli》表明,在 Prompt 中加入情绪暗示(如"这对我的职业生涯非常重要")可以提升模型输出质量。角色设定则可以帮助模型建立更稳定的行为模式。
四、Prompt Engineering 的工程化实践
4.1 Prompt 版本管理
Prompt 应该像代码一样纳入版本管理。推荐实践:
- 将 Prompt 模板存储在独立的文件中(如
.prompt或.yaml) - 使用 Git 管理 Prompt 的变更历史
- 为每个 Prompt 版本建立对应的评估基准
- 在 CI/CD 流程中集成 Prompt 回归测试
yaml
# prompts/code_review.yaml
version: "2.3.0"
name: code_review
system: |
You are a senior code reviewer...
template: |
Review the following {language} code:
{code}
Focus on:
{focus_areas}
Output format: {format}
4.2 A/B 测试与效果评估
Prompt 的优化需要数据驱动。建立评估体系,包括:
- 自动评估:使用另一个 LLM 对输出打分(LLM-as-Judge)
- 人工评估:定期抽样人工评审
- 业务指标:任务完成率、用户满意度、重试率
- 回归测试集:维护一组标准测试用例,确保修改不引入退化
4.3 动态 Prompt 组装
在生产环境中,Prompt 通常不是固定的,而是根据上下文动态组装:
ini
最终 Prompt = 系统指令 + 角色设定 + 任务描述 + 检索到的参考文档 + 对话历史 + 用户输入 + 输出格式约束
组装时需要注意:
- 优先级:关键约束放在最前面或最后面("首因效应"和"近因效应")
- 长度控制:避免超出模型的上下文窗口
- 冲突处理:当多个来源的信息冲突时,明确优先级规则
五、Prompt Engineering 的局限性与边界
5.1 无法超越模型能力上限
Prompt Engineering 本质上是在模型已有的能力空间中寻找最优解,而不是创造新的能力。如果模型本身不具备某个领域的知识或推理能力,再精巧的 Prompt 也无法弥补。
例如,一个未经过代码训练的模型,即使给出最完美的编程 Prompt,也无法写出正确的代码。
5.2 指令冲突
当 Prompt 中存在多个指令时,模型可能无法同时满足所有约束。例如同时要求"回答尽可能详细"和"控制在 200 字以内",模型可能顾此失彼。
5.3 上下文窗口限制
随着 Prompt 越来越复杂(包含系统指令、Few-shot 示例、检索文档、对话历史),很容易超出模型的上下文窗口限制。即使技术上将窗口扩展到 128K 甚至 1M tokens,信息密度和注意力分配仍然是核心挑战。
5.4 鲁棒性不足
同一个 Prompt 在不同的模型、不同的模型版本、甚至不同的采样温度下,可能产生截然不同的输出。这种不稳定性使得 Prompt Engineering 很难像传统软件工程那样做到"一次编写,处处运行"。
5.5 工程重心的迁移
正是因为上述局限性,AI 工程的重心正在从单一的 Prompt 优化,向更系统的工程化方向迁移:
- Context Engineering:解决"让模型看到什么"的问题
- Harness Engineering:解决"模型在什么环境中运行"的问题
- Loop Engineering:解决"模型做完一步后怎么办"的问题
六、从 Prompt 到 Agent:提示工程的演进方向
随着 AI 应用从单轮问答向多步自主执行演进,Prompt Engineering 的角色也在发生变化:
| 阶段 | 核心 Prompt 模式 | 典型场景 |
|---|---|---|
| 单轮交互 | 指令 + 约束 + 格式 | 翻译、摘要、分类 |
| 多轮对话 | 系统指令 + 上下文管理 | 客服、辅导、咨询 |
| 工具调用 | ReAct / Function Calling | 搜索、计算、API 调用 |
| 自主 Agent | 规划 + 执行 + 反思 + 重规划 | 代码生成、数据分析、自动化运维 |
在 Agent 系统中,Prompt 不再是一次性的输入,而是循环中的一个环节。它需要与工具调用结果、执行反馈、中间状态等信息协同工作,形成完整的感知-推理-行动闭环。
七、总结
Prompt Engineering 是 AI 工程化的起点,但不是终点。它的核心价值在于:
- 精确性:将模糊的人类意图转化为机器可执行的指令
- 可控性:通过约束和示例引导模型行为
- 可复用性:将有效的交互模式沉淀为模板
但 Prompt Engineering 的能力边界也很清晰:它无法突破模型本身的能力上限,面对复杂任务时,需要与 Context Engineering、Harness Engineering 和 Loop Engineering 协同,才能构建真正可靠、可扩展的 AI 应用系统。
下一篇:Context Engineering ------ 知识与记忆的窗口