4. 提示词工程:从静态到动态

第 4 章 · 提示词工程:从静态到动态

"把 prompt 视为可执行代码——可以被运行、测试、版本化、自动优化。"

学习目标

完成本章后,读者应能够:

  1. 区分静态 prompt 与可优化 prompt 的工程意义
  2. 跑通 OPRO、DSPy、PromptAgent 三种自动 prompt 优化范式
  3. 评估 prompt 优化的效果(准确率)与成本(token / API 调用)
  4. 理解 prompt 自修改在 L1 → L4 层级跃迁中的位置
  5. 识别 prompt 自修改的 4 类安全风险

先修知识

章节地图


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_{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 数据集上达到了以下结果(来自原论文):

更引人注目的是 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 提供多种优化器:

  1. BootstrapFewShot:从训练集中 bootstrap 出 few-shot 示例
  2. BootstrapFewShotWithRandomSearch:在前者基础上加入随机搜索
  3. MIPRO:用贝叶斯优化搜索最优 prompt
  4. 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 包含四个步骤:

  1. 选择(Selection):从根节点出发,根据 UCB1 公式选择最有 promising 的子节点。
  2. 扩展(Expansion):在选中的节点添加新的子节点(新 prompt 候选)。
  3. 模拟(Simulation):在测试集上跑子节点,估算其价值。
  4. 反向传播(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 章要解决的核心问题。


本章小结

推荐阅读

练习题

  1. 设计题:为一个"客服 Agent"设计 OPRO 优化的 4 元素(P₀, T, M, V)。具体说明每个元素的实现方式、成本估算、终止条件。
  2. 分析题:选一个真实 LLM 应用(GitHub Copilot、ChatGPT、Claude.ai),分析它的 prompt 是静态还是动态的。如果是动态的,用什么机制?成本是多少?
  3. 动手题:用 Python 实现一个简化版 OPRO(不超过 100 行):给定 10 个 GSM8K 风格的算术题,用 LLM 爬山优化 prompt,记录每轮的 top-3 prompt 和得分。
  4. 设计题:把 DSPy 签名概念应用到一个新场景:自动生成会议纪要。设计 MeetingSummary 签名,包含输入字段、输出字段、评估指标。
  5. 批判题:PromptAgent 的 MCTS 搜索是"全局最优"的吗?请用搜索复杂度理论分析:随着 prompt 空间维度 d 增长,MCTS 的样本复杂度如何变化?
  6. 工程实践题:为一个生产环境的 LLM Agent 设计"prompt 自修改"的安全护栏:包括注入检测、漂移检测、成本控制、可复现性保证 4 个机制。

参考文献(本章内)

  1. Yang, C., et al. (2024). Large Language Models as Optimizers (OPRO). ICLR. $TRAE_REF
  2. Khattab, O., et al. (2024). DSPy: Compiling Declarative Language Model Calls into Self-Improving Pipelines. ICLR. $TRAE_REF
  3. Cheng, J., et al. (2024). PromptAgent: Strategic Planning with Language Models Enables Expert-level Prompt Optimization. ICLR. $TRAE_REF
  4. Wei, J., et al. (2022). Chain-of-Thought Prompting Elicits Reasoning in Large Language Models. NeurIPS. $TRAE_REF
  5. Ye, Q., et al. (2024). An Evolved Universal Prompt Optimizer (PE2). arXiv:2401.15442.
  6. Fernando, C., et al. (2023). Promptbreeder: Self-Referential Self-Improvement via Prompt Evolution. arXiv:2309.16797.
  7. Zhou, Y., et al. (2023). Large Language Models Are Human-Level Prompt Engineers (APE). ICLR. $TRAE_REF
  8. 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