AFlow 阅读笔记:让模型搜索工作流,也把改进的代价算清楚

笔记日期:2026-10-12
论文题名:AFlow: Automating Agentic Workflow Generation
论文作者:Jiayi Zhang, Jinyu Xiang, Zhaoyang Yu, Fengwei Teng, Xionghui Chen, Jiaqi Chen, Mingchen Zhuge, Xin Cheng, Sirui Hong, Jinlin Wang, Bingnan Zheng, Bang Liu, Yuyu Luo, Chenglin Wu
论文标识与版本:arXiv:2410.10762v4,2025-04-15;初稿日期 2024-10-14
阅读资源:论文全文 · 作者提供的项目入口

1. 先把问题说清楚:谁来设计模型周围的流程?

让一个模型回答问题并不难,难的是决定怎样组织多次调用。一道数学题,是先生成五个解法再投票,还是先写程序计算再解释?一段代码没有通过测试,是让原模型修复,还是另起一次独立尝试?审阅步骤应该放在答案选择之前,还是之后?这些选择往往比单独改一句提示词更重要,也更依赖设计者的经验。

AFlow 把这一层设计本身交给搜索。它让一个模型提出工作流改动,再通过任务执行得到反馈,把有效和无效的改动都存下来。搜索的产物是一段可重复使用的程序:以后遇到同类输入,可以直接执行这套流程。基础模型的权重没有改变,改变的是它被调用的方式、调用之间传递的信息,以及决定最终输出的控制逻辑。

因此,读这篇论文时需要分清两个时间尺度。外层是设计阶段:花一些预算尝试不同程序,评估并选出一个工作流。内层是部署阶段:拿着选好的工作流处理新问题。AFlow 的主要实验属于这种先搜索、后复用的模式,并不是每处理一个用户请求就自动重写整个系统。即使工作流中有条件分支,也只能说明运行路径随输入变化,不能说明程序本身在运行中持续进化。

我认为论文最有价值的地方,是把“自动设计 Agent”拆成了几个可以讨论的部件:如何表示程序、怎样选择父工作流、如何让模型提出局部改动、怎样评估,以及怎样保存改动经验。这比泛泛声称系统会自我改进更具体。实验也说明,在相同执行模型下,流程设计确实可以带来明显差异。不过,整套系统有效,并不等于其中某个搜索机制已经被单独证明最优。

本文会特别守住三个数字口径。第一,论文的平均提升 5.7% 是相对提升,按表中的四舍五入均值,对应 76.0 到 80.3,即提高 4.3 个百分点。第二,4.55% 成本对应的便宜配置主要是接近 GPT-4o 直接调用的效果;明确超过它的配置有另外的成本比例。第三,这些美元数字只统计了指定测试集上的推理费用,没有把发现工作流的搜索费用一起算进去。

这三个限定并不会削弱工作流搜索的意义。相反,把比较对象和费用边界说清楚,才能判断什么时候值得搜索、需要复用多少次,以及换了模型之后是否还成立。对 harness 自我进化方向而言,这也是一个很好的基础案例:先理解如何优化一个可复用流程,再讨论更长时间尺度上的能力积累。

2. 前置知识:工作流、估计量,以及两种“节点”

工作流可以先理解为一个从输入到输出的程序。其中一些操作会调用语言模型,一些操作执行程序、检查结果或判断条件。节点描述一个操作,连接关系描述先后顺序和数据依赖。例如,“先生成候选,再根据测试结果决定是否修复”就同时包含模型调用、测试反馈和条件分支。只有一张没有数据语义的箭头图,往往不足以说明实际行为。

论文用模型、温度、提示词、输出格式来描述一次 LLM 调用。即使底层模型相同,要求它输出自由文本解答与要求它输出结构化判断,也可以视为不同节点。算子则把常见模式封装起来,例如生成多个候选并选择其中一个。这样,优化器可以直接使用已知结构,不必每次从最细粒度的调用拼装开始。

但搜索树里也有“节点”,含义完全不同:它装的是一整套工作流及其得分,而不是解一道题时的某一步。搜索树的一条边表示“父程序经过一次改动变成子程序”;工作流内部的一条边表示“这个调用的输出传给下一个调用”。不先区分这两层,就容易把 AFlow 误读成在每一道题的思维路径上做树搜索。

外层搜索树保存完整工作流,内层工作流连接具体操作

图 1. 根据论文第 3–4 节重新绘制的解释图。上层的边是程序之间的修改关系,下层的边是一个程序内部的执行与数据流。

另一个前置概念是“真实质量”与“测出来的质量”。真实质量关心未来同类问题上平均表现怎样;验证分数只来自有限样本和有限次调用。为了把两者区分开,可以写成下面的解释性表达式:

J(W)=E(x,y),ξ[g(W(x;ξ),y)],J^(W)=1mr∑i=1m∑j=1rg(W(xi;ξj),yi).(1)J(W)=\mathbb{E}_{(x,y),\xi}\left[g(W(x;\xi),y)\right],\qquad \widehat J(W)=\frac{1}{mr}\sum_{i=1}^{m}\sum_{j=1}^{r}g(W(x_i;\xi_j),y_i). \tag{1}

其中,WW 是工作流,xx 是输入,yy 是参考结果,ξ\xi 表示调用中的随机性。gg 是单个结果的评价函数,可能是答案正确与否、代码测试结果或文本 F1。右侧用 mm 道题、每道题相关的 rr 次重复评估来估计左侧期望。这是本文为解释方法补充的记号,不是论文额外给出的新实验。

这里最容易忽视的是:增加重复运行次数,主要缓解调用随机性;增加题目数量,才扩大对任务分布的覆盖。在同一批题上重复五次,不能等价地当成获得五批独立的新题。某个流程可以在选出来的验证题上非常稳定,却在新的题型上失效。后面讨论验证筛选和搜索偏差时,这个区别会反复出现。

最后,AFlow 使用的 MCTS 是一种具体变体。常见的蒙特卡洛树搜索会让人联想到访问次数、置信上界和回报传播;AFlow 的核心选择规则则是均匀概率与分数 softmax 的混合,并保存带有文字解释的改动经验。因此,不能因为出现了 MCTS 这个名字,就把标准 UCT 算法的结论直接套上来。真正需要分析的是本文给出的选择、扩展、评估和记录机制。

3. 搜索空间究竟包含什么?

论文首先给了一个很宽的定义:模型、温度、提示词、输出格式、节点连接都可以变化。但实际实验为了减少搜索难度,把执行模型、温度和格式配置固定下来,主要搜索提示词、算子组合以及代码表示的控制关系。概念上的大空间与实验中真正探索的空间需要分开。后者已经足够复杂,没有必要把它夸大成所有系统参数都由算法自动决定。

可以把这个定义重新整理为:

W=(N,E),Ni=(Mi,τi,Pi,Fi),W∗∈arg max⁡W∈SJ^(W).(2)W=(\mathcal N,E),\quad N_i=(M_i,\tau_i,P_i,F_i),\qquad W^*\in\operatorname*{arg\,max}_{W\in\mathcal S}\widehat J(W). \tag{2}

第一步,每个节点规定一次调用的接口与行为。第二步,EE 规定这些节点怎样组成程序。第三步,优化器在候选程序之间,根据验证反馈选择得分更高者。实际设置里,MiM_i 等执行配置在一轮实验中固定;会变化的主要是提示内容、使用哪些算子,以及如何传递和处理它们的结果。

代码表示的好处非常直观:循环生成多个候选、根据测试结果分支、保留变量、设置回退,都可以直接表达。另一种方案是使用带有明确循环和分支语义的图语言。它也可以表达相似行为,并且可能更容易限制非法组合,只是需要设计者事先定义足够的结构。代码并不是唯一能表达复杂控制流的方法,它是在表达自由度与候选有效性之间选择了一个位置。

这种自由也有代价。一个程序即使语法成立,也可能丢掉重要上下文、把错误字段传给下游、无限增加调用,或者返回了错误分支的结果。搜索空间更大,只意味着有机会容纳更好的程序;不意味着优化模型能用有限预算找到它们。AFlow 引入算子库,正是为了在表达能力之外再加入一层有用先验。

Generate 负责生成,Format 处理答案呈现,Review 与 Revise 把批评和修正分开,Ensemble 在候选中做选择,Test 提供执行反馈,Programmer 生成并运行计算程序。Custom 提供一个基本的提示驱动入口。把这些模式包装成接口,可以提高模型提出有用组合的概率,也会影响搜索优先探索什么。

GSM8K 的例子很适合用来理解这种组合:先产生五个解法,再选择答案,然后让 Programmer 提供计算结果或检查结果。程序输出满足相应返回条件时采用它,否则保留之前的答案。真正值得关注的不是“又多调用了一次模型”,而是哪个结果有权决定最终输出,以及失败时是否仍有合理回退。

GSM8K 示例工作流包括五个候选、选择、程序计算和回退

图 2. 根据论文 Figure 5(B) 重绘的结构示意。这里解释的是论文展示的流程,不是一次新的模型运行结果。

计算步骤并不天然等于可靠验证。程序可以把错误的题意算得很精确,审阅模型也可能自信地推翻正确答案。Format 则可能提升评分,却没有增加推理能力。因此,评价函数与验证样本实际上参与定义了“好工作流”:搜索最终奖励什么,流程就倾向于适应什么。

论文给优化器的提示要求一次做一个修改、提供完整所需提示、限制图的复杂度。这有助于理解父子程序之间的差别,并把经验记录得更紧凑。但有些改进需要多个部件一起变化,例如换输出格式的同时调整所有消费者。这里的“单次修改”最好理解为一次连贯的设计变动,而不是机械地只能改一个字符或一个调用,否则局部搜索会被接口依赖卡住。

4. 外层算法:先提出程序,再让任务反馈说话

AFlow 用固定随机种子 42,把所选数据按 20:80 分为验证部分和测试部分。初始模板在验证集上多次运行,再筛出分数变化较大的题,作为后续搜索的验证子集。每个新工作流在这个子集上评估五次,计算平均分和标准差。主实验最多搜索 20 轮;对照 ADAS 的设置为 30 轮。最终表格里的测试成绩则是对选定工作流运行三次后取平均。

选择高方差题有一个合理动机:总是做对的题可能没有区分度,总是做错的题也可能暂时提供不了可用方向,而时对时错的题可能位于能力边界,适合观察流程变化的效果。但这个方差是相对初始模板定义的。换了工作流之后,脆弱点可能已经迁移。因此,这种筛选节省了计算,也改变了后续优化看到的题目分布。

比如,一个初始流程在格式处理上不稳定,筛出的题可能集中体现格式问题;加上 Format 后,这些题很快变好,却不能保证对需要另一种推理路线的题也同样有效。验证筛选不是没有价值,而是必须连同独立测试一起理解。否则就会把“适应了初始模型的薄弱样本”误写成“对整个任务都找到了最佳流程”。

算法 1. AFlow 外层工作流搜索

输入:任务数据 D、评价器 G、初始工作流 W0、算子库 O,
      优化模型、执行模型
1. 将 D 按 20:80 划为验证集 V 和独立测试集 T。
2. 多次评估 W0;在 V 中筛选高方差样本。
3. 初始化工作流树和按父节点组织的改动经验。
4. 在最多 20 轮的预算内循环:
   a. 按混合概率规则选取父工作流。
   b. 载入父程序、相关修改记录和执行反馈。
   c. 让优化模型提出一次连贯的局部修改。
   d. 在 V 上将子工作流评估五次。
   e. 保存均分、费用、修改说明及父子比较。
   f. 更新最佳候选和提前停止统计量。
   g. 若满足选定的停止规则,则结束搜索。
5. 固定选出的工作流,在 T 上评估。
输出:工作流及其验证、测试测量结果

这份伪代码概括论文方法,但没有替作者消除所有歧义。正文说选取父节点时包括 top-k 工作流和初始模板,以便从起点重新探索;附录的选择函数只明确写了截取最高的三个记录。正文说 top-k 平均分连续若干轮不改善就停止;附录则写 top-k 工作流连续五轮不变。这些表述不能当成完全一样。

例如,同样三个工作流的测量分数略有提高,成员没有变化,但均值发生了变化。反过来,三个成员发生替换,均值也可能几乎不变。不同停止定义会影响能搜索多少轮、什么时候提前结束,进而影响总预算。本文把它们保留为论文描述上的未决细节,不根据猜测给出一个唯一参数配置。

停止条件本质上是一种节省预算的启发式。连续几轮没有改善,可能意味着局部方向确实不再有收益,也可能是提案不够好、评估有噪声,或者需要更大跨度的改变。它不能证明剩余空间里不存在更好的程序。尤其在优化器本身也是随机模型时,“没搜到”与“没有”之间仍有明显距离。

与只提供一个分数相比,AFlow 的反馈更丰富。优化器看到父工作流附近尝试过的修改、成败及预测与期望输出的日志。于是“提高成绩”可以变成一个较具体的假设:保留程序计算能力、修复最终答案格式,或者不要让某个审阅步骤覆盖已经正确的结果。树结构的作用主要是组织这些有局部关联的经验,而不是让所有历史程序无差别地占据上下文。

5. 混合采样公式:探索下限只对候选池成立

设当前有 nn 个可以被选作父节点的工作流,分数分别为 s1,…,sns_1,\ldots,s_n。AFlow 先构造一个偏向高分的 softmax,再混入均匀分布。先看前半步:

wi=exp⁡ ⁣(α(si−smax⁡)),qi=wi∑j=1nwj.(3)w_i=\exp\!\left(\alpha(s_i-s_{\max})\right),\qquad q_i=\frac{w_i}{\sum_{j=1}^{n}w_j}. \tag{3}

为什么要减去最大值?把指数展开,分子和分母都有共同因子 exp⁡(−αsmax⁡)\exp(-\alpha s_{\max}),相除后会消掉,因此概率不变。对于非负 α\alpha,这样还能让所有指数权重不超过 1,降低数值溢出的风险。这个操作只是平移,不是把分数自动归一化到同一种尺度。

然后把它与均匀概率混合:

pi=λn+(1−λ)qi,∑ipi=1,pi≥λn.(4)p_i=\frac{\lambda}{n}+(1-\lambda)q_i,\qquad \sum_i p_i=1,\qquad p_i\geq\frac{\lambda}{n}. \tag{4}

归一化很容易验证:前半部分加起来是 λ\lambda,后半部分加起来是 1−λ1-\lambda,总和正好为 1。由于 softmax 概率非负,每个入选候选至少有 λ/n\lambda/n 的机会。这个下界避免在候选池内部彻底放弃低分父节点,但它不是对全部历史工作流、更不是对无限程序空间的探索保证。

这一点很关键。如果先经过 top-k 筛选,大多数历史节点已经不在候选池里,那么再混入均匀分布也不会把它们找回来。正文提到保留初始模板,可以增加重新起步的机会,但仍不等于所有程序都具有同样明确的可达概率。探索发生在哪个集合上,必须和概率公式一起说明。

参数也可以直观理解:λ=1\lambda=1 时完全忽略成绩,均匀采样;λ=0\lambda=0 时只看 softmax。α\alpha 接近零时,所有指数权重都接近 1,整个分布也趋于均匀。α\alpha 很大时,高分节点拿到大部分分数驱动的概率质量,但仍保留均匀下限。这是一种简单的偏好控制,没有显式利用访问次数或评估不确定性。

算法 2. 明确分数单位的稳定混合采样

输入:候选父节点 C、分数向量 s、lambda、alpha
1. 确认 s 中所有分数采用同一种已说明的单位。
2. 设置 n = C 的长度,b = s 中的最大值。
3. 对每个 i,计算 w[i] = exp(alpha * (s[i] - b))。
4. 归一化 q[i] = w[i] / sum(w)。
5. 计算 p[i] = lambda/n + (1-lambda) * q[i]。
6. 按分类分布 p 抽取一个父节点。
输出:父节点及本次使用的概率向量

正文给的是 λ=0.2,α=0.4\lambda=0.2,\alpha=0.4,附录 A.6 则写成 λ=0.4,α=0.2\lambda=0.4,\alpha=0.2。二者既改变均匀探索所占比例,也改变分数偏好的强度。再加上经验记录中常见 0 到 1 的小数分数、表格中常见百分数,实际选择压力不能只看两个参数名字就判断。

拿 0.70、0.75、0.80 这三个假想分数作例子,使用正文参数时,三个概率都很接近三分之一。但如果不改 α\alpha,只是把同样表现写成 70、75、80,高分候选就会获得明显更大的概率。图 3 是对公式的直接计算,不是 AFlow 某次实际搜索的观察结果。

不同参数与不同分数尺度下的父节点采样概率

图 3. 对混合采样公式的分析示例。分别采用正文和附录参数,并对比分数以小数或百分数输入的效果;没有擅自指定哪一组才是论文实际使用值。

这种敏感性还可以从 softmax 的概率比推出来:

qiqj=exp⁡ ⁣(α(si−sj)).(5)\frac{q_i}{q_j}=\exp\!\left(\alpha(s_i-s_j)\right). \tag{5}

把两个 softmax 表达式相除,公共分母消掉,只剩分数差的指数。因此,把分数差放大一倍,与把 α\alpha 放大一倍有相同作用。仅仅改变记录单位,若没有同步调整参数,就已经改变了算法。最大值平移不会修复这个问题,因为它保留了差值的尺度。

一种替代方案是基于排名采样,这样可以避免单位敏感性,却会丢掉“第一名只高一点还是高很多”的信息。另一种方案是用不确定性调整概率,但需要对重复运行噪声和适应性选择建立可靠统计模型。AFlow 的规则胜在简单、易算;这些替代方案也说明,它并不是探索与利用之间唯一合理的折中。

6. 五次评估解决了什么,又没有解决什么?

对一个候选工作流,把第 jj 次运行在验证集上的总分记为 zjz_j。均值和样本方差可以写成:

zˉ=1r∑j=1rzj,σ^2=1r−1∑j=1r(zj−zˉ)2,r=5.(6)\bar z=\frac{1}{r}\sum_{j=1}^{r}z_j,\qquad \widehat\sigma^2=\frac{1}{r-1}\sum_{j=1}^{r}(z_j-\bar z)^2, \qquad r=5. \tag{6}

若这些运行近似独立,而且调用机制保持稳定,均值的标准误可以近似为 σ^/r\widehat\sigma/\sqrt r。重复评估因此有助于避免凭一次偶然成功判断程序好坏。但这个结论有条件:共享的调用环境、相关候选,以及重复使用同一批题,都可能使“独立测量”的理解过于乐观。

尤其要区分运行波动和任务分布误差。把一百道验证题运行五次,更准确地估计的是这个程序在这批题上的表现。它并没有告诉我们另外一百道题是否也包含同样的错误类型。对于经过高方差筛选的题集,重复调用越稳定,甚至可能越容易让人忽略题目覆盖不足的问题。

父子工作流的比较还存在另一个细节:只要孩子的测得均分高一点,就可以被记录为改进,但这一点可能小于噪声。如果保留逐题结果,可以在相同题目上做配对差分:

di=g(Wc(xi),yi)−g(Wp(xi),yi),Δ^=1m∑i=1mdi.(7)d_i=g(W_c(x_i),y_i)-g(W_p(x_i),y_i),\qquad \widehat\Delta=\frac{1}{m}\sum_{i=1}^{m}d_i. \tag{7}

先比较每道题父子表现的变化,再对变化取平均,可以更直接地观察改动是否持续修复了同一类问题。这里是本文提出的分析方式,不是声称论文已经额外做了配对显著性检验。它回答的是选定改动的效果;如果还想知道整个搜索算法稳不稳,就需要重复完整外层搜索,而不只是重复运行最后选中的工作流。

搜索越多,还会遇到“挑赢家”的偏差。设某个候选的测量值等于真实分数加噪声,从很多候选中挑最大值时,赢家往往同时拥有较好的真实表现和较幸运的正噪声。搜索可以提高真实质量,却也可能扩大最佳验证值与未来成绩之间的差距。这不意味着不能搜索,而是意味着测试集必须留在优化反馈之外。

一个更稳妥的后续研究可以把验证样本分成搜索用与确认用两部分,或在搜索结束后追加一批未参与提案的题。这样有机会发现:某个看似有效的格式提示只是适应了已见案例,某个复杂流程只是偶然通过了少量测试。评价器、筛选方式、重复次数与最终确认数据,应该一起决定我们对“改进”的信心。

7. 六个基准:先对齐比较条件,再看提升

主表里所有方法的执行器都是 GPT-4o-mini,AFlow 使用 Claude 3.5 Sonnet 作为优化模型。这个设置有助于回答:在执行模型相同的情况下,周围流程改变能带来什么。但它没有自动保证各方法使用相同调用次数、相同算子信息或相同搜索费用。相同执行器是一个重要控制条件,仍不是全部控制条件。

任务分成问答、代码和数学三类。HotpotQA 与 DROP 用 F1;HumanEval 与 MBPP 用 pass@1;GSM8K 与 MATH 用解题正确率。虽然表里都可以显示为百分数,但这些指标的意义并不相同。把六列取平均,得到的是六个任务的等权宏平均,不是把所有题合并之后的总正确率,也不一定等于某个真实产品流量分布下的效用。

数据选择也要随结果一起记住。论文在 GSM8K、HumanEval、MBPP 上使用相应完整数据,再做自己的验证/测试划分;HotpotQA 与 DROP 各随机抽取 1,000 道题。MATH 则使用 617 道 level-5 题,来自计数与概率、数论、初等代数和预备微积分四类。因此,这一列不能直接当成原始 MATH 全集上的结果,与其他论文的数字比较时尤其要检查子集和划分是否一致。

数据集直接调用 IOCoT 自一致性ADASAFlow
HotpotQA68.168.964.573.5
DROP68.378.876.680.6
HumanEval87.091.682.494.7
MBPP71.873.653.483.4
GSM8K92.792.790.893.5
MATH 子集48.650.435.456.2

上表来自论文 Table 1。自一致性基线生成五个答案;完整原表还包括 CoT、MedPrompt、MultiPersona 和 Self Refine。AFlow 在原表六列里都领先,这支持流程搜索在这些任务上的系统级价值。图 4 则提醒我们,领先的幅度并不均匀:MBPP 的变化很明显,GSM8K 已经接近高分区,增益比较小。

Table 1 中四种方法在六个数据集上的表现

图 4. 根据论文 Table 1 重绘的数据图。各列虽采用百分数展示,实际评价指标不同;图中数字不是本文新增的模型实验。

再来拆解 5.7%。用论文表格中已经四舍五入的宏平均,最强单一手工基线 CoT 自一致性为 76.0,AFlow 为 80.3:

Δpp=80.3−76.0=4.3,Δrelative=80.3−76.076.0×100%≈5.66%.(8)\Delta_{\mathrm{pp}}=80.3-76.0=4.3,\qquad \Delta_{\mathrm{relative}}=\frac{80.3-76.0}{76.0}\times100\%\approx5.66\%. \tag{8}

先做减法,得到百分点差;再除以基线,才得到相对提升。对 ADAS 的 67.2 作同样计算,差值为 13.1 个百分点,相对提升约 19.49%。因此,不能把论文的 19.5% 写成提高 19.5 个百分点。一个小小的单位差别,会显著改变读者对效果大小的直觉。

还可以问另一件事:如果每个数据集都拿该列最好的手工方法来比,结果怎样?对应手工最高分依次为 69.2、78.8、91.6、73.6、92.8、50.8,AFlow 的优势分别是 4.3、1.8、3.1、9.8、0.7、5.4 个百分点。这种逐列取最优的组合不是一个实际运行的单一对照系统,但有助于看出收益主要来自哪里。

AFlow 相对每列最佳手工方法的百分点提升

图 5. 对 Table 1 做逐列减法。它回答的是“各任务能比最强手工条目好多少”,与比较两个完整方法的宏平均不同。

代码任务里的 pass@1 也容易引起误解。它评价工作流最终返回的一个程序,不代表系统内部只调用一次模型,也不代表只生成一个候选。先产生三个程序、做选择和测试、最后返回一个程序,仍然可以按最终输出的 pass@1 计分。只要把内部预算说清楚,这是一种合理的系统比较;但不能据此声称基础模型原始单样本能力获得了同样提升。

测试反馈的可用性同样属于条件。附录 A.4 使用公开测试;对 MBPP,按文中设置把每题第一个测试用例视为公开反馈。它确实可以帮助修复代码,但若另一个系统没有这样的反馈,差异就不只是流程组织,还包括可获得的信息。评价测试驱动工作流时,公开测试、生成测试和最终评估测试的角色必须分清。

这些限定不应被理解为否定表格。表格最直接支持的是:在论文规定的数据、模型和反馈配置下,完整 AFlow 系统给出了更好的最终结果。若要进一步说明树搜索比线性搜索本身强多少,或算子库与额外调用分别贡献多少,就需要更有针对性的对照实验。结果层面的证据与机制层面的证据,可以同时成立但强度不同。

8. 换模型以后:流程能迁移,不等于最优性也迁移

Table 2 在 HumanEval 上研究执行模型迁移。作者分别用 GPT-4o-mini 和 DeepSeek-V2.5 搜索工作流,再把得到的流程放到四种执行模型上测试。多数迁移配置都好于对应模型的直接调用,这说明流程结构里包含一些可复用的价值,而不是完全依赖一个特定模型。

但数字也显示出适配性。GPT-4o-mini 执行自己搜索出来的流程为 94.7,换成 DeepSeek 搜出的流程则是 90.8。DeepSeek-V2.5 执行自己的流程为 94.7,执行 mini 的流程为 93.9。GPT-4o 在 mini 流程上达到 96.2,而其直接调用为 93.9。这里用的是 Table 2 的四舍五入值,成本附录另有一些更细的小数。

工作流来源与执行模型组合的 HumanEval 结果

图 6. 从 Table 2 选取直接调用与两种搜索流程,重新绘制为热图。每一行固定执行模型,每一列改变流程来源。

这组结果最自然的解释是:流程迁移是一种有程度的性质。原先设计的步骤顺序可以继续有用,但提示风格、纠错频率、候选多样性和格式约定,不一定恰好适合新执行器。模型较弱时可能需要更明确的程序计算;模型较强时,额外的修正步骤反而可能引入错误。一个图结构抽象上很漂亮,不代表每个模型都在同一位置受益。

因此,换执行器以后重新测量流程效果,是从数据得到的直接启示。不能把“迁移后仍优于直接调用”写成“模型无关”,更不能推出“换任何模型都保留原来的最优性”。同样,HumanEval 上的跨模型迁移,也没有证明从代码题迁移到科学研究、浏览器任务或多日软件工程仍然有效。

对 harness 研究而言,这种区别尤其重要。可复用的程序提供了迁移的载体,但独立任务上的保持效果需要另外验证。流程只是把已有能力组织得更合适,还是积累了跨任务的新能力,需要看后续用途和评价,而不能仅由它采用代码表示来判断。

9. 成本计算:先找对那一行,再谈便宜多少

附录 D 给的是在划分后的 HumanEval 测试集上运行一次完整方法的历史美元费用。GPT-4o 直接调用的成绩为 0.9389,费用为 0.6371 美元。DeepSeek 执行 mini 搜索出的流程时,成绩为 0.9390,费用为 0.0291 美元。两者在表中精度下几乎相同,附录文字也把这一点称为持平。

这就是 4.55% 说法需要谨慎的地方:不能把这一便宜配置与另一配置的较高成绩拼在一起,写成同一个实验。DeepSeek 执行自己搜出的流程时,成绩为 0.9466,费用为 0.0377 美元;mini 执行自己的流程时,成绩为 0.9470,费用为 0.0513 美元。这两组的显示成绩超过 GPT-4o IO,但对应费用比例不同。

用附录打印出来的四位小数复算:

1000.02910.6371≈4.57%接近持平,1000.03770.6371≈5.92%显示成绩更高,1000.05130.6371≈8.05%显示成绩更高.(9)\begin{aligned} 100\frac{0.0291}{0.6371}&\approx4.57\% &&\text{接近持平},\\ 100\frac{0.0377}{0.6371}&\approx5.92\% &&\text{显示成绩更高},\\ 100\frac{0.0513}{0.6371}&\approx8.05\% &&\text{显示成绩更高}. \end{aligned} \tag{9}

这里第一项得到 4.57%,与论文文字的 4.55% 略有差别,可能涉及未展示的小数精度或其他计算细节,仅凭打印表格无法确定。真正重要的不是追逐这 0.02 个百分点,而是不要混淆配置与质量结论。0.9390 与 0.9389 之间的极小显示差值,也不足以单独构成统计意义上的超越证据。

附录 D 中全部模型与方法的历史推理费用和成绩

图 7. 根据附录 D 的 32 组数据重绘,星号代表搜索得到的工作流。横轴是指定测试集的推理费用,不含搜索开销,也不是今日 API 报价。

搜索费用必须另外算。它包含优化模型调用、每个候选的五次评估、初始筛题成本以及失败提案的消耗。只看最终流程的单次推理价格,会漏掉为了发现它付出的前期代价。不过,如果流程能长期重复使用,搜索成本又可以被摊薄,所以正确问题不是“搜索费能不能忽略”,而是“预期复用规模是多少”。

设搜索开销为 SS,新流程每批推理成本为 cAc_A,对照方法每批成本为 cBc_B,以后会执行 BB 批同等规模任务,则:

CA(B)=S+BcA,CB(B)=BcB,B>ScB−cA(cB>cA).(10)C_A(B)=S+Bc_A,\qquad C_B(B)=Bc_B,\qquad B>\frac{S}{c_B-c_A}\quad(c_B>c_A). \tag{10}

推导很直接:从 S+BcA<BcBS+Bc_A<Bc_B 出发,把重复推理项移到右侧,得到 S<B(cB−cA)S<B(c_B-c_A),再除以正的单位节省即可。这里“批”的单位必须与费用表一致,是规模相当于所划测试集的一批工作,不是一道题。单位错了,回本次数可能差很多。

用 mini 自己的工作流与 GPT-4o IO 比,cA=0.0513c_A=0.0513,cB=0.6371c_B=0.6371,每增加一批可节省 0.5858 美元。如果假设搜索费是 10 美元,阈值约为 17.07 批,需要超过这个规模才在这些假设下回本。10 美元只是说明计算方法的假想参数,论文并没有证明这一轮搜索恰好花了这么多。

不同假想搜索预算下的摊销费用

图 8. 使用附录中的推理成本,配合明确标记的假想搜索预算计算。它说明复用规模如何影响经济性,不是实测投资回报。

实际部署还不只看美元。五次串行调用可能很便宜,却让交互等待不可接受;并行生成候选能缩短部分延迟,却增加并发容量需求。一个平均分更高的工作流,也可能在少数输入上进入很长的修复链或超时。论文的成本—质量图对其统计口径有价值,但延迟、失败恢复和极端情况的资源占用需要单独研究。

算法 3. 判断搜索得到的流程是否值得部署

输入:实测搜索费用 S、每批成本 cA 与 cB,
      质量估计、预期未来批次数 B
1. 确认 cA 与 cB 覆盖相同规模和条件的工作。
2. 比较质量及其不确定性,不只看四舍五入数字。
3. 计算单位重复节省 d = cB - cA。
4. 若 d <= 0,则不存在仅靠费用下降的回本阈值。
5. 否则计算 Bstar = S / d。
6. 比较预期 B 与 Bstar,并加入延迟和失败成本。
7. 模型、价格或任务分布变化后重新计算。
输出:有明确条件的部署判断

算法 3 是本文建议的分析步骤,与论文搜索算法分开。验证分数最高的候选,不一定就是部署效用最高的候选。只有把发现成本、重复使用规模、质量差异和服务约束放到同一个判断里,才能把“推理更便宜”转化成可信的实际收益。

10. 读搜索轨迹:一个好点子也可能放错位置

GSM8K 的案例从简单起点出发,逐步加入集成选择、Programmer,再调整提示。成功路径上的成绩上升很直观,但那些没有成功的分支同样有价值。论文提到,某次审阅步骤直接修改已经经过复杂流程得到的答案,却没有增加足够推理,反而降低准确率;另一轮过度强调折扣信息的提示,也让表现变差。

这说明,审阅、验证、重写并不是只要加上就有收益的通用模块。一个步骤有没有帮助,要看它收到什么信息、能纠正什么错误,以及是否会覆盖之前可靠的结果。对一个本来已经正确的答案增加“再想一遍”,也可能只是提供了另一次犯错机会。搜索的意义正是在具体上下文里评价这些设计,而不是预设越复杂越好。

附录 C 的 MATH 记录更细。选取一条成功路径,分数约从 0.4874 提高到 0.5244,再到 0.5277,最后到 0.5513。相应改动包括加入程序计算、集成选择和详细推理解法。但同一个父节点附近,文字描述看起来相似的集成修改,也可能得到明显不同的结果。不存在一个脱离上下文的“加 ensemble 固定提升若干分”。

MATH 搜索经验中的成功与失败分支

图 9. 根据附录 C 的部分记录重新绘制。图中的四舍五入分数属于验证搜索过程,不能替代最终独立测试结果。

树结构在这里的价值,是让经验保留局部条件。全局记一句“集成有效”太粗糙;记录“对这个父流程,输入这样组织、输出这样选择时,这次修改改善了哪些反馈”更有用。失败记录也不是废料,它可能提醒优化器不要在同一个上下文里反复提出相似的坏改动。

不过,这些轨迹仍然是案例解释。展示一条成功路径,不能说明换一次随机种子多大概率还能找到类似结果。把一个子节点标成失败,也不能说明该想法永远没有价值。可能是提示写得不好、数据接口没有对齐、返回条件太脆弱,或测量本身有波动。分数把这些不同原因压成同一个数字,因此还需要结合具体反馈阅读。

附录中的简短改动说明与后面的解释也不总是完全一致。例如,MATH 从第 1 轮到第 8 轮的叙述强调失去程序计算能力,而显示的经验条目主要概括为加入集成。仅靠这句摘要不能完整还原为什么下降。本文采用数值记录说明观察到的结果,把作者对下降原因的文字说明视为解释,而不进一步写成严格的因果证明。

GSM8K 的算子消融给出了另一个有意思的现象:去掉预定义算子后,系统仍然达到 93.1%,完整方法为 93.5%,并通过 Custom 调用构造出类似集成的结构。这说明优化模型和代码表示本身也带着有用先验,不是移除库之后就从零开始学习如何组织推理。

因此,“没有预定义算子”不等于“没有人类知识和工作流经验”。预训练模型可能已经知道集成、检查和分步求解,外层提示与评价函数也还在。这个消融更适合支持:打包算子有助于搜索效率,并在该设置下改善最终效果。它不能直接证明在所有领域都不需要领域库,也没有单独量化每种先验的贡献。

如果以后要更精确地比较,除了最终成绩,还应该统计有效候选比例、每轮花费和真正接受评估的候选数。移除算子后,一轮提案可能更难保持有效;即使轮数相同,实际探索到的可比较程序也未必一样多。搜索效率最终应该回到资源与有效反馈,而不只看循环次数。

11. 开放式任务:评价器依然决定优化的方向

附录 F 尝试把流程搜索用于一个小说生成任务和十个学术想法生成问题。它用 GPT-4o 作为评价器,在相关性、内容质量、连贯结构和参考比较四个维度上各打 1 到 5 分,总分 20。另有三位人工标注者评分。这说明即使没有精确答案检查器,外层循环也能借助一个可计算的评分继续运转。

但这部分证据应与前面的六基准实验分开看。小说案例只有一个提示,不能代表广泛的写作任务分布。尤其值得注意的是,原始要求是恰好 20,000 词,而论文报告的最终结果约为 27,000 词,多了约 35%。它也许在叙事质量和完整性上明显改善,但没有满足这个明确的字数约束。

这个案例非常适合解释“优化分数”和“完成任务”的区别。评价器如果把篇幅充足、结构完整看得很重,就可能给超长作品很高评价;用户同时提出的精确长度要求却仍未完成。不能因为总分接近满分,就把每一个约束都视作已经满足。更合理的评价,应把可测硬约束与主观质量分开记录。

想法生成表里,LLM 与人工得分的大方向有相似之处,但差距也很明显。第 4 轮的 LLM 分数为 17.6,人工均分为 9.7。这意味着搜索有可能顺着一个评价器不太在意的弱点前进,而另一个评价者会明显扣分。最终排名相近是积极信号;中间轮次的分歧则说明独立评价仍然提供了新信息。

开放式生成中的模型评分与人工评分

图 10. 根据附录 Tables A1、A2 重绘。左图是一个小说提示,右图是十个想法生成提示;二者不能视为大规模开放式任务评测。

为了理解这个风险,可以把被优化的奖励 RR 与用户真正关心的效用 UU 分开:

R(W)=U(W)+b(W)+ϵ(W).(11)R(W)=U(W)+b(W)+\epsilon(W). \tag{11}

其中 b(W)b(W) 代表评价器的系统性偏好,ϵ(W)\epsilon(W) 代表噪声。多次打分可能减少一部分随机波动,却消除不了稳定偏爱冗长、熟悉结构或表面合规的倾向。如果提高偏好项比分别改善真实质量更容易,搜索就可能提高分数而没有同等提高用户效用。这只是帮助解释风险的分析模型,不是对 AFlow 数据拟合出的结论。

对有硬约束的任务,可以先定义可行集合,再在其中比较质量。比如先用明确规则检查篇幅容差,再评价叙事表现,而不是把所有要求混在一个总分里。这样做的代价是评价设计更复杂,但好处是系统知道哪些要求不能用其他方面的高分来抵消。小说例子的价值恰恰在于,它把这个抽象问题变成了一个很具体的数字冲突。

12. 局限与失败边界

任务范围仍然较窄。 主实验围绕有明确输出评价的问答、代码和数学任务。长期记忆、变化的工具接口、不可撤销操作以及持续数天的项目,都会带来额外的状态和恢复问题。代码表示原则上可以容纳这些机制,但能表达不等于已经证明能处理。不能把一个任务族上的离线流程优化直接写成通用自治能力。

完整系统的比较比单一机制的归因更充分。 相同的 GPT-4o-mini 执行器是清晰控制,但不同方法的候选数、算子访问、优化器支出和推理调用仍有差异。AFlow 20 轮、ADAS 30 轮也不是同一搜索预算,甚至同样轮数也不代表同样 token 或美元费用。现有实验能支持指定配置下的系统改进,不能独立量化所有部件的贡献。

评价器参与塑造最终行为。 格式修正可以避免正确答案被不必要地扣分,这是一种实际收益;但也可能让搜索主要适应某一种评分方式。公开测试帮助代码修复,同样限定了信息条件。开放式任务用模型打分,又引入评价器偏好。三个场景背后的共同问题是:评价结果只是目标的一个代理,需要知道这个代理在哪里可靠。

方法细节存在未对齐之处。 正文和附录在混合采样参数、是否显式保留初始父节点、停止条件上表述不同。附录算法的一条注释把 80% 部分叫作 training,而实验设置将其描述为 test。本文按实验段落理解验证/测试划分,并保留其余歧义。这些问题主要影响方法描述的精确性,不能凭它们直接推翻成绩,也不能装作没有看见。

有界奖励和非零改进概率不构成有限轮最优保证。 附录 G 从评价有界、代码有效和改进概率非零讨论收敛,但这些条件本身不足以证明 20 轮或任意固定有限轮一定找到全局最优。有界得分并不意味着搜索空间有限;非零概率可以非常小;连续局部改进也不保证走到最好的程序。

一个简单的分析例子就能看出差别。假设每一轮独立地以固定概率 pp 找到某个有用候选,最多搜索 NN 轮,则:

Pr⁡(在 N 轮内找到)=1−(1−p)N.(12)\Pr(\text{在 }N\text{ 轮内找到})=1-(1-p)^N. \tag{12}

推导是先算所有轮都失败的概率 (1−p)N(1-p)^N,再取补集。若 p=0.01,N=20p=0.01,N=20,成功概率只有约 18.2%。在这个比真实搜索简单得多的模型中,非零概率都不能推出有限预算内必然成功。真实 AFlow 还会改变父节点池、依赖经验生成提案,有些目标需要多步修改,因此不能把这个例子当作它的实际成功率估计。

这里的批评针对的是逻辑强度,而不是说搜索没有用。有限预算的启发式完全可以在实验上非常有效,同时没有全局最优保证。把这两种证据分别呈现,反而更容易看出论文已经建立了什么,以及哪些主张还需要新的假设和证明。

13. 批判性分析:下一步最值得补哪种证据?

我对 AFlow 的总体评价是积极的,但积极的对象很具体:它让基于反馈的工作流设计有了明确操作流程。程序表示提供可修改载体,候选池控制搜索规模,模型产生提案,重复评估提供数值,树记录局部经验。组合起来以后,自动设计不再只是一句口号,而是一系列可以回看和分析的决策。

不过,最值得继续问的科学问题,是在预算和信息条件相近时,这些决策规则分别有多大作用。当前表格展示了整套系统的成绩;若想更有力地解释原因,需要把搜索树、上下文组织、算子库和选择规则拆开。否则,很难区分“树形记忆更好”与“优化器拿到了更相关、更短的局部经验”。

第一,可以设计一个使用相同算子、相同修改提示、相同父节点相关反馈的线性搜索对照。再设计一个保留树形档案、但随机选择父节点的版本。前者帮助看树结构本身的价值,后者帮助看分数混合选择的价值。这里提出的是后续实验,不是声称论文已经做出了这些结果。比较时应记录每个版本的有效候选数和总费用,而不仅是搜索轮数。

第二,目标函数可以从纯验证分数,扩展为带有部署约束的质量优化。一个更贴近服务条件的表达式是:

max⁡WJ(W)满足E[C(W)]≤cmax⁡,Pr⁡(L(W)>ℓmax⁡)≤δ.(13)\max_W J(W)\quad\text{满足}\quad \mathbb E[C(W)]\leq c_{\max},\quad \Pr(L(W)>\ell_{\max})\leq\delta. \tag{13}

第一个约束限制平均费用,第二个限制延迟超过上限的概率。这是本文提出的评价方向,不是 AFlow 已经采用的目标。它解释了为什么一个平均分最高的流程,可能不适合真实交互:少量输入会进入很长的修复链,或者多数题不需要五个候选却仍然付出同样费用。限制重试次数、保留回退、按情况减少候选,都可能比继续追逐一点平均分更实用。

第三,需要区分“曾经搜到一个好流程”与“这个算法稳定地能搜到好流程”。应当重复完整外层搜索,改变验证筛选和提案随机性,报告最终独立测试成绩的分布。只重复最后那个赢家的执行,能估计它运行时有多稳,却回答不了再次运行搜索是否还能得到类似赢家。公开每次搜索的费用—质量终点,也比只展示最强几个工作流更有助于判断实际使用成本。

第四,局部解释与因果证据需要保持距离。父子比较很有信息,但一次所谓修改可能同时影响多个字段,分数又有噪声。成功边上的“加入集成”标签,不能自动证明集成本身改善了推理。论文里相似集成修改出现失败分支,正好说明上下文的重要性。保存失败经验对设计有价值,而把它上升为普遍因果规律还需要更多控制。

第五,从 harness 角度看,还应把“提出一个好候选”与“保留为未来能力”分开。某个流程在当前任务族上变好,要进入长期复用库,还需要知道它是否保持接口契约、是否帮助未见样本、是否只是利用当前评价器偏好。AFlow 贡献的是外层搜索与局部经验组织;更一般的自我进化系统还要处理兼容性、淘汰条件和独立任务间的复用证据。

这种区分也能防止把持续增长的组件数量误认为能力增长。一个库里多了十个流程,如果多数流程只适合原来的验证题,甚至在新任务上干扰旧方法,那并没有证明积累了十份有效能力。后续使用记录与独立任务评价,才有机会把“被保留”转化成“确实有帮助”。这属于从 AFlow 延伸出去的研究问题,而不是本论文已经给出的答案。

综合来看,最有说服力的部分是:相同执行器周围的过程值得搜索,而且搜索历史可以以较可解释的方式保留下来。相对薄弱的部分是:有限轮收敛、跨广泛任务的通用性,以及把前期发现费用算入后的总经济收益。把这些结论分别放在相应证据范围内,才能既看到论文的实际价值,也知道下一步应该测什么。

14. 结论

AFlow 把 Agent 工作流看成可以依据任务反馈修改的程序。外层选择完整流程、提出局部编辑、多次评估,并保存父节点附近的成败经验;内层则执行选定程序,处理新的输入。在论文规定的六个基准和相同 GPT-4o-mini 执行器条件下,这种完整系统取得了持续领先的成绩。

真正影响判断的是细节:5.7% 相对提升不是 5.7 个百分点,低费用的接近持平配置不能借用另一配置的超越成绩,部署推理便宜也不等于搜索没有代价。参数差异、分数单位敏感性和开放式任务的约束失配,都说明自动优化会继承评价器给出的目标定义。对后续 harness 自我进化研究,最值得带走的思路是搜索可复用行为,同时在实际使用层面分别衡量质量、成本与泛化。

参考资料与图表说明

  1. Zhang 等:AFlow: Automating Agentic Workflow Generation,v4。方法见第 3–4 节及附录 A;主实验见第 5 节、Tables 1–2;详细费用见附录 D;案例见附录 B–C、F;理论讨论见附录 G。本次阅读覆盖 PDF 全部 38 页。
  2. 固定版本论文 PDF。本文十张图均为重新绘制的解释图、根据原文事实数据制作的图表,或明确标记的分析示例,没有把示例当成新完成的模型实验。
  3. 作者提供的 AFlow 项目资源。作为读者进一步了解项目的入口。

公式编号和三份伪代码由本文组织。算法 1–2 用于解释论文方法并保留描述歧义;算法 3,以及配对差分、摊销、评价偏差、有限预算概率和约束目标的公式,属于独立分析或建议的评价方式。文中美元数均来自原论文历史实验条件。