SAMMO 是一种通用的提示程序编译时优化框架。各个操作和提示部分用一个调用图中的组件表示,其精神类似于
DSpy
(Khattab,2023)。然而,SAMMO 超越了之前的工作,(i) 允许更改调用图 (ii) 表示提示的内部结构,以及 (ii) 将“编译时”优化推广到所有提示组件(例如文本内容、超参数)。它将元提示视为程序——允许模块化构建复杂提示并促进更有效的提示的编译。
具体来说,SAMMO 将元提示表示为结构化目标,这允许在优化过程中搜索更丰富的转换集。将优化形式化为搜索复杂元提示 π 结构的问题,其中可能包括许多结构化组件,例如:任务描述、指南、示例和输入/输出格式。请注意,元提示被设计为在运行时与不同的输入数据 X 动态组合,即 LLM(π[X]) = Y 。
如图是用于一个评论分类任务的简单元提示。SAMMO 将元提示表示为动态函数图,其中每个节点根据其子节点的结果、输入数据 X 以及特定于节点的参数 θ 计算新值。此处,输入数据 X 的节点标记为浅灰色。
这里专注于在部署元提示之前只能进行一次优化,称之为编译时优化。
更正式地说,优化本身是一个返回另一个函数(元提示)的函数。
这与运行时优化不同,运行时优化使用已填入的元提示调用优化器,然后提示 LLM。
此优化过程需要针对每个不同的输入数据 X 重复执行。
由于目标是在多次使用元提示时分摊优化成本,因此不再考虑运行时优化。
但是,如果有足够的资源,运行时优化可以补充编译时优化。
为了在所有元提示的指数级大空间中高效搜索,考虑它们的复杂程序结构,该结构通常由按顺序执行的参数化组件组成。更具体地说,将元提示 π 的结构表示为有向无环函数图 G。这里 Gπ = (V, E) 是一个具有单个根节点 vr 的 DAG。有向边 eij ∈ E 表示元提示结构组件中的父 (vi) 到子 (vj) 的关系。每个节点 v ∈ V 都有一个函数类 ψv 和静态参数 θv。
SAMMO 是一个用于优化元提示性能的通用框架。SAMMO 使用通用搜索算法和一组丰富的变异算子来探索提示空间。如图概述 SAMMO 的主要组件,这些组件可实现高效的提示优化。首先,有一个编程原语的基础层,可以从中构建更复杂的提示程序。这些构成了元提示函数图 G 的节点。在此之上是一个提示变异算子层,然后将其与最顶层的搜索算法一起使用。