PRewrite:基于强化学习的提示重写

论文概述

PRewrite针对人工提示工程耗时且效果不佳的问题,引入了一种基于强化学习的自动化工具,能够将草稿提示重写为高效提示。与人工试错或僵化的基于模板的方法不同,PRewrite使用强化学习在大型动作空间中实现端到端优化,生成人类可读且自我解释的提示。从人工起草的初始提示开始使重写过程更加引导化和高效。在多样化数据集上的实验表明,PRewrite生成的提示不仅优于专业制作的提示,还超越了其他自动化方法生成的提示。

论文信息:

  • 发布时间:2024-01-16
  • 作者:Weize Kong, Spurthi Amba Hombaiah, Mingyang Zhang等
  • 机构:Google, 密歇根大学
  • 研究方向:提示工程, 大型语言模型推理
  • 核心技术:提示优化

研究背景

大型语言模型在各类任务中展现出强大的能力,但提示工程仍然是一个耗时且需要专业知识的过程。本研究针对以下问题展开:

现有问题

  • 人工提示工程耗时且效率低下
  • 难以在大型提示空间中找到最优提示
  • 现有自动化方法生成的提示可读性差或效果不佳

研究动机

本研究旨在开发一种基于强化学习的自动化提示优化方法,能够在保持人类可读性的同时实现端到端优化,特别关注强化学习、提示重写、自动化优化等关键技术。

核心方法

方法概述

PRewrite使用强化学习框架:(1)状态:当前提示及其性能指标;(2)动作空间:大型可能提示修改空间,包括改述、添加/删除指令、重组;(3)奖励:验证集上的任务性能(例如准确率、F1分数);(4)策略网络:学习选择最大化下游任务性能的提示修改;(5)训练:使用PPO(近端策略优化)迭代改进重写策略;(6)初始化:从用户提供的草稿提示开始,以利用领域知识并减少搜索空间。

本方法的核心在于通过强化学习自动化提示优化过程,从初始草稿提示出发,迭代生成高效且人类可读的提示。

关键创新点

创新 1:引入基于强化学习的自动化提示重写,从用户提供的草稿提示开始

创新 2:在大型动作空间中实现端到端优化,无需人工特征工程

创新 3:生成人类可读且自我解释的提示,不同于某些先前的自动化方法

创新 4:在多个数据集上超越专业制作的提示

创新 5:超越其他自动化提示优化方法

创新 6:利用草稿提示作为初始化,使优化更加引导化和高效

创新 7:展示了在现实大型语言模型应用开发中的实用适用性

技术特点

  • 自动化:大幅减少人工提示工程的时间和精力
  • 端到端优化:直接优化任务性能指标
  • 人类可读:生成的提示保持可读性和可解释性
  • 引导式优化:从草稿提示开始,而非盲目搜索
  • 适应性强:可应用于各种任务和领域

实验结果

Benchmark 性能

在多样化的任务和数据集上进行了评估:问答、文本分类、自然语言推理和生成任务。比较包括:(1)领域专家制作的人工提示;(2)基于模板的方法;(3)先前的自动化方法(APE、OPRO);(4)零样本和少样本基线。结果显示持续改进,PRewrite提示实现了更高的准确率和更好的泛化能力。人类评估证实PRewrite提示可读且可解释。消融研究展示了强化学习框架、草稿初始化和奖励设计的价值。分析表明PRewrite学习了任务特定的策略,如强调关键要求和提供有用的约束。

性能分析

实验结果表明,该方法生成的提示在多个任务上都优于人工制作的提示和其他自动化方法,同时保持了良好的可读性。

关键发现

  • 超越人工:自动生成的提示优于专业人工制作的提示
  • 策略学习:强化学习成功学习任务特定的优化策略
  • 初始化重要:从草稿提示开始显著提高优化效率
  • 可读性保持:生成的提示保持人类可读和可解释

实际应用

适用场景

  • 问答系统:优化问答任务的提示
  • 文本分类:改进分类任务的提示效果
  • 内容生成:优化生成任务的提示质量
  • 提示工程加速:快速迭代和优化提示

实现建议

在实际项目中应用提示优化时,建议:

  1. 准备草稿提示:先人工编写一个基本的草稿提示作为起点
  2. 定义评估指标:明确任务性能的评估标准
  3. 准备验证集:提供代表性的验证数据用于优化
  4. 迭代优化:允许多轮优化以达到最佳效果

代码示例

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# PRewrite实现框架
class PromptRewriter:
def __init__(self, initial_prompt, task_evaluator):
self.current_prompt = initial_prompt
self.evaluator = task_evaluator
self.policy = PPOPolicy()

def rewrite_step(self):
"""执行一步提示重写"""
# 生成可能的修改动作
actions = self.generate_actions(self.current_prompt)

# 策略网络选择动作
selected_action = self.policy.select_action(
self.current_prompt,
actions
)

# 应用修改
new_prompt = self.apply_action(
self.current_prompt,
selected_action
)

# 评估新提示
reward = self.evaluator.evaluate(new_prompt)

# 更新策略
self.policy.update(
self.current_prompt,
selected_action,
reward
)

if reward > self.evaluator.evaluate(self.current_prompt):
self.current_prompt = new_prompt

return self.current_prompt, reward

def generate_actions(self, prompt):
"""生成可能的提示修改动作"""
actions = []

# 改述动作
actions.append({
'type': 'paraphrase',
'target': 'full_prompt'
})

# 添加指令动作
actions.append({
'type': 'add_instruction',
'content': '请逐步思考'
})

# 重组动作
actions.append({
'type': 'restructure',
'new_order': [2, 1, 3]
})

return actions

def optimize(self, num_iterations=100):
"""执行完整优化过程"""
for i in range(num_iterations):
prompt, reward = self.rewrite_step()
print(f"迭代 {i}: 奖励 = {reward}")

return self.current_prompt

# 使用示例
initial_prompt = "请回答以下问题:{question}"
evaluator = TaskEvaluator(validation_data)
rewriter = PromptRewriter(initial_prompt, evaluator)

optimized_prompt = rewriter.optimize(num_iterations=50)
print(f"优化后的提示: {optimized_prompt}")

相关资源

  • arXiv 论文arXiv:2401.08189
  • 相关论文:APE, OPRO, Reinforcement Learning for NLP
© 2025 Generative AI Discovery All Rights Reserved.
Theme by hiero