提示优化 | PhaseEvo:面向大型语言模型的统一上下文提示优化

news2024/12/27 13:14:04

【摘要】为大型语言模型 (LLM) 制作理想的提示是一项具有挑战性的任务,需要大量资源和专家的人力投入。现有的工作将提示教学和情境学习示例的优化视为不同的问题,导致提示性能不佳。本研究通过建立统一的上下文提示优化框架来解决这一限制,旨在实现提示指令和示例的联合优化。然而,在离散和高维自然语言空间中制定这种优化在收敛和计算效率方面带来了挑战。为了克服这些问题,我们提出了 PhaseEvo,这是一种高效的自动提示优化框架,它将法学硕士的生成能力与进化算法的全局搜索能力相结合。我们的框架采用多阶段设计,结合了基于 LLM 的创新变异算子,以提高搜索效率并加速收敛。我们对 35 项基准任务的方法进行了广泛的评估。结果表明,PhaseEvo 的性能大幅优于最先进的基线方法,同时保持良好的效率。

原文:PhaseEvo: Towards Unified In-Context Prompt Optimization for Large Language Models
地址:https://arxiv.org/abs/2402.11347
代码:未知
出版: 未知
机构:intui

1 研究问题

本文研究的核心问题是: 如何设计一个统一的in-context学习prompt优化框架,以实现prompt指令和示例的联合优化。

假设我们要优化一个仇恨言论检测任务的prompt。现有的方法要么只优化一个简短的零样本指令,比如"检测下面的文本是否包含仇恨言论",要么在固定的指令下优选一组few-shot示例。这往往得不到最优的效果。比如加入一些few-shot的正负面例子,再稍微修改一下指令的表述,可能会带来更好的提示效果。本文要解决的就是如何在指令和示例两个维度上同时搜索最优的prompt。

本文研究问题的特点和现有方法面临的挑战主要体现在以下几个方面:

  • 离散的自然语言空间具有极高的维度,优化搜索难度大。联合优化指令和示例需要在一个超大规模的离散空间中探索最优解,收敛速度慢,计算成本高。

  • 全局探索容易陷入局部最优。现有的随机搜索方法虽然能全局探索,但也更容易陷入局部最优,难以持续优化。

  • 纯粹的局部搜索优化幅度有限。一些基于梯度的局部搜索方法虽然能快速收敛,但往往只能在初始解附近小幅优化,难以跳出次优区域。

针对这些挑战,本文提出了一种兼顾"全局探索"和"局部优化"的"PhaseEvo"方法:

PhaseEvo巧妙地将进化算法中的"探索"和"利用"思想与LLMs的生成能力相结合。它设计了一个四阶段的迭代优化框架,在"全局探索"和"局部优化"之间反复切换:先用随机初始化种群全局探索解空间,再用反馈突变局部优化当前解,然后用进化算子重新探索新区域,最后再用语义突变加速收敛。这好比先撒一张大网到处探索,然后围绕探索到的好位置精细捕捞,接着再撒网到新水域,最后收缩网兜聚焦最佳区域。同时,PhaseEvo还根据算子的特性,设计了任务感知的相似度度量和自适应的阶段切换策略,大幅提升了搜索效率。

2 研究方法

论文提出了一种名为PhaseEvo的统一in-context学习prompt优化框架,以实现prompt指令和示例的联合优化。PhaseEvo的核心思想是将进化算法中的"探索"和"利用"思想与LLMs的生成能力相结合,通过"全局探索→局部优化→全局探索→局部优化"的四阶段迭代优化流程,在探索整个搜索空间和利用当前最优解之间求得平衡。

2.1 突变算子

PhaseEvo使用了5类LLM驱动的突变算子,每类算子在添加/删除示例、改进概率、收敛速度、是否支持多父代、计算成本等关键属性上各有特点。

  1. Lamarckian算子: 给定一组输入输出对,利用LLM的few-shot学习能力反向生成对应的prompt。该算子能够引入全新的语义片段,为初始种群提供多样性。

  2. Feedback算子: 利用LLM作为"考官"找出当前prompt的缺陷,并作为"梯度"反馈给另一个LLM"学生",后者据此生成改进后的prompt。该算子能同时修改指令和示例,改进概率高,收敛速度快,但容易陷入局部最优。

  3. EDA算子: 从当前种群中选出一组语义相似但表述多样的parents,交由LLM生成它们的"遗传重组"。若按照适应度对parents排序,则称为EDA+I算子。该算子支持多父代,探索能力强,但改进概率和速度一般。

  4. Crossover算子: 选择种群中适应度最高的两个个体作为parents,让LLM对它们执行"交叉重组"。若两个parents的相似度最低,则称为Crossover+D算子。其特点与EDA算子类似。

  5. Semantic算子: 对当前prompt执行语义改写,生成表述不同但意思相近的新prompt。该算子探索能力较弱,但改进概率高,资源消耗低。

下表比较了不同算子的关键属性:

算子能否增删示例改进概率收敛速度多父代计算成本
--

2.2 四阶段优化流程

PhaseEvo采用四阶段迭代优化流程,每个阶段的初始种群、突变算子、种群规模、迭代方式等如下:

  • 阶段0(全局初始化):使用算子从任务数据或人工prompt中随机采样生成初始种群。该阶段探索空间最广,为后续阶段提供多样性的起点。

  • 阶段1(局部反馈突变):对中的每个个体,迭代使用算子,让LLM"考官"反复找出其缺陷并让LLM"学生"迭代改进,直到无法再提升。所有改进后的个体形成新种群。该阶段在初始探索的基础上快速爬坡,为后续阶段提供局部最优解。

  • 阶段2(全局进化突变):从中随机采样一组parents,用或算子生成它们的"遗传重组",加入种群形成。通过引入多样性的parents,该阶段能跳出阶段1的局部最优区域,在更大范围内探索。

  • 阶段3(局部语义突变):对中的每个个体,使用算子生成其语义相近的变体,形成最终种群。该阶段在全局探索的基础上做局部微调,提升收敛速度。

算法1描述了PhaseEvo的总体流程:

不同阶段通过巧妙的组合,形成了"大范围撒网 → 精细捕捞 → 换址撒网 → 重点围捕"的高效探索利用策略。

2.3 关键设计改进

除了四阶段流程,PhaseEvo还在两个细节上进行了改进。

首先,它采用基于任务的相似度度量来评估不同个体的差异性。传统的做法通常基于prompt嵌入的余弦相似度,但这不能反映它们在下游任务上的性能差异。PhaseEvo为每个个体构造一个performance vector,记录其在验证集每个样本上的预测结果(例如[1,1,1,0,0]代表前三个样本预测正确,后两个预测错误),并用vector之间的汉明距离度量相似性。这种做法能更准确地评估个体之间的互补性,避免选择到冗余的parents。

其次,PhaseEvo为不同阶段设计了自适应的终止条件。原有的进化算法通常给每个阶段设置固定的迭代次数,但这忽略了不同算子的优化效率差异。PhaseEvo根据算子的特点,动态调整每个阶段的耐受度:

  • 对于Feedback和Semantic等局部算子,若连续k(默认为1)次迭代都不再改进,则终止该阶段;

  • 对于EDA和Crossover等全局算子,由于优化效率较低,即使连续若干次迭代都不再改进,也会给予更大的耐受度(如k=4)再做尝试。

这种自适应终止策略充分利用了高效算子的快速收敛能力,也给低效算子更多的探索机会,从而在优化效果和计算成本之间取得了良好的平衡。

2.4 算法复杂度分析

设为prompt语料库大小,为平均prompt长度,分别为全局和局部阶段的基因代数,则PhaseEvo的时间复杂度为,其中为涉及的下游任务数。与穷举搜索的指数级复杂度相比,PhaseEvo在大规模搜索空间上的伸缩性更好。

在空间复杂度上,PhaseEvo在整个优化过程中最多维护的内存消耗,远低于需要缓存所有中间结果的贪心搜索和beam search等方法。

实验结果表明,PhaseEvo在35个常见benchmark上平均只需12次迭代和4000次API调用(感觉有点昂贵啊!),就能达到超越现有最优方法20%的显著提升。这体现了PhaseEvo在计算效率和优化效果上的显著优势。

3 实验效果

为全面评估PhaseEvo的有效性,论文在35个常见benchmark上进行了大规模实验。这些数据集涵盖了Big Bench Hard(BBH)、NLP检测、指令理解等不同类型的任务。其中,BBH包含8个具有挑战性的推理数据集,每个数据集有50个训练样本、50个验证样本和125个测试样本。NLP检测任务包括Ethos、Liar和Sarcasm,分别取50/50/150个样本作为训练集/验证集/测试集。指令理解任务使用了24个多样化的数据集,每个任务从原有训练集中取50个样本作为验证集,保留原有测试集。所有任务的评估指标均基于测试集计算,包括准确率、F1值等。

3.1 对比方法

论文将PhaseEvo与6种最新的基于LLMs的prompt优化方法进行了比较,包括:

  • APE和APO:分别强调exploration和exploitation,前者采用迭代式的蒙特卡洛搜索,后者用错误示例作为梯度近似。

  • OPRO:作为一种meta-prompt方法,它利用LLMs对solution-score对和任务描述做进一步优化。

  • PromptBreeder和EvoPrompt:基于遗传算法,分别采用思维风格突变和差分进化作为搜索策略。

  • AELP:针对长prompt优化,它在句子级别做语义突变,搭配历史感知搜索。

所有实验中,这些方法使用相同数量的训练数据和API调用预算,以确保公平比较。

3.1.1 Big Bench Hard

表2展示了haseEvo与最优基线在8个有代表性的BBH任务上的性能对比。可以看到,PhaseEvo在大部分任务上都取得了显著的提升,平均超过AELP 46.0%、EvoPrompt 20.3%和OPRO 23.5%。这体现了PhaseEvo在复杂推理任务上的优越性。不过,PhaseEvo在个别任务如Disambiguation QA上的表现略逊于部分基线,这可能是由于其对歧义消解的建模能力有限。

此外,论文还比较了不同初始化方式的影响。如表2所示,使用人工示例初始化(PhaseEvo-example)在Dyck Languages、Logical Five等任务上优于从原始数据采样初始化(PhaseEvo-pair),这得益于额外的先验知识引入。但在Causal Judgment等任务上,PhaseEvo-pair却表现更优,这可能是因为过于特定的人工示例限制了探索的广度。总的来说,这两种初始化方式在不同场景下各有优劣,论文建议根据任务的先验知识可获得性进行选择。

3.1.2 NLP检测任务

表3比较了PhaseEvo与APO在3个检测任务上的性能。可以看到,在Ethos和Sarcasm等简单任务上,PhaseEvo(GPT-3.5)与APO的性能相当;但在更复杂的Liar任务上,PhaseEvo的提升幅度高达19.6%,这得益于其在指令和示例两个方面的联合优化。当使用更强大的GPT-4作为base model时,PhaseEvo的性能进一步提升,但与GPT-3.5版本的差距并不显著。这表明PhaseEvo在充分利用GPT-3.5的同时,也具备了一定的鲁棒性。

3.1.3 指令理解任务

论文表17展示了PhaseEvo生成的prompt与人工few-shot示例在24个指令任务上的性能对比。APE和PromptBreeder的zero-shot和few-shot结果作为参考。可以看到,PhaseEvo在大部分任务上都显著超过了人工示例,且在17个任务上超过APE few-shot、18个任务上超过PromptBreeder。这验证了PhaseEvo在巨大的探索空间内寻找最优prompt的能力。

有趣的是,通过定性分析PhaseEvo生成的prompt,论文发现其可解释性和连贯性都明显优于人工设计的示例。在Rhymes任务中,PhaseEvo不仅给出了易于理解的任务定义,还提供了丰富的正面和负面示例,以及写作建议。相比之下,人工示例和其他方法的prompt则显得不够清晰和完整。这说明PhaseEvo不仅在优化prompt的性能,也在优化其语义和结构。

3.2 效率比较

除了有效性,论文还评估了PhaseEvo的计算效率。图5比较了不同方法在优化过程中的API调用次数和迭代次数。可以看到,PhaseEvo在35个任务上平均只需12次迭代和4000次API调用,就达到了超越现有方法的性能,而其他基于进化算法的方法如PromptBreeder则需要数十万次API调用。这得益于PhaseEvo对探索和利用的平衡,以及对不同阶段的适应性控制。此外,PhaseEvo的计算开销与APO等基于梯度的方法具有可比性,这进一步凸显了其在效率和效果间的良好权衡。

从理论上看,设为prompt语料库规模,为平均长度,分别为全局和局部阶段的代数,则PhaseEvo的时间复杂度为,空间复杂度为,均显著优于穷举搜索等暴力方法。这表明PhaseEvo能够支持在百万级语料上的实时优化。

3.3 消融实验

为验证PhaseEvo的一些关键设计,论文做了多组消融实验。

首先,相比随机选择算子的传统进化策略,PhaseEvo的phase进化方式在4个具有代表性的任务上都取得了更高的性能,尤其是在优化后期阶段。这说明exploration和exploitation的有序织交对于最终的收敛质量至关重要。

其次,论文比较了不同相似度度量对EDA/Crossover算子的影响。使用performance vector+汉明距离在所有任务上都优于余弦相似度,平均提升1.23%。这验证了任务感知的相似度度量在选择互补parents时的优越性。

最后,展示了优化过程中prompt长度的动态变化。可以看到,在不同任务上,最优prompt长度呈现不同的变化模式,这体现了PhaseEvo对搜索空间的灵活适应能力。值得一提的是,在部分任务中,最终的prompt长度反而低于初始值,这挑战了"prompt engineering必然导致冗长"的传统观念。

综上所述,大规模实验表明,PhaseEvo在优化few-shot prompts的性能和效率上都达到了新的高度,这得益于其在全局探索和局部利用间的动态平衡,以及对探索过程的精细把控。相信这一全新的优化范式能为后续的prompting研究提供重要的参考和补充。

4 总结后记

本论文针对联合优化prompt指令和示例的问题,提出了一种名为PhaseEvo的迭代优化框架。通过在"全局探索"和"局部利用"间的动态平衡,以及对不同阶段的适应性控制,PhaseEvo在35个benchmark任务上实现了显著超越现有方法的性能,且在计算效率上也达到了新的高度。实验结果表明,PhaseEvo生成的prompt在可解释性和连贯性上也优于人工设计,为自动prompt优化开辟了新的范式。

疑惑和想法:

  1. PhaseEvo目前主要关注单任务prompt优化,如何扩展到多任务场景?是否可以引入任务间的知识迁移和few-shot泛化?

  2. 除了准确率等常见指标,如何评估优化后prompt的可解释性、稳健性和公平性?这些属性如何纳入优化目标?

  3. PhaseEvo的搜索空间目前局限于离散token序列,是否可以引入连续嵌入表示,实现更细粒度的优化?

可借鉴的方法点:

  1. "探索-利用"平衡的思想可以推广到其他需要在连续空间和离散空间混合搜索的优化问题,如神经架构搜索、强化学习等。

  2. 将LLM作为优化器参与问题求解的范式值得借鉴,可以利用LLM的先验知识指导优化过程,减少盲目搜索。

  3. 基于performance vector的个体表示方法可以应用到其他进化算法中,提高种群多样性和优化效率。

  4. 自适应阶段划分的思想可以用于控制其他迭代优化算法的收敛速度和资源分配,提高鲁棒性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1695616.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

隐私是建立人工智能信任的关键

微信关注公众号网络研究观获取更多。 谷歌的 Astra 是其首款人工智能代理 谷歌继续将生成式人工智能融入网络安全 云的复杂性是我们这个时代最大的安全威胁 云安全最受关注的问题:人工智能生成的代码 企业可以从人工智能中获得转型利益,但确保“隐…

Linux基础(六):Linux 系统上 C 程序的编译与调试

本篇博客详细分析,Linux平台上C程序的编译过程与调试方法,这也是我们后续程序开发的基础。 目录 一、第一个hello world程序 1.1 创建.c文件 1.2 编译链接 运行可执行程序 二、编译链接过程 2.1 预编译阶段 2.2 编译阶段 2.3 汇编阶段 2.4 链…

UTC与GPS时间转换-[week, sow]

UTC与GPS时间转换-[week, sow] utc2gpsgps2utc测试参考 Ref: Global Positioning System utc2gps matlab源码 function res utc2gps(utc_t, weekStart)%% parameterssec_day 86400;sec_week 604800;leapsec 18; % 默认周一为一周的开始if nargin < 2weekStart d…

别被“涨价“带跑,性价比才是消费真理

文章来源&#xff1a;全食在线 “再不好好赚钱&#xff0c;连方便面也吃不起了。”这是昨天在热搜下&#xff0c;一位网友的留言。而热搜的内容&#xff0c;正是康师傅方便面即将涨价的消息。 01 传闻初现 昨天上午&#xff0c;朋友圈就有人放出康师傅方便面要涨价的消息&am…

Java | Leetcode Java题解之第112题路径总和

题目&#xff1a; 题解&#xff1a; class Solution {public boolean hasPathSum(TreeNode root, int sum) {if (root null) {return false;}if (root.left null && root.right null) {return sum root.val;}return hasPathSum(root.left, sum - root.val) || has…

Linux 生产跑批脚本解读

1.查看定时任务 2.脚本-目录结构 1&#xff09;config.ini 2&#xff09;run.sh 3.命令解读 1&#xff09;ls -1 路径文件夹 含义&#xff1a;ls -1 /home/oracle/shell/config/ 将文件夹config内的文件全部列出 [oracleneptune config]$ ls -1 /home/oracle/shel…

家政服务,让您的家更温馨

家&#xff0c;是我们生活的港湾&#xff0c;也是我们心灵的归宿。在这个快节奏的时代&#xff0c;每个人都在为了生活而奔波。然而&#xff0c;家务琐事却常常成为我们忙碌生活中的绊脚石。为了解决这个问题&#xff0c;家政行业应运而生&#xff0c;为您的生活带来便利与舒适…

【linux】g++/gcc编译器

目录 背景知识 gcc如何完成 预处理(进行宏替换) 编译&#xff08;生成汇编&#xff09; 汇编&#xff08;生成机器可识别代码&#xff09; 链接&#xff08;生成可执行文件或库文件&#xff09; 在这里涉及到一个重要的概念:函数库 函数库一般分为静态库和动态库两…

使用FP8加速PyTorch训练的两种方法总结

在PyTorch中&#xff0c;FP8&#xff08;8-bit 浮点数&#xff09;是一个较新的数据类型&#xff0c;用于实现高效的神经网络训练和推理。它主要被设计来降低模型运行时的内存占用&#xff0c;并加快计算速度&#xff0c;同时尽量保持训练和推理的准确性。虽然PyTorch官方在标准…

【电路笔记】-二阶滤波器

二阶滤波器 二阶(或双极)滤波器由两个连接在一起的 RC 滤波器部分组成,可提供 -40dB/十倍频程滚降率。 1、概述 二阶滤波器也称为 VCVS 滤波器,因为运算放大器用作压控电压源放大器,是有源滤波器设计的另一种重要类型,因为与我们之前研究过的有源一阶 RC 滤波器一起,…

Git 的安装和使用

一、Git 的下载和安装 目录 一、Git 的下载和安装 1. git 的下载 2. 安装 二、Git 的基本使用-操作本地仓库 1 初始化仓库 1&#xff09;创建一个空目录 2&#xff09;git init 2 把文件添加到版本库 1&#xff09;创建文件 2&#xff09;git add . 3&#xff09;g…

迅睿 CMS 中开启【ionCube 扩展】的方法

有时候我们想要某种功能时会到迅睿 CMS 插件市场中找现有的插件&#xff0c;但会有些担心插件是否适合自己的需求。于是迅睿 CMS 考虑到这一层推出了【申请试用】&#xff0c;可以让用户申请试用 30 天&#xff0c;不过试用是有条件的&#xff0c;条件如下&#xff1a; php 版…

MyBatis复习笔记

3.Mybatis复习 3.1 xml配置 properties&#xff1a;加载配置文件 settings&#xff1a;设置驼峰映射 <settings><setting name"mapUnderscoreToCamelCase" value"true"/> </settings>typeAliases&#xff1a;类型别名设置 #这样在映射…

28. 正定矩阵和最小值

文章目录 1. 概述2. 正定矩阵判定条件3. 举例 1. 概述 正定矩阵这节可以将主元&#xff0c;行列式&#xff0c;特征值&#xff0c;还有不稳定性结合起来。以前我们学的是解决方程 A x b Axb Axb 的问题&#xff0c;现在升级&#xff0c;变成 x T A x b x^TAxb xTAxb &…

html 字体设置 (web端字体设置)

windows自带的字体是有版权的&#xff0c;包括微软雅黑&#xff08;方正&#xff09;、宋体&#xff08;中易&#xff09;、黑体&#xff08;中易&#xff09;等 版权算是个大坑&#xff0c;所谓为了避免版权问题&#xff0c;全部使用开源字体即可 我这里选择的是思源宋体&…

Java进阶学习笔记10——子类构造器

子类构造器的特点&#xff1a; 子类的全部构造器&#xff0c;都会先调用父类的构造器&#xff0c;再执行自己。 子类会继承父类的数据&#xff0c;可能还会使用父类的数据。所以&#xff0c;子类初始化之前&#xff0c;一定先要完成父类数据的初始化&#xff0c;原因在于&…

【pyspark速成专家】7_SparkSQL编程1

目录 一&#xff0c;RDD&#xff0c;DataFrame和DataSet对比 二&#xff0c;创建DataFrame 本节将介绍SparkSQL编程基本概念和基本用法。 不同于RDD编程的命令式编程范式&#xff0c;SparkSQL编程是一种声明式编程范式&#xff0c;我们可以通过SQL语句或者调用DataFrame的相…

2024Spring> HNU-计算机系统-实验4-Buflab-导引+验收

前言 称不上导引了&#xff0c;因为验收已经结束了。主要是最近比较忙&#xff0c;在准备期末考试。周五晚上才开始看实验&#xff0c;自己跟着做了一遍实验&#xff0c;感觉难度还是比bomblab要低的&#xff0c;但是如果用心做的话对于栈帧的理解确实能上几个档次。 实验参考…

ClickHouse 24.4 版本发布说明

本文字数&#xff1a;13148&#xff1b;估计阅读时间&#xff1a;33 分钟 审校&#xff1a;庄晓东&#xff08;魏庄&#xff09; 本文在公众号【ClickHouseInc】首发 新的一个月意味着新版本的发布&#xff01; 发布概要 本次ClickHouse 24.4版本包含了13个新功能&#x1f381;…

List Control控件绑定变量

创建基于对话框的mfc项目 添加 List Control控件 右击控件&#xff0c;选择“添加变量” 在初始化对话框代码中增加一些代码 BOOL CMFCApplication3Dlg::OnInitDialog() { //...// TODO: 在此添加额外的初始化代码DWORD dwStyle m_programLangList.GetExtendedStyle(); …