微信扫码
添加专属顾问
我要投稿
随着大型语言模型(LLM)的迅猛发展,它们现已能够处理更长更复杂的输入这为使用更复杂的提示词(Prompt)提供了可能。然而要让Prompt在部署时达到令人满意的性能水平通常需要一定的调优。
近期有不少自动化Prompt优化方法被提出,但随着Prompt复杂度和LLM能力的提高,许多Prompt优化技术已经不再足够,需要一种新的方法来优化元提示程序(Metaprompt)。为解决这个问题,微软研究院提出了一种新框架:结构化感知多任务元提示优化SAMMO(Structure-Aware Multi-objective Metaprompt Optimization)实现了编译时优化Metaprompt。
题目:作为程序的Prompt:一种结构感知的高效提示优化方法
网址:https://arxiv.org/pdf/2404.02319.pdf
SAMMO将Prompt表示为结构化对象,允许在优化过程中搜索更丰富的变换集。相比于之前自动化优化Prompt的方法SAMMO具有以下五大优势:
1. 高效的数据标签:通过将多个数据点打包和解析到单个提示符中来支持minimetry大幅降低标注成本。
2. 提示原型和工程:SAMMO将Prompt表示为有向无环图可重用的组件和提示结构使得快速构建和测试新的提示变得容易。
3. 指令优化:SAMMO可以利用结构化的表达能力优化指令在给定任务上显著提升性能。
4. 提示压缩:SAMMO在保持性能的同时能够大幅压缩提示的长度和复杂度减少计算开销。
5. 大规模快速执行:SAMMO支持并行化和速率限制,使您可以并行和大规模地运行许多查询而不会导致LLM API崩溃。
SAMMO工作原理
How
PART 01
SAMMO的核心思想是将Prompt表示为一个结构化的程序即一个有向无环的函数图G。SAMMO定义了一系列结构感知的Prompt变异算子包括重排、替换、删除节点以及修改节点参数等。每个节点 v 都有特定的函数类型 ψ_v 和静态参数 θ_v表示Prompt的不同组成部分如任务描述、指南、示例以及输入输出格式等。节点之间的有向边 e_ij 表示父子关系父节点可以向子节点传递动态输入 X 以及来自子节点的消息。
整个Prompt程序 π* 就是由这样的函数图 G 递归求值得到的:
π[X] = ψ_vr(X ∪ ψ_children) θ_vr)
其中 vr 是根节点ψ_children 表示从子节点收集的信息。
用文中的例子来说明一下:
这是一个简单的元提示(metaprompt)结构,用于评论分类任务。在SAMMO框架下,元提示被表示为一个动态功能图,其中每个节点都根据其子节点的结果、输入数据 \( X \) 以及节点特定的参数 \( \θ\) 来计算新值。
在这个例子中,使用输入数据 \( X \) 的节点以浅灰色标记。
Metaprompt\( \π[X] \):这是顶层节点,表示整个元提示的函数,接受输入 \( X \) 并生成最终输出。
RenderSection():这是两个分支的父节点,负责渲染整个提示的一个部分。
左侧的 RenderText() 节点有参数 \( \θ_{text} \),包含静态文本:"In the following task you will have to classify..."(在接下来的任务中,你需要分类...)。这可能是提示开始时给用户的说明。
右侧的 RenderSection(X) 则是一个处理输入数据 \( X \) 的部分,也就是动态内容。
子节点:
左侧 RenderText() 的子节点包含静态文本:"Here are some examples:"(这里有一些例子:),它可能用来引入示例数据或指示。
RenderData() 节点有两个实例:第一个是静态的,包含格式化为JSON的示例数据(例如 {"Good meal!":"positive"}),第二个处理动态输入数据 \( X \),也是格式化为JSON。
RenderText() 和 RenderData(X)节点在右侧一起工作,以渲染任务的具体部分,例如提示用户分类输入数据 \( X \),并且以JSON格式展示。
这张图说明了元提示如何将多个组件组合起来,每个组件负责提示的不同部分。通过这样的结构化方法,我们可以针对性地对元提示进行修改和优化,如调整文本说明或者更改数据的格式和示例,进而优化整体的性能。
SAMMO示例
Example from me
PART 02
SAMMO的优化过程就是在这个函数图 G 上进行搜索试图找到一个更优的Prompt程序 π*。具体来说SAMMO定义了一系列结构感知的变异算子(mutation operators)包括:
1. 节点级别的变换如重排、替换、删除节点
2. 节点参数的变换如修改指令文本、格式化参数等
3. 图结构层面的变换如增加/删除子节点
这些变换算子构成了一个复杂的搜索空间 ΠSAMMO采用启发式搜索算法如遗传算法或者beam search在有限的训练数据上探索这个空间找到一个性能更优的Prompt程序 π*。
π = {
"task_description":"Answer questions about programming languages."
"examples":[
{"question":"What is the difference between Java and Python?"
"answer":"Java is a statically typed language while Python is dynamically typed. Java is generally faster for certain tasks but Python has a simpler and more concise syntax."}
{"question":"How does C++ differ from C?"
"answer":"C++ is an extension of the C programming language adding objectoriented programming features like classes and inheritance. C++ also has features like function overloading and templates that C does not have."}
]
"format":{
"input":"question:{question}"
"output":"{answer}"
}
"input":"What is the purpose of garbage collection in Java?"
}
这个Prompt程序包含任务描述、示例问答对以及输入输出格式规范。当我们把它输入到LLM时LLM就会生成相应的答案。
现在假设我们想优化这个Prompt使其在回答编程语言相关问题时更加出色。我们可以利用SAMMO的变异算子对其进行优化:
1. 删除或修改任务描述使其更加明确
2. 增加或替换示例问答对扩充覆盖范围
3. 调整输入输出格式使其更加简洁易读
4. 重新组织Prompt的结构如将示例放在最后等
通过反复迭代这些变换SAMMO可以探索出一个性能更优的Prompt程序 π*然后我们就可以使用它与用户进行更好的交互。
注:本文的变异算子在论文中是Prompt Mutation Operators,关于Mutation的文章你可以看下面这篇,介绍了一种变异提示的变异PROMPTBREEDER的自主进化的提示系统,是DeepMind发的。
SAMMO应用场景
Prompt output constraints
PART 03
SAMMO是一个通用的Prompt优化框架适用于黑盒设置即优化者只能从LLM的输出中采样。论文证明了SAMMO概括了之前的多种指令优化和压缩技术并在三种不同的应用场景中显著优于现有方法:
1. 指令调优:SAMMO在8个零样本 BigBench 分类任务上分别提升了10%-100%的性能尤其对于较弱的LLM效果更加明显。对于目前解决一些部署问题,这个方案可能是成本最小效果最优的。
2. 检索增强型生成(RAG)管道调优:SAMMO在 GeoQuery、SMCalFlow 和 Overnight 三个数据集上分别提升了26%-133%的准确率即使对于强大的 GPT4 也能带来30%的收益。
3. Prompt压缩:SAMMO能在保持基线性能的前提下将Prompt的加权代价(输入输出长度)压缩超过40%大幅优于其他压缩方法。上下文长度有限的情况下,结构化Prompt压缩后节省的不仅是Token。
此外SAMMO的通用性也体现在它可以兼容之前的多种Prompt优化和压缩方法如自动化Prompt工程(APE)、GrIPS、STDC、Stopwords、GPT-4 Rewrite等作为它们的特例。实验结果表明相比这些方法SAMMO不仅能显著提升性能还能实现更大幅度的Prompt压缩尤其在较弱LLM上效果更加明显。
这些实验结果表明随着LLM越来越强大Prompt的复杂性也越来越高传统的Prompt优化方法已经不再适用。SAMMO通过将Prompt建模为结构化程序提供了一种通用、高效的优化方法不仅可以显著提升 Prompt 性能,还能大幅压缩 Prompt 的开销,对于构建高效的人机交互系统非常有帮助,掌握这个SAMMO方法可以为未来大规模应用LLM奠定坚实的基础。
需要指出的是SAMMO的优化效果会因LLM的不同而有所差异这说明即使使用相同的变异算子不同LLM的Prompt优化轨迹也存在较弱的相关性。因此在实际应用中Prompt优化需要针对具体的LLM single out。但从全面来看,微软的这项SAMMO的确开创了一种新的Prompt优化范式为LLM的大规模应用提供了重要支撑。
项目给出一个示例操作方法和API参考,可以在Github上搜一下SAMMO,这个项目由Tobias Schnabel撰写。
本地部署成功后是这样:
Github上的SAMMO示例提供的安装方式并不友好,对python版本有指定要求,环境里如果有别的版本的Python项目再安装SAMMO可能会有些麻烦。如果你的机器很干净,没有任何项目,可以按照安装教程直接安装。我也写了一个Dockerfile,帮你一键部署到本地Docker环境,篇幅原因来我群里送你这个文件。公众号后台发送“加群”,你将得到具体加群方法,欢迎来讨论,你也将得到开群以来的各种Prompt。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-02-01
2024-07-25
2025-01-01
2025-02-04
2024-08-13
2024-04-25
2024-06-13
2024-08-21
2024-09-23
2024-04-26