PromptAgent:基于LLM进行策略规划,实现专家级别的提示优化
加州大学的团队提出了一个名为PromptAgent的框架,它能够自动优化Prompt。该框架结合了大模型的自我反思特点与蒙特卡洛树搜索规划算法,通过自动迭代检查Prompt并对其进行改进的方式,寻找通往最优Prompt的路径。
针对开源的LLM,有论文指出可以利用其内部状态或梯度来训练附加参数,比如Soft prompt、基于梯度搜索或者RL的方式来得到离散提示,但是这些方法对于已经封装好的闭源模型(ChatGPT3.5-turbo、GPT4)不可用,而无梯度Prompt优化的方法基本上采用的是基于Prompt采样的迭代过程,即从初始提示开始,对候选Prompt进行迭代采样并对它们进行评分,然后选择下一次迭代的最佳提示。这些方法强调多样化的提示候选,包括基于编辑的方法(删除或者交换短语、回译等)、基于对采样进行优化的方法(蒙特卡洛搜索、吉布斯抽样、束搜索等)而PromptAgent跟上面说的方法都不太相同,这种方法能够将初始Prompt从平平无奇变为媲美人类专家手工设计的Prompt。
论文标题:PROMPTAGENT: STRATEGIC PLANNING WITH LANGUAGE MODELS ENABLES EXPERT-LEVEL PROMPT OPTIMIZATION
论文链接:https://arxiv.org/pdf/2310.16427.pdf
先通过文章给出的示例感受一下普通用户的Prompt、基于抽样方法的Prompt和专家级Prompt之间存在的差别。
让我们以生物医学领域的命名实体识别任务为例,这个任务需要从句子中提取疾病等实体。
示例中普通用户的Prompt设置为:
从句子中提取疾病或状况(如果有)
上面这种简单粗暴的普通用户编写的Prompt可能能够完成部分简单任务,但是其效果并不好。
而基于抽样方法的专家级Prompt提供了更丰富的特定领域详细信息和结构化指导,其中包括任务描述、领域知识、解决方案指导、异常处理与输出格式。
而PromptAgent可以通过该Prompt所获得的结果指出错误,并不断优化Prompt,最后得到的Prompt如下:
您的任务是提取疾病或病症……避免纳入任何相关元素,例如遗传模式(如常染色体显性遗传)、基因或基因位点(如 PAH)、蛋白质或生物途径…
考虑特定疾病和更广泛的类别,并记住疾病和病症也可以作为常见的缩写或变体出现。按以下格式提供已识别的疾病或病症:{entity_1,entity_2,....} …
请注意,术语“locus”应被视为基因组位置,而不是疾病名称。
上图描述了PromptAgent框架中的NCBI最高平均奖励路径的MCTS状态-动作转换轨迹。初始状态为
s
0
s_0
s0,并配备有人工编写的提示。在每个状态转换步骤中,根据错误反馈调整先前的状态来制作新的提示。通过突出显示颜色来表明类似特定领域的见解。最后一个状态整合了整个轨迹的信息,将
F
1
F1
F1分数从0.521提高到0.645。
具体方法
PromptAgent 将提示优化问题表示为由元组
(
S
,
A
,
T
,
r
)
(S, A, T, r)
(S,A,T,r)组成的马尔可夫决策过程 (MDP)。这里,
S
S
S表示状态空间,
A
A
A是动作空间,
T
T
T定义转移函数T :
S
×
A
→
S
S × A→S
S×A→S,r是奖励函数r :
S
×
A
→
R
S × A → \mathbb{R}
S×A→R。
如下图(a)所示,对于任何给定的当前状态
s
t
s_t
st,PromptAgent 基于
a
t
∼
p
O
(
a
∣
s
t
,
m
1
)
a_t ∼ p_O (a|s_t, m_1)
at∼pO(a∣st,m1) 迭代生成一个动作
a
t
a_t
at,其中
m
1
m_1
m1 是优化器
L
L
M
O
LLM O
LLMO 用来促进动作生成的元提示。具体来说,下图 (b) 显示了动作生成的两步过程:从训练样本中收集基础模型的错误(步骤 1)并反映这些错误以得出有用的错误反馈(步骤 2)。之后,PromptAgent 根据转换函数
p
O
(
s
t
+
1
∣
s
t
,
a
t
,
m
2
)
pO (s_{t+1}|s_t, a_t, m_2)
pO(st+1∣st,at,m2) 获得新状态,其中
m
2
m_2
m2 是另一个帮助状态转换更新提示的元提示,也在
O
O
O 上操作。更具体地说,给定当前错误反馈作为动作,
m
2
m_2
m2 要求优化器生成新的提示(状态),以利用任何领域知识并有效解决模型错误,类似于提示专家根据错误反馈修改提示的方式。最后,应用动作
a
t
a_t
at 后每个新生成的状态
s
t
s_t
st 的质量由奖励函数
r
t
=
r
(
s
t
,
a
t
)
rt = r(s_t, a_t)
rt=r(st,at) 确定。与强化学习(RL)中奖励工程的复杂性相似,奖励的设计可能很复杂,以适应特定领域的知识或为感兴趣的任务指定的偏好。在不失去本框架在各种任务中的通用性的情况下,文章直接将奖励定义为与给定训练样本分开的保留集上的任务表现。然而,奖励的确切定义将取决于特定于任务的指标。
PromptAgent框架设计
PromptAgent的目标是将专家级的先验知识有效地整合到任务提示中,同时确保在广阔的Prompt空间中进行高效和策略性的搜索。所谓专家知识通过大模型如GPT-4生成,而其搜索策略使用的是著名的蒙特卡洛树搜索。整体框架如下图所示:
本文将任务Prompt定义为状态
s
t
s_t
st,而对Prompt的修改过程定义为执行动作
a
t
a_t
at。如上图(b)所示:
- 给定当前状态 s t s_t st(也就是初始Prompt),基础模型(gpt-3.5-turbo)从任务数据集获得初始输出,初始输出往往不如人意,需要进一步优化。
- 使用优化器模型(gpt-4)提供错误反馈并给出改进建议。
- 优化后的模型根据反馈更新Prompt并过渡到下一个状态 s t + 1 s_{t+1} st+1。
如此循环往复,最终导向专家级Prompt。
上述对prompt优化的过程可以无缝地将PromptAgent与主要的规划算法特别是蒙特卡洛树搜索(MCTS)相结合。从而产生最具普适性的专家级Prompt。
策略优化过程
蒙特卡洛树搜索(MCTS)通过逐步构建树状结构来实现策略搜索,如上图(a)所示,其中每个节点表示一个状态,每条边表示状态转移的动作。MCTS执行选择、扩展、模拟和反向传播四步走来迭代搜索。迭代过程在达到预定义的迭代次数后结束,选择最高回报的路径作为最终的Prompt。
- 选择:在每层选择最promising节点进行进一步的扩展和探索。在每次迭代中,它从根节点开始,遍历每树的每一层,选择每层的后续子节点,并在叶节点处停止。在选择每层的子节点时,利用了上界置信树算法(UCT),帮助在"选择最有希望的路径"和"探索新路径"之间找到一个好的平衡。具体如下所示:
其中 Q ( s t , a t ′ ) Q(s_t,a^{'}_{t}) Q(st,at′)表示在状态 s t s_t st执行动作 a t ′ a^{'}_{t} at′时的有可能获得的回报, A ( s t ) A(s_t) A(st)表示节点的动作集合, N ( s t ) \textit{N}(s_t) N(st)表示节点 s t s_t st的访问次数, c h ( s t , a t ′ ) ch(s_t,a^{'}_{t}) ch(st,at′)表示在应用动作 a t ′ a^{'}_{t} at′到节点 s t s_t st后得到的子节点,是一个用于调整探索的常数。
公式中第一项用于衡量路径的价值,而第二项衡量被访问节点的不确定性。换句话说,如果一个节点被探索得较少且其子节点也较少被访问过,那么第二项的值会较高。
- 扩展:在前一步选择到达的叶节点下面添加新的子节点来扩展树结构。通过多次应用动作生成和状态转换(上图(b))来完成的,从而产生多个新的动作和状态。需要注意的是,本文采样了多个训练批次得到多样化的错误反馈(动作)。在新的节点中,选择最高回报的节点作为下一个模拟步骤的输入。
- 模拟:模拟扩展阶段所选节点的未来轨迹,并计算如果选择该路径可能得到的回报。模拟策略的选择很灵活,比如选择随机移动直到达到终止状态。为了减少模拟的计算成本并简化过程,本文选择不断生成多个动作,并选择其中回报最高的节点,以快速进入下一个树级别。
- 反向传播:在模拟过程中遇到终止状态时,将进行反向传播。终止状态由预设的最大深度或提前停止条件决定。此时,通过更新Q值函数,沿着从根节点到终止节点的路径反向传播计算未来的回报。对于次条路径中的每个状态-动作对,聚合从状态
s
t
s_t
st开始的所有未来轨迹的回报来更新
Q
(
s
t
,
a
t
)
Q(s_t,a_t)
Q(st,at),更新方式如下:
这里 M M M表示从状态 s t s_t st开始的未来轨迹的数量, S s t j S^{j}_{s_t} Sstj和 A a t j A^{j}_{a_t} Aatj分别表示从状态 s t s_t st和动作 a t a_t at开始的第 j j j个状态序列和动作序列。
PromptAgent使用预设的迭代次数执行上述四个操作,当达到迭代次数后,选择具有最高回报的最佳路径中的最佳节点(即Prompt)进行最终评估。
实验
实验设置
为了全面评估PromptAgent对各种应用的影响,作者从三个不同领域精选了12个任务进行深入实验:
- 6个BIG-Bench Hard (BBH)任务,强调领域知识(如几何形状和因果判断)和复杂推理能力(如桌上的企鹅、物体计数、认识论推理和时间序列)。
- 3个生物医学领域特定任务:疾病命名实体识别(NER)、生物医学句子相似性任务(Biosses)和医学问答任务(Med QA)。
- 3个著名的自然语言理解任务,包括两个文本分类任务(TREC和Subj)和一个自然语言推理任务(CB)。
实验结果与分析
整体效果
下表中显示PromptAgent在BBH任务上明显优于所有基线。相对人类Prompt(ZS)、CoT和APE方法分别提升了28.9%、9.5%和11.2%。
对于需要广泛的领域知识和深厚的LLM Prompt工程经验的生物领域任务,人类Prompt和CoTPrompt效果不佳。而APE通过自动Prompt抽样和优化融入了一些领域知识,减少了人工干预,效果有所提升。但是,PromptAgent相对于APE平均提高了7.3%,这表明PromptAgent可以更好地引导有效的领域知识,产生专家级Prompt,并弥合新手和专家Prompt工程师之间的知识差距。
而对于通用的NLU任务,PromptAgent的能力和通用性也完胜所有的基线。
Prompt泛化性
作者还对经过PromptAgent优化后的Prompt能否推广到其他基础LLM模型上展开评估。由于较低级别和较小规模的LLM模型(如GPT-2或LLaMA)可能无法熟练掌握这些专家级Prompt的微妙之处,会导致显著的性能下降。本次评估选取了一个性能更强大(GPT-4)和一个比GPT-3.5性能更弱的模型(PaLM 2)。结果显示PromptAgent具有巨大的潜力:
- 当使用更强大的GPT-4时,优化后的专家Prompt几乎在所有任务(11/12)中都取得了进一步改进。
- 将专家Prompt转移到PaLM 2时,性能可能不如更强大的模型,但仍然可以在某些任务(如Penguins)中获得提升。
消融实验
本文还对比了多种搜索策略的效果,包括每次随机抽样并选择一个动作的单次蒙特卡洛(MC)搜索、始终选择多个样本中的最佳样本的贪婪深度优先搜索(Greedy)和在每个层级保留多个有用路径的束搜索(Beam search)。下表显示:
- 贪婪搜索(Greedy)和束搜索(Beam)都极大地改进了MC基线,表明结构化的迭代探索是必要的。
- Beam和Greedy严格按照前进的方向操作,没有在Prompt空间中进行策略性搜索,缺乏预见未来结果和回溯过去决策的能力。相比之下,MCTS的策略规划允许PromptAgent更有效地遍历复杂的专家Prompt空间,在所有任务上明显优于所有搜索变体。
搜索效率分析
除了卓越的性能外,PromptAgent的一个关键优势是通过策略规划能够高效地搜索。搜索效率是通过搜索过程中Prompt数量来衡量的,即在搜索过程中生成的节点数。下图中绘制了搜索效率与任务性能的关系,可以看到,PromptAgent的数据点聚集在左上角,表明在更高的准确性下,搜索的节点数也较少。
结论
本文介绍了PromptAgent,一种新颖的Prompt优化框架,结合LLMs的自我反思能力将任务的领域特定知识纳入到新生成的Prompt中,并使用MCTS规划的能力高效遍历复杂的Prompt空间找到专家级Prompt,PromptAgent优化后Prompt也始终表现出专家级的特征,丰富了领域特定的细节和指导。
在未来势必会出现越来越强大的大语言模型,能理解并支持的复杂指令越来越多,仅依赖人工专家Prompt是远远不够的,自动构建专家级Prompt将是一个非常有潜力的方向。