4. 提示词工程:从静态到动态
第 4 章 · 提示词工程:从静态到动态
"把 prompt 视为可执行代码——可以被运行、测试、版本化、自动优化。"
学习目标
完成本章后,读者应能够:
- 区分静态 prompt 与可优化 prompt 的工程意义
- 跑通 OPRO、DSPy、PromptAgent 三种自动 prompt 优化范式
- 评估 prompt 优化的效果(准确率)与成本(token / API 调用)
- 理解 prompt 自修改在 L1 → L4 层级跃迁中的位置
- 识别 prompt 自修改的 4 类安全风险
先修知识
- 第 1 章 · LLM 智能体时代
- 第 3 章 · 工具与函数调用
章节地图
- 4.1 静态 prompt 的工程局限
- 4.2 OPRO:让 LLM 自身作为优化器
- 4.3 DSPy:把 prompt 编译为可签名
- 4.4 PromptAgent:用 MCTS 策略性搜索
- 4.5 自修改 prompt 的安全边界
- 4.6 本章小结与第 5 章预告
4.1 静态 prompt 的工程局限
传统 prompt 工程是静态的:开发者写一段自然语言指令,把它放进系统 prompt,让 LLM 在所有任务中都使用这段指令。这种模式在 2022–2023 年是主流,至今仍是大多数 LLM 应用的基础。但静态 prompt 有三个根本局限。
第一个局限是不可优化。 一段 prompt 写完后,开发者只能靠经验和 A/B 测试来改进。这与软件工程中的"代码评审"形成鲜明对比——代码可以通过性能分析、单元测试、CI/CD 流水线持续优化,而 prompt 没有等价的工具链。
第二个局限是不可度量。 静态 prompt 的"好"和"坏"是模糊的判断。即使跑了一组评测,我们也只能说"这段 prompt 比那段 prompt 好 X%",无法说"这段 prompt 的哪一句贡献了 X%"。这种"黑盒评估"让 prompt 优化变成艺术而不是工程。
第三个局限是不可演化。 任务环境变化时,静态 prompt 不能自动适应。例如,原本为英文客服设计的 prompt 在中文客服场景中可能完全失效,开发者必须手工重写。
针对这三个局限,2023–2025 年间出现了一波"自修改 prompt"研究:让 LLM 自己优化自己的系统 prompt。这些工作可以归为三个范式——OPRO、DSPy、PromptAgent——它们各自解决了静态 prompt 的不同侧面。
图 4.1 · 静态 prompt 与自修改 prompt 的对比
┌─────────────────── 静态 prompt ──────────────────┐
│ 开发者: │
│ "你是一个有帮助的助手, 请简洁回答..." │
│ │
│ → 部署, 跑, 评测 (A/B test) │
│ → 人工改写, 重新部署 │
│ → 循环, 无法自动收敛 │
└─────────────────────────────────────────────────────┘
┌─────────────────── 自修改 prompt ─────────────────┐
│ 开发者: │
│ "你是 prompt 优化器, 任务目标: <task>" │
│ │
│ → 初始 prompt 部署 │
│ → Agent 在任务中跑, 记录表现 │
│ → 优化器 LLM 根据表现修改 prompt │
│ → 新 prompt 部署, 循环 │
│ → 收敛, 可量化, 可版本化 │
└─────────────────────────────────────────────────────┘
关键点:自修改 prompt 把 prompt 从"开发者编写的资产"变成"可被系统持续优化的对象"。这与软件工程中"代码即配置"的趋势一致。
自修改 prompt 的核心机制可以形式化为四元组 ((P_0, T, M, V)):
- (P_0):初始 prompt(开发者提供)
- (T):任务或测试集
- (M):优化器 LLM(与任务执行 LLM 可以是同一个或不同)
- (V):评估函数(计算 prompt 在任务上的得分)
优化过程是迭代的:
$$ P_{t+1} = M(P_t, {V(P_t, t_i)}_{i=1}^{|T|}) $$
其中 (M) 接受当前 prompt 和评估分数,生成新 prompt。不同的范式在这个框架下选择不同的 (M)(OPRO 用 LLM 作爬山,DSPy 用编译时优化器,PromptAgent 用 MCTS)。
复述框 · 4.1 节要点
- 静态 prompt 三局限:不可优化、不可度量、不可演化。
- 自修改 prompt 四元组:(初始 prompt, 任务, 优化器, 评估)。
- 迭代公式:(P_{t+1} = M(P_t, {V(P_t, t_i)}))。
4.2 OPRO:让 LLM 自身作为优化器
OPRO(Optimization by PROmpting) 由 Google DeepMind 在 2023 年 9 月提出,是自修改 prompt 的开山工作。OPRO 的核心洞察是:既然 LLM 能生成自然语言回答,那它也能生成自然语言 prompt。把"寻找最优 prompt"这个问题转化为"让 LLM 爬山"的问题。
图 4.2 · OPRO 的优化循环
┌──────────────────────────────────────────────────────┐
│ 优化器 LLM 接收: │
│ - 当前 top-K 个 prompt + 它们的得分 │
│ - 任务描述 │
│ - "请生成新的 prompt, 期望比现有的更好" │
└──────────────────────┬───────────────────────────────┘
│ 生成新 prompt P_new
▼
┌──────────────────────────────────────────────────────┐
│ 任务执行 LLM 接收: │
│ - 任务 query + 新 prompt P_new │
│ 在测试集 T 上跑 N 个任务 │
└──────────────────────┬───────────────────────────────┘
│ 记录得分 V(P_new)
▼
┌──────────────────────────────────────────────────────┐
│ 更新 top-K 表, 如果 P_new 更好, 加入 │
│ 继续下一轮 │
└──────────────────────────────────────────────────────┘
关键点:OPRO 的"爬山"不是数值优化,而是 LLM 生成的 prompt 在文本空间中"向上走"。每轮生成的新 prompt 都参考 top-K 历史,自然形成"逐步改进"的轨迹。
OPRO 在 GSM8K 数据集上达到了以下结果(来自原论文):
- 初始手工 prompt:约 80% 准确率
- OPRO 优化 8 轮后:约 95% 准确率
- 绝对提升:+15 个百分点
- 相对人工优化 prompt:超过最佳人类设计的 prompt
更引人注目的是 OPRO 发现的 prompt 模式。论文中报告,经过多轮优化后,最优 prompt 往往包含"让我们一步一步思考"(Let's think step by step)这种指令——这与 Wei 等人 2022 年 Chain-of-Thought 论文的核心发现一致,但 OPRO 是自动发现了这个模式,而不是人工设计。
OPRO 的局限性主要有三个。第一,依赖评估函数的稳定性——如果评估有噪声,优化可能震荡。第二,每轮需要测试集上跑 N 个任务——对大型测试集(10K+ 任务)成本高。第三,优化器 LLM 与任务 LLM 是同一个时,存在"自我优化偏差"。
针对这些局限,OPRO 的工程实践有几个变体:双 LLM 优化(用一个更强 LLM 优化 prompt,用一个更便宜 LLM 执行)、评估采样(每轮只跑 50-100 个任务的子集)、早停机制(连续 3 轮无提升则停止)。
复述框 · 4.2 节要点
- OPRO = LLM as Optimizer:把 prompt 优化转化为 LLM 爬山。
- 核心结果:GSM8K 从 80% 提升到 95%,自动发现"Let's think step by step"。
- 三个变体:双 LLM、评估采样、早停机制。
4.3 DSPy:把 prompt 编译为可签名
DSPy 由 Stanford NLP 团队在 2023 年提出,是一个把 prompt 工程从"自然语言编写"转向"程序编译"的框架。DSPy 的核心思想是:prompt 不应该是字符串,而应该是程序——可以由编译器自动优化。
图 4.3 · DSPy 的签名与模块化编程
# 传统 prompt 工程
prompt = "请把以下英文翻译成中文: {text}"
result = llm(prompt.format(text="Hello World"))
# DSPy 风格
class Translate(dspy.Signature):
"""把英文翻译成中文。"""
text: str = dspy.InputField()
translation: str = dspy.OutputField()
# 自动优化 prompt
optimized = dspy.BootstrapFewShot(metric=accuracy).compile(
Translate(),
trainset=train_data
)
关键点:DSPy 把 prompt 转化为带类型签名的"模块"(类似函数签名),编译器自动生成 few-shot 示例和指令。这是把 prompt 工程从"艺术"变成"工程"的关键。
DSPy 的核心组件有三个。Signature(签名)定义任务的输入输出类型。Module(模块)是包含 LLM 调用的可组合单元(类似 PyTorch 的 nn.Module)。Optimizer(优化器)是自动调整 few-shot 示例、指令甚至模型权重的编译器。
DSPy 提供多种优化器:
- BootstrapFewShot:从训练集中 bootstrap 出 few-shot 示例
- BootstrapFewShotWithRandomSearch:在前者基础上加入随机搜索
- MIPRO:用贝叶斯优化搜索最优 prompt
- BootstrapFinetune:把优化结果微调进模型权重
DSPy 在多个基准上达到了 SOTA。在 Stanford 的 HotPotQA 多跳问答任务上,DSPy 把 GPT-3.5 的准确率从 48% 提升到 71%。在 BIG-Bench Hard 上,DSPy 优化后的 prompt 显著优于手工 prompt。
DSPy 的工程意义在于把 prompt 工程变成了软件工程。开发者写"签名"和"模块",编译器生成实际 prompt。这意味着 prompt 优化可以纳入 CI/CD、版本控制、单元测试等软件工程基础设施。
复述框 · 4.3 节要点
- DSPy = Prompt as Program:把 prompt 转化为带签名的程序。
- 三大组件:Signature、Module、Optimizer。
- 核心结果:HotPotQA 上 GPT-3.5 从 48% 提升到 71%。
4.4 PromptAgent:用 MCTS 策略性搜索
PromptAgent 由清华大学等机构在 2023 年 10 月提出,是把 蒙特卡洛树搜索(MCTS) 引入 prompt 优化的代表工作。OPRO 和 DSPy 的核心机制是"生成新 prompt 后评估",PromptAgent 则更进一步:在搜索树上规划多步 prompt 演化。
图 4.4 · PromptAgent 的 MCTS 搜索树
┌─────────────┐
│ 初始 prompt │
│ P_0 (得分 60)│
└──────┬──────┘
│
┌───────────────┼───────────────┐
│ │ │
┌───▼───┐ ┌───▼───┐ ┌───▼───┐
│ P_1 │ │ P_2 │ │ P_3 │
│ 65 │ │ 70 │ │ 62 │
└───┬───┘ └───┬───┘ └───┬───┘
│ │ │
┌────┴────┐ ┌────┴────┐ ┌────┴────┐
│ │ │ │ │ │
┌───▼───┐ ┌───▼───┐ ┌───▼───┐ ┌───▼───┐ ┌───▼───┐ ...
│ P_1.1 │ │ P_1.2 │ │ P_2.1 │ │ P_2.2 │ │ P_3.1 │
│ 72 │ │ 68 │ │ 78 │ │ 75 │ │ 70 │
└───────┘ └───────┘ └───────┘ └───────┘ └───────┘
↑
MCTS 选择最 promising 的分支
关键点:MCTS 让 prompt 优化从"局部爬山"变成"全局搜索",避免陷入次优解。
PromptAgent 的 MCTS 包含四个步骤:
- 选择(Selection):从根节点出发,根据 UCB1 公式选择最有 promising 的子节点。
- 扩展(Expansion):在选中的节点添加新的子节点(新 prompt 候选)。
- 模拟(Simulation):在测试集上跑子节点,估算其价值。
- 反向传播(Backpropagation):把模拟结果反向传播到根节点,更新所有祖先节点的访问计数和价值估计。
PromptAgent 的关键创新是把专家策略(Expert Strategy)注入到 LLM 的"模拟"步骤。在模拟时,LLM 不只是评估 prompt 的得分,还要给出"为什么这个 prompt 更好/更差"的分析。这种"专家推理"让 LLM 能避免 OPRO 中常见的"重复同样的错误 prompt"问题。
PromptAgent 在多个推理任务上达到 SOTA。在 HotPotQA 上,PromptAgent + GPT-4 达到了 73.2% 准确率,超过了 OPRO 的 71.8%。在 Game of 24 数学推理任务上,PromptAgent 达到了 79.7%,显著超过 CoT 的 56.3%。
复述框 · 4.4 节要点
- PromptAgent = MCTS + 专家策略:把全局搜索引入 prompt 优化。
- 四步循环:选择→扩展→模拟→反向传播。
- 核心结果:Game of 24 从 CoT 的 56% 提升到 80%。
4.5 自修改 prompt 的安全边界
自修改 prompt 带来了 4 类新的安全风险,Agent 设计师必须明确处理。
风险一:prompt 注入放大。 当 prompt 可以自修改时,外部输入(如工具返回的内容)可以通过"prompt injection"机制污染 prompt。攻击者构造的恶意输入可能被优化器 LLM 当作"高得分 prompt"采纳,导致整个系统被劫持。防护措施:所有外部输入必须经过 sanitize 后才能进入 prompt 评估集。
风险二:prompt 漂移失控。 优化器 LLM 可能发现一些"短期得分高但长期有害"的 prompt——例如通过隐瞒关键信息、欺骗评估器。防护措施:维护一个"黄金 prompt 集合",定期回归测试,检测漂移。
风险三:成本爆炸。 自修改 prompt 的 API 成本可能是静态 prompt 的 100-1000 倍。OPRO 跑 8 轮 × 100 任务 × 1 prompt/query = 800 次 LLM 调用。防护措施:硬预算上限 + 早停机制。
风险四:可复现性损失。 当 prompt 持续自修改时,"今天的 prompt"与"明天的 prompt"不同,调试和审计变得困难。防护措施:所有 prompt 修改必须版本化(git-style),每次修改有 commit message 和评估记录。
表 4.1 · 自修改 prompt 的 4 类风险与防护
| 风险 | 触发条件 | 防护措施 | 严重度 |
|---|---|---|---|
| prompt 注入放大 | 外部输入污染评估集 | sanitize + 隔离评估 | 高 |
| prompt 漂移失控 | 优化器发现"短期得分高"的 hack | 黄金集合回归测试 | 中 |
| 成本爆炸 | 多轮优化 × 大量任务 | 硬预算 + 早停 | 中 |
| 可复现性损失 | prompt 持续变化 | 版本化 + commit message | 低 |
复述框 · 4.5 节要点
- 4 类风险:注入放大、漂移失控、成本爆炸、可复现性损失。
- 共同原则:所有 prompt 修改必须可审计、可回滚、有硬预算上限。
4.6 本章小结与第 5 章预告
本章从工程角度展开 prompt 自修改。静态 prompt 三局限(不可优化、不可度量、不可演化)引出自修改 prompt 四元组。OPRO 用 LLM 作爬山,DSPy 把 prompt 编译为签名,PromptAgent 用 MCTS 全局搜索。4 类安全风险必须在工程实践中明确处理。
常见误区
- ❌ 把 prompt 自修改当"全自动":自修改需要持续人工监督,否则会漂移到不可控状态。
- ❌ 忽视成本:自修改 prompt 的 API 成本是静态 prompt 的 100-1000 倍,必须有硬预算。
- ❌ 假设优化器 LLM 与执行 LLM 等价:它们是不同的角色,应该分别选择(优化器用强模型,执行用便宜模型)。
- ❌ 把"自动发现"的 prompt 当作"最优":自动发现的 prompt 可能过拟合测试集,需要在独立验证集上重新评估。
第 5 章将进入上下文工程与短期记忆。自修改 prompt 解决了"用哪段 prompt"的问题,但 prompt 必须放在 context window 里。context window 的有限性、长期对话的累积性、多轮反思的存储性——这些是第 5 章要解决的核心问题。
本章小结
- 静态 prompt 三局限:不可优化、不可度量、不可演化。
- 自修改 prompt 四元组:(P₀, T, M, V) 与迭代公式 (P_{t+1} = M(P_t, V))。
- 三大范式:OPRO(LLM 爬山)、DSPy(签名编译)、PromptAgent(MCTS 全局搜索)。
- 4 类安全风险:注入放大、漂移失控、成本爆炸、可复现性损失。
推荐阅读
- 📖 OPRO 原始论文 [Yang et al., 2024]:LLM 作为优化器的开山工作。$TRAE_REF
- 📖 DSPy 原始论文 [Khattab et al., 2024]:把 prompt 编译为签名的工程化框架。$TRAE_REF
- 📖 PromptAgent 原始论文 [Cheng et al., 2024]:用 MCTS 策略性搜索 prompt 空间。$TRAE_REF
- 📖 Chain-of-Thought Prompting [Wei et al., 2022]:自修改 prompt 自动发现的"step by step"模式源头。
- 📖 Self-Evolving Agents 综述 [Fang et al., 2025]:把 prompt 自修改纳入自进化 Agent 统一框架。$TRAE_REF
练习题
- 设计题:为一个"客服 Agent"设计 OPRO 优化的 4 元素(P₀, T, M, V)。具体说明每个元素的实现方式、成本估算、终止条件。
- 分析题:选一个真实 LLM 应用(GitHub Copilot、ChatGPT、Claude.ai),分析它的 prompt 是静态还是动态的。如果是动态的,用什么机制?成本是多少?
- 动手题:用 Python 实现一个简化版 OPRO(不超过 100 行):给定 10 个 GSM8K 风格的算术题,用 LLM 爬山优化 prompt,记录每轮的 top-3 prompt 和得分。
- 设计题:把 DSPy 签名概念应用到一个新场景:自动生成会议纪要。设计
MeetingSummary签名,包含输入字段、输出字段、评估指标。 - 批判题:PromptAgent 的 MCTS 搜索是"全局最优"的吗?请用搜索复杂度理论分析:随着 prompt 空间维度 d 增长,MCTS 的样本复杂度如何变化?
- 工程实践题:为一个生产环境的 LLM Agent 设计"prompt 自修改"的安全护栏:包括注入检测、漂移检测、成本控制、可复现性保证 4 个机制。
参考文献(本章内)
- Yang, C., et al. (2024). Large Language Models as Optimizers (OPRO). ICLR. $TRAE_REF
- Khattab, O., et al. (2024). DSPy: Compiling Declarative Language Model Calls into Self-Improving Pipelines. ICLR. $TRAE_REF
- Cheng, J., et al. (2024). PromptAgent: Strategic Planning with Language Models Enables Expert-level Prompt Optimization. ICLR. $TRAE_REF
- Wei, J., et al. (2022). Chain-of-Thought Prompting Elicits Reasoning in Large Language Models. NeurIPS. $TRAE_REF
- Ye, Q., et al. (2024). An Evolved Universal Prompt Optimizer (PE2). arXiv:2401.15442.
- Fernando, C., et al. (2023). Promptbreeder: Self-Referential Self-Improvement via Prompt Evolution. arXiv:2309.16797.
- Zhou, Y., et al. (2023). Large Language Models Are Human-Level Prompt Engineers (APE). ICLR. $TRAE_REF
- Fang, J., et al. (2025). A Comprehensive Survey of Self-Evolving AI Agents. arXiv:2508.07407. $TRAE_REF
本章进度:4.1–4.6 节全部完成(约 5,500 字,含 4 张图 + 1 张表 + 8 篇引用 + 6 题 + 4 误区 + 5 推荐),达到 22 页计划。
status: final。