Prompt Engineering —— 意图的精确表达

本文是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 工程化的起点,但不是终点。它的核心价值在于:

  1. 精确性:将模糊的人类意图转化为机器可执行的指令
  2. 可控性:通过约束和示例引导模型行为
  3. 可复用性:将有效的交互模式沉淀为模板

但 Prompt Engineering 的能力边界也很清晰:它无法突破模型本身的能力上限,面对复杂任务时,需要与 Context Engineering、Harness Engineering 和 Loop Engineering 协同,才能构建真正可靠、可扩展的 AI 应用系统。


下一篇:Context Engineering ------ 知识与记忆的窗口

相关推荐
IT_陈寒1 小时前
React状态更新总是慢半拍?你可能忘了这个默认行为
前端·人工智能·后端
aneasystone本尊1 小时前
学习 turbovec 的混合检索与框架集成
人工智能
火山引擎开发者社区12 小时前
火山AgentPlan/CodingPlan同步上线GLM-5.2
人工智能
冬奇Lab13 小时前
Skill 系列(05):Skill 工作流串联——4 种模式实测,并发加速 1.5x
人工智能·开源
冬奇Lab13 小时前
每日一个开源项目(第141篇):hiring-agent - HackerRank 开源了他们的简历评分系统,你的简历能得几分?
人工智能·面试·开源
甲维斯14 小时前
又升级咯!坦克大战2026,科技与复古并存!
前端·人工智能·游戏开发
姗姗来迟了16 小时前
用React Hook封装AI对话状态
人工智能