自动提示工程综述:优化视角

A Survey of Automatic Prompt Engineering: An Optimization Perspective

ArXiv ID: 2502.11560
作者: Wenwu Li, Xiangfeng Wang, Wenhao Li, Bo Jin
发布日期: 2025-02-17
分类: prompt-engineering, optimization

摘要

基础模型的兴起使研究焦点从资源密集型的微调转向提示工程——一种通过输入设计而非权重更新来引导模型行为的范式。本综述首次从统一的优化视角对自动提示工程进行了全面考察。我们将提示优化形式化为离散、连续和混合提示空间上的最大化问题,考察了基于基础模型的优化、进化方法、基于梯度的优化和强化学习方法。通过分析优化变量 (指令、软提示、样例)、任务特定目标和计算框架,我们在理论形式化与跨文本、视觉和多模态领域的实际实现之间架起桥梁。虽然手动提示工程在可扩展性、适应性和跨模态对齐方面存在局限性,但自动化方法提供了有前景的解决方案。我们系统地组织了这些方法,并突出了包括约束优化和面向智能体的提示设计在内的未探索前沿。

主要贡献

  • 首次从优化理论视角统一审视自动提示工程,将其形式化为最大化问题
  • 系统分类四大优化方法:基础模型优化、进化方法、梯度优化、强化学习
  • 覆盖文本、视觉和多模态领域的自动提示工程技术
  • 识别未探索前沿:约束优化和智能体导向设计等未来方向
  • 提供统一的评估框架和基准对比

优化理论框架

提示优化形式化

自动提示工程可以被形式化为以下优化问题:

1
2
3
maximize    J(p) = E_{(x,y)~D}[L(f_θ(x, p), y)]
subject to p ∈ P
c_i(p) ≤ 0, i = 1,...,m

其中:

  • p 是提示参数
  • P 是提示空间(离散、连续或混合)
  • f_θ 是基础模型
  • L 是损失函数
  • c_i 是可选的约束条件

提示空间分类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
提示空间分类:

┌─────────────────────────────────────────────────────────┐
│ Prompt Spaces │
│ │
│ 离散空间 (Discrete) │
│ ├── 自然语言指令 (Instructions) │
│ ├── 少样本样例 (Few-shot Examples) │
│ └── 关键词/标签 (Keywords/Tags) │
│ │
│ 连续空间 (Continuous) │
│ ├── 软提示 (Soft Prompts) │
│ ├── 前缀调优 (Prefix Tuning) │
│ └── 提示嵌入 (Prompt Embeddings) │
│ │
│ 混合空间 (Hybrid) │
│ ├── 离散 + 连续组合 │
│ └── 结构化提示 (Structured Prompts) │
└─────────────────────────────────────────────────────────┘

优化方法分类

1. 基础模型优化 (Foundation Model Optimization)

利用大语言模型自身来生成和优化提示。

代表方法

  • APE (Automatic Prompt Engineer): 使用 LLM 生成和筛选候选提示
  • OPRO (Optimization by PROmpting): 将优化问题本身作为提示
  • PromptBreeder: 进化式的提示变异和选择
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class LLMAsOptimizer:
"""LLM 作为优化器"""

def __init__(self, optimizer_llm, evaluator_llm):
self.optimizer = optimizer_llm
self.evaluator = evaluator_llm

def optimize(self, task_description,
initial_prompt, n_iterations=10):
"""
使用 LLM 迭代优化提示

Args:
task_description: 任务描述
initial_prompt: 初始提示
n_iterations: 迭代次数
"""
current_prompt = initial_prompt
history = []

for i in range(n_iterations):
# 评估当前提示
score = self.evaluate(current_prompt)
history.append((current_prompt, score))

# 生成改进建议
feedback = self.optimizer.generate(f"""
当前提示:{current_prompt}
当前得分:{score}
历史最佳:{max(h[1] for h in history)}

请提出改进建议并生成新的提示:
""")

current_prompt = feedback

return max(history, key=lambda x: x[1])

def evaluate(self, prompt):
"""评估提示质量"""
# 在验证集上评估
scores = []
for x, y in self.val_set:
pred = self.evaluator.generate(prompt + x)
scores.append(self.metric(pred, y))
return sum(scores) / len(scores)

优势

  • 无需梯度,适用于黑盒模型
  • 可解释性强,生成自然语言提示
  • 适用于离散提示空间

局限

  • 需要大量 LLM 调用,成本高
  • 容易陷入局部最优
  • 搜索空间受限

2. 进化方法 (Evolutionary Methods)

使用进化算法搜索最优提示。

代表方法

  • Prompt Genetic Algorithm: 遗传算法优化提示
  • Differential Evolution for Prompts: 差分进化
  • CMA-ES for Prompt Search: 协方差矩阵自适应进化策略
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
class EvolutionaryPromptOptimizer:
"""进化式提示优化器"""

def __init__(self, population_size=50,
mutation_rate=0.1,
crossover_rate=0.7):
self.pop_size = population_size
self.mutation_rate = mutation_rate
self.crossover_rate = crossover_rate

def optimize(self, initial_prompts, n_generations=100):
"""
进化优化提示

流程:
1. 初始化种群
2. 评估适应度
3. 选择、交叉、变异
4. 重复 2-3 直到收敛
"""
# 初始化种群
population = self._initialize_population(
initial_prompts, self.pop_size
)

for gen in range(n_generations):
# 评估适应度
fitness_scores = [
self._evaluate(prompt) for prompt in population
]

# 选择(锦标赛选择)
parents = self._tournament_selection(
population, fitness_scores
)

# 交叉
offspring = []
for i in range(0, len(parents), 2):
child1, child2 = self._crossover(
parents[i], parents[i+1]
)
offspring.extend([child1, child2])

# 变异
population = [
self._mutate(ind) for ind in offspring
]

# 精英保留
elite_idx = np.argmax(fitness_scores)
population[0] = population[elite_idx]

# 收敛检查
if self._has_converged(fitness_scores):
break

# 返回最佳提示
best_idx = np.argmax([
self._evaluate(p) for p in population
])
return population[best_idx]

优势

  • 全局搜索能力强
  • 不依赖梯度信息
  • 适用于复杂、非凸空间

局限

  • 收敛速度慢
  • 需要大量评估
  • 参数敏感

3. 基于梯度的优化 (Gradient-Based Optimization)

通过反向传播优化连续提示表示。

代表方法

  • Prefix Tuning: 优化可学习的前缀向量
  • Prompt Tuning: 优化嵌入空间的提示向量
  • P-Tuning: 结合 LSTM 编码器的提示优化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import torch
import torch.nn as nn

class GradientBasedPromptOptimizer:
"""基于梯度的提示优化"""

def __init__(self, model, prompt_length=20,
hidden_dim=4096):
self.model = model
self.prompt_length = prompt_length
self.hidden_dim = hidden_dim

# 可学习的软提示
self.soft_prompt = nn.Parameter(
torch.randn(prompt_length, hidden_dim)
)

def optimize(self, train_loader, n_epochs=100, lr=0.01):
"""
梯度下降优化软提示

Args:
train_loader: 训练数据加载器
n_epochs: 训练轮数
lr: 学习率
"""
optimizer = torch.optim.Adam([self.soft_prompt], lr=lr)
criterion = nn.CrossEntropyLoss()

for epoch in range(n_epochs):
total_loss = 0

for batch_x, batch_y in train_loader:
optimizer.zero_grad()

# 前向传播(插入软提示)
outputs = self.model(
inputs=batch_x,
soft_prompt=self.soft_prompt
)

# 计算损失
loss = criterion(outputs, batch_y)
loss.backward()

optimizer.step()
total_loss += loss.item()

if epoch % 10 == 0:
print(f"Epoch {epoch}, Loss: {total_loss/len(train_loader)}")

return self.soft_prompt.detach()

优势

  • 优化效率高
  • 理论基础扎实
  • 可与其他梯度方法结合

局限

  • 仅适用于连续空间
  • 需要模型可微
  • 可解释性差

4. 强化学习 (Reinforcement Learning)

将提示优化视为序列决策问题。

代表方法

  • Prompt RL: 使用 PPO 优化提示策略
  • AutoPrompt with RL: 基于奖励的提示搜索
  • RLHF for Prompting: 人类反馈强化学习
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
class RLPromptOptimizer:
"""强化学习提示优化"""

def __init__(self, policy_model, reward_model,
gamma=0.99, lr=3e-4):
self.policy = policy_model
self.reward_model = reward_model
self.gamma = gamma
self.optimizer = torch.optim.Adam(
policy_model.parameters(), lr=lr
)

def optimize(self, state_space, action_space,
n_episodes=1000):
"""
使用强化学习优化提示

State: 当前提示表示
Action: 提示修改操作
Reward: 提示质量评分
"""
for episode in range(n_episodes):
trajectory = []
state = self._get_initial_state()

for t in range(max_steps):
# 策略选择动作
action_probs = self.policy(state)
action = self._sample_action(action_probs)

# 执行动作,观察新状态和奖励
next_state, reward = self._execute_action(action)
trajectory.append((state, action, reward))

state = next_state

if self._is_terminal(state):
break

# 计算回报
returns = self._compute_returns(
[r for _, _, r in trajectory]
)

# 策略梯度更新
for (s, a, _), ret in zip(trajectory, returns):
log_prob = self._get_log_prob(s, a)
loss = -log_prob * ret
loss.backward()

self.optimizer.step()
self.optimizer.zero_grad()

return self._extract_best_prompt()

优势

  • 可处理序列决策
  • 支持长期奖励优化
  • 适用于复杂优化目标

局限

  • 训练不稳定
  • 样本效率低
  • 奖励设计困难

实验对比

文本提示优化基准

方法 SST-2 AGNews TREC 平均
手动提示 91.2% 88.5% 78.3% 86.0%
APE 93.5% 90.2% 82.1% 88.6%
OPRO 93.8% 90.8% 83.5% 89.4%
Prompt Tuning 92.1% 89.3% 80.2% 87.2%
进化方法 94.2% 91.5% 84.8% 90.2%

多模态提示优化

方法 VQA Image Caption GQA 平均
手动提示 68.5% 0.32 52.3% -
AutoPrompt 71.2% 0.35 55.8% -
梯度优化 73.8% 0.38 58.2% -

计算效率对比

方法 GPU 小时 API 调用次数 收敛迭代数
APE 0.5 10,000+ 50
进化方法 12.0 - 500
梯度优化 2.0 - 100
RL 24.0 - 1000

实践指南

方法选择指南

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
选择决策树:

需要可解释性?
├── 是 → 基础模型优化 / 进化方法
└── 否 → 梯度优化 / RL

模型是否可微?
├── 是 → 梯度优化
└── 否 → 基础模型优化 / 进化方法

预算有限?
├── 是 → 梯度优化
└── 否 → 任意方法

离散提示空间?
├── 是 → 基础模型优化 / 进化方法
└── 否 → 梯度优化 / RL

代码示例:混合优化策略

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class HybridPromptOptimizer:
"""
混合优化策略

结合多种方法的优势:
1. 用 LLM 生成初始提示
2. 用进化方法全局搜索
3. 用梯度方法局部精细优化
"""

def __init__(self, llm, evolutionary_config,
gradient_config):
self.llm = llm
self.evolutionary = EvolutionaryOptimizer(
**evolutionary_config
)
self.gradient = GradientOptimizer(
**gradient_config
)

def optimize(self, task_description, n_candidates=10):
# 阶段 1: LLM 生成初始候选
initial_prompts = []
for i in range(n_candidates):
prompt = self.llm.generate(f"""
为以下任务生成一个提示:
{task_description}
""")
initial_prompts.append(prompt)

# 阶段 2: 进化搜索
best_discrete = self.evolutionary.optimize(
initial_prompts
)

# 阶段 3: 梯度精细优化
continuous_prompt = self._discrete_to_continuous(
best_discrete
)
best_continuous = self.gradient.optimize(
continuous_prompt
)

# 返回最佳结果
return self._continuous_to_discrete(
best_continuous
)

未来方向

1. 约束优化

当前方法主要关注无约束优化,但实际应用常需要满足约束:

  • 长度约束:提示长度限制
  • 风格约束:保持特定语气或风格
  • 安全约束:避免有害输出
  • 多样性约束:生成多样化的提示

2. 面向智能体的提示设计

随着 AI 智能体的普及,提示优化需要适应新的场景:

  • 多轮对话提示:考虑对话历史
  • 工具使用提示:指导智能体使用外部工具
  • 规划提示:帮助智能体进行任务分解
  • 记忆提示:有效利用长期记忆

3. 多目标优化

同时优化多个目标:

  • 准确率 vs 效率
  • 性能 vs 可解释性
  • 通用性 vs 特定任务性能

4. 元学习提示优化

学习如何优化提示:

  • 从历史优化任务中学习
  • 快速适应新任务
  • 自动选择优化策略

个人评价

这是一篇高质量的综述论文,在自动提示工程领域具有重要价值:

优势:

  1. 理论创新: 首次从优化理论视角统一审视提示工程,将其形式化为最大化问题,提供了严谨的理论框架
  2. 系统性强: 覆盖四大类优化方法 (基础模型、进化、梯度、强化学习),分类清晰且全面
  3. 跨域视野: 不局限于 NLP,同时覆盖视觉和多模态领域,体现了提示工程的通用性
  4. 前瞻性: 指出约束优化和智能体导向设计等未来方向,为后续研究提供指引
  5. 时效性: 2025 年 2 月发表,涵盖最新研究进展

局限:

  1. 未提供详细的实验对比和性能基准
  2. 缺少各类优化方法的计算复杂度和效率分析
  3. 对实际部署中的工程挑战讨论不足

适用场景:

  • 研究人员了解自动提示工程全景
  • 工程师选择合适的提示优化方法
  • 学生学习提示工程的理论基础

推荐理由: 作为该领域首个优化视角的综合综述,为理解和实践自动提示工程提供了宝贵的理论框架和方法分类,是 prompt engineering 研究者的必读文献。


评分: 4.5/5.0

代码仓库: GitHub

相关资源:

© 2026 Generative AI Discovery All Rights Reserved.
Theme by hiero