Browse this library

Chinese source article

3.1.1 · L2: 提示、程序与架构

L2 改模型外面的运行结构, 改进器和评判标准不动. 这一篇讲最内的两层: 提示与程序, 架构与工作流. 重点在两件事: 搜出来的结构有没有真的被保留复用, 增益是来自结构还是来自多花的算力.

View original Markdown ↗

L2 改的是模型外面那层可保留的运行结构 Σ\Sigma, 改进器 UU 和评判标准 CC 不动. 综述按可改对象的范围从小到大分五层, 这里读最内的两层: 提示与程序, 架构与工作流.

1. L2 的边界和证据标准

1.1. 边界

1.2 把可保留状态写成 Ak=(θk,Σk,Uk,Ck)\mathcal{A}_k=(\theta_k,\Sigma_k,U_k,C_k). L2 的条件是:

Σk+1̸≡actΣk,(Uk+1,Ck+1)≡act(Uk,Ck).(1)\Sigma_{k+1}\not\equiv_{\mathrm{act}}\Sigma_k,\qquad (U_{k+1},C_{k+1})\equiv_{\mathrm{act}}(U_k,C_k). \tag{1}

式 (1) 只约束更深的两个组件. θ\theta 可以同时变, 只要 Σ\Sigma 是改得最深的那个, 就仍是 L2. 混合系统按组件拆: 一个路由器, 适配器或验证器, 如果保留下来的是训练过的参数, 那一部分算 L1; 如果是外部的符号策略或验证程序, 留在 L2. 另一个方向上, 保留下来的东西如果改变了之后的候选怎么提出, 就到了 L3 (见 4.2); 如果新的 rubric 或评测协议被升级为评判依据, 就到了 L4 (见 4.3).

第二个条件是持久性. 一个只在当前任务里生成, 用完就扔的工作流或程序, 是这一轮的输出, 按 1.2 的约定不构成 L2. 产物被装进 Σ\Sigma, 之后的独立任务继续用它, 才算 L2.

1.2. 五层对象

综述把 L2 按可改对象的范围从小到大排, 每一层以下一层为前提:

层 可改对象 对应 1.2 分量 本地最强的检查 这个检查抓不到的失败
提示与程序 一段指令, rubric, 一段程序 pp, T\mathcal{T} 编译, 单元测试, 单个产物的 diff 改一句话同时改了工具调用, 证据选择和停止行为, 归因弱
架构与工作流 角色, 控制流, 通信图, 路由 gg 分阶段验证器, 对角色和边做消融 增益来自更多协调或算力, 结构本身不迁移
技能 带调用接口的可复用能力 T\mathcal{T}, pp, mm 留出探针, 对被调用条目设回归预算 新条目修好目标任务, 却弄坏原来对的行为
记忆 写入, 召回, 删除策略和存储 mm 用保留的原始轨迹做长时回放 不加过滤的累积让行为变差
运行时 harness 构造上下文, 调工具, 观察, 提交的循环 gg, 并覆盖以上全部 带回滚路径地执行整个循环 循环能反复查询的验收门不再是留出证据

前两层是这一篇, 后三层是 3.2. 范围越宽, 本地检查越弱, 认证越依赖和在任版本的端到端对比.

证据变粗了:到 L1 为止, 证据常常是逐条的: 这一条自己生成的样本, 标准答案对不对, 单元测试过没过. 到了 L2, 被改的是整个 Agent 在一类任务上的行为, 证据变成端到端的聚合表现. 要回答的问题从「这一条监督信号对不对」变成「改过的 Agent 在有代表性的任务分布上是否更好」.

由此有三条要求. 第一, 改动要在挑选它的样本之外迁移. 第二, 要和在任版本 (incumbent) 比, 只和一个弱基线比不够. 第三, 预算要对齐: 同样的模型调用次数, 工具, token 和延迟. 预算不对齐, 多出来的协调和算力会被算成结构的功劳.

1.3. 改提示文本

搜索指令:这一组方法的共同设置是: 模型固定, 准备一个带标签的开发集, 在指令空间里找让开发集得分最高的那一条. 区别在候选怎么生成.

APE (Zhou 等, 2022, 多伦多大学) 让模型根据几组输入输出示例反推指令, 生成一批候选, 用目标模型在开发集上的得分挑最好的, 还可以在优胜者附近生成语义相近的变体. 在 24 个 Instruction Induction 任务上全部达到或超过人写指令, 在 21 个精选 BIG-Bench 任务上做到 17 个. 它还找到一句零样本 CoT 提示「Let's work this out in a step by step way to be sure we have the right answer.」, 在 text-davinci-002 上把 MultiArith 从 78.7 提到 82.0, GSM8K 从 40.7 提到 43.0.

OPRO (Yang 等, 2023, Google DeepMind) 把历史候选和得分写进元提示, 让优化器模型提出新候选, 打分后再放回去. 打分模型是预训练版 PaLM 2-L, 优化器是指令微调版 PaLM 2-L-IT. 在 GSM8K 上找到的「Take a deep breath and work on this problem step-by-step.」得 80.2, 同一打分模型下「Let's think step by step.」是 71.8, 空指令是 34.0. 同一张表里, 用 gpt-4 当优化器找到的最好指令得 74.5. 摘要的总结是: GSM8K 上比人写提示最多高 8%, Big-Bench Hard 上最多高 50%; BBH 的 23 个任务里, 用 PaLM 2-L 打分时有 19 个超过人写提示 5 个点以上.

OPRO 的 80.2 有一个口径问题: 表 1 和表 4 标的是测试准确率, 正文第 5 节却写这条指令「在第 107 步找到, 训练准确率 80.2」. 引用时只能说表里报告的是 80.2.

ProTeGi (Pryzant 等, 2023, 微软) 在一个小批量上让模型写出当前提示的错误分析, 称为文本梯度, 再按这段分析改写提示. 候选用束搜索维护, 用 bandit 最佳臂识别决定把评估预算花在哪些候选上. 摘要报告最多把初始提示的表现提高 31%, 平均比之前的提示学习基线高 4–8%. 束搜索的消融在越狱检测, Liar, 讽刺检测三个任务上分别是 0.85, 0.67, 0.88; 不迭代是 0.80, 0.63, 0.87; 贪心是 0.82, 0.63, 0.85. 讽刺检测上贪心还不如不迭代.

EvoPrompt (Guo 等, 2023, 清华与微软亚洲研究院) 维护一个提示种群, 让模型执行遗传算法的交叉变异或差分进化, 按开发集得分选择. 在 GPT-3.5 和 Alpaca 上跑了 31 个数据集, BBH 上最多比人写提示高 25%.

TextGrad (Yuksekgonul 等, 2024, 斯坦福) 把这个思路推广到计算图: 提示, 代码, 解答都可以是变量, 模型对每个变量写自然语言反馈, 沿图往回传. 它的主要数字来自解答优化, 属于 L0: GPT-4o 在 GPQA 上从零样本 CoT 的 51.0 到 55.0, MMLU 机器学习子集从 85.7 到 88.4, 大学物理从 91.2 到 95.1. LeetCode-Hard (39 题, 5 个种子) 的完成率, 零样本 0.26, Reflexion 0.31, TextGrad 0.36; 正文把零样本写成 23%, 和表不一致. 优化后的提示被保留下来, 用到之后的独立任务上, 才落在 L2.

DSPy 和 MIPROv2 换了对象. DSPy (Khattab 等, 2023) 让开发者写由声明式模块组成的程序, 编译器针对一个指标自动生成每个模块的示例和指令. 在 GSM8K 上, 编译正确的模块把不同模型从 4–20% 提到 49–88%. MIPROv2 (Opsahl-Ong 等, 2024, 斯坦福) 同时优化多阶段程序里每个模块的指令和示例, 用随机小批量评估训练一个代理模型, 来处理「分数变化归哪个模块」的归因问题. 在 Llama3-8B 上, 7 个程序里有 5 个超过基线, 最多高 13%.

GEPA (Agrawal 等, 2025, 伯克利等) 采样完整的运行轨迹, 包括推理, 工具调用和工具输出, 让模型用自然语言诊断问题并提出提示修改. 候选从自己历次尝试的 Pareto 前沿里选, 也可以合并两条互补的修改. 它直接和改权重的方法比. Qwen3 8B 上六个任务的聚合分:

方法 改什么 聚合分
基线 不改 45.23
MIPROv2 提示 47.84
GRPO (每任务 24000 次 rollout) 权重 48.91
GEPA 提示 54.85

摘要说 GEPA 平均比 GRPO 高 6%, 最多高 20%, rollout 最多少 35 倍. 单项并非全胜: Qwen3 8B 的 AIME-2025 上, GRPO 38.00, GEPA 32.00. GPT-4.1 Mini 上的聚合分, 基线 53.03, MIPROv2 58.67, TextGrad 59.14, GEPA 65.22, 加合并操作后 66.36.

这一层的数字怎么读:上面的数字有三个共同前提.

第一, 都是在固定任务上搜. 开发集被反复查询, 每一轮都用它挑候选, 它是开发证据. 报告的提升是否成立, 取决于测试集是否和开发集分开, 以及测试集有没有被反复用来做选择.

第二, 起点决定空间. Câmara 等 (2026, Zeta Alpha) 拿一个深度研究多 Agent 系统做实验, ScholarQA-CS 一共 109 组问答与 rubric, 分成训练 29, 开发 30, 测试 50. GPT-4.1 下, 最简提示 0.513, 经 TextGrad 优化后 0.654, 经定制元提示的 GEPA 优化后 0.705; 专家写的提示 0.667, 再经 TextGrad 优化只到 0.672, 经定制 GEPA 是 0.701. 优化器对弱起点帮助大, 对已经调好的提示帮助小.

第三, 归因弱. 一条指令的措辞同时影响工具怎么用, 证据怎么选, 什么时候停. 分数升了, 很难判断是哪个行为变了.

把编辑面收窄, 以及和改进器的边界:针对归因弱, 一类做法把可改的对象限制成有类型, 人能读的结构.

SHARP (Chen 等, 2026, 摩根士丹利) 用在金融交易 Agent 上. 交易策略写成有界的「条件 → 动作」规则表, 归因 Agent 跨多个样本找出是哪条规则出错, 每次只改一条, 再用 walk-forward 验证决定接受与否. 消融里把单条规则编辑换成自由改写提示, GPT-4o-mini 在 AI 科技板块上的 Sharpe 比率从 +2.45 掉到 −0.84, 总收益从 +33.2% 掉到 −12.1%, 低于不做任何演化的静态基线. 作者说明只有 3 个不重叠的 walk-forward 窗口, 结果只能当方向性的样本外证据.

Combee (Li 等, 2026) 处理的是速度. ACE, GEPA 这类「生成, 反思, 更新」的方法按顺序一条条处理轨迹, 很慢. Combee 让多个 Agent 并行处理分片, 把反思结果复制打乱, 再分层合并进全局上下文. AppWorld 上, ReAct 平均 53.3, 加 ACE (批大小 1) 58.1, 加 Combee (批大小 40) 65.8, 速度是顺序 ACE 的 12 倍. Terminal-Bench 2.0 上, 加 ACE 37.9%, 加 Combee 35.6%, 训练时间少 17 倍以上, 并行在这里损失了一部分质量.

EEVEE (Xu 等, 2026, 上海交大与普林斯顿) 处理多数据集混合. 一个提示同时服务多个任务时, 为一类任务改的提示会损害另一类. EEVEE 让路由器把输入分到不同簇, 每簇一套提示, 路由器和提示交替更新. 四个基准的平均分, Qwen3-4B 从 41.37 到 51.75, 同设置下 ACE 34.92, GEPA 37.73; DeepSeek-V3.2 从 39.75 到 64.07. 在 GPQA Diamond 上, EEVEE 在两个模型上都低于各自不做优化的基线. ACE 和 GEPA 在 Qwen3-4B 上的平均分也低于基线, 单一提示在混合任务上被改坏是实际发生的情况.

三个例子的共同点: 改动可以 diff, 可以定位到一条规则或一个簇, 出了问题能回滚到上一版. 这是收窄编辑面带来的可靠性收益.

提示改动什么时候不再是 L2, 看保留下来的提示控制哪个过程. 任务提示控制任务执行, 是 Σ\Sigma 里的 pp. Promptbreeder 的变异提示控制之后的任务提示怎么生成, SePO 里提示词 Agent 的系统提示控制它之后怎么优化任务提示, 这两者动的是 UU, 是 L3, 在 4.2 讨论. 同一个系统里两类改动可以同时存在, 归类取最深的, 证据分开给.

提示优化是双层随机优化:把提示搜索只写成「生成若干候选, 选分数最高的」会漏掉最关键的一层: 候选的产生本身依赖已经观察过的分数和错误轨迹. 设任务样本为 z=(x,y)z=(x,y), 模型在提示 pp 下产生分布 qM(y^∣x,p)q_M(\hat y\mid x,p), 单样本损失为 ℓ(y^,y)\ell(\hat y,y). 提示的总体风险是

R(p)=Ez∼DEy^∼qM(⋅∣x,p)[ℓ(y^,y)].(2)R(p)=\mathbb E_{z\sim D}\mathbb E_{\hat y\sim q_M(\cdot\mid x,p)}[\ell(\hat y,y)]. \tag{2}

搜索器看不到 R(p)R(p), 只能在开发集 SS 和有限次随机采样上得到 R^S(p)\hat R_S(p). 第 tt 轮候选又由历史 Ht={pi,R^S(pi),τi}i<tH_t={p_i,\hat R_S(p_i),\tau_i}_{i<t} 产生, 其中 τi\tau_i 是错误轨迹或自然语言反馈:

pt∼U(⋅∣Ht),p∗=arg⁡min⁡ptR^S(pt).(3)p_t\sim U(\cdot\mid H_t),\qquad p^*=\arg\min_{p_t}\hat R_S(p_t). \tag{3}

式 (3) 是一个双层问题. 内层执行固定模型并估计提示表现, 外层根据这些估计改变候选分布. OPRO 把历史提示和分数直接放进元提示, ProTeGi 把错误分析变成编辑方向, GEPA 把完整轨迹压成反思并维护候选前沿; 三者的外层算子不同, 共同点是开发证据会反过来塑造下一轮搜索. 这也解释了为什么普通的训练集、验证集、测试集三分法还不够: 若验证集在每轮外层更新中被查询, 它已经承担训练信号, 应另留一层只供决赛候选使用的数据.

随机性有两个来源. 模型采样让同一提示的分数波动, 样本抽取让小批量估计偏离总体风险. 对提示 pp 重复 nn 次得到均值 Rˉp\bar R_p 和样本方差 sp2s_p^2, 两个候选的差异若小于其估计误差, 直接保留当前第一名会频繁追逐噪声. 更稳妥的晋升规则比较置信上界, 或给接近的候选追加预算. 对损失最小化问题, 可以要求

Rˉp′+csp′np′<Rˉp−cspnp,(4)\bar R_{p'}+c\frac{s_{p'}}{\sqrt{n_{p'}}} < \bar R_p-c\frac{s_p}{\sqrt{n_p}}, \tag{4}

再让新提示替换在任版本. 常数 cc 体现愿意承担的误判风险. 小数据下正态近似可能很差, 可用配对自助法: 每道题用相同随机种子运行新旧提示, 对逐题差值重采样. 配对设计同时抵消题目难度和部分模型采样波动.

优化目标也不应只有平均正确率. 一条提示常同时控制格式合规、工具调用、拒答和成本. 设 mj(p)m_j(p) 为第 jj 个指标, 比简单加权和更可靠的做法是先写硬约束

min⁡pR(p),mj(p)≥bj(j∈H),(5)\min_p R(p),\qquad m_j(p)\ge b_j\quad (j\in\mathcal H), \tag{5}

再在满足安全、接口和尾部风险门槛的候选里比较效用与成本. 加权和允许一个严重退化被另一个平均分提升抵消, 硬约束则明确哪些行为不可交易. 若多个候选分别在准确率、延迟和 token 上占优, 保留帕累托前沿比过早压成单一排名更合适; 部署场景确定后再从前沿选择.

最终要区分「提示的搜索成本」与「提示的推理成本」. 一个短提示可能经历数千次外层评估才找到, 部署时却很便宜. 若研究问题是结构能否迁移, 两者都要报告: 前者决定发现过程是否可承受, 后者决定产物是否值得复用. 把昂贵搜索摊到大量后续任务上才可能有净收益. 设一次搜索成本为 CsC_s, 新提示每次节省 ΔC\Delta C 且提高效用 ΔU\Delta U, 使用次数为 NN, 至少要满足 N(λΔU+ΔC)>CsN(\lambda\Delta U+\Delta C)>C_s 才越过摊销点.

文本梯度没有链式法则:ProTeGi 和 TextGrad 都使用「文本梯度」这个名称, 它与可微优化中的梯度只有功能类比. 连续参数 ww 的梯度 ∇wL\nabla_w L 给出局部一阶变化率, 满足方向、尺度和链式法则; 一段自然语言反馈 gg 只是条件化后的编辑建议. 从提示 pp 到修改后提示 p′=E(p,g)p'=E(p,g) 的映射还经过另一个语言模型, 因而没有保证

R(p′)≤R(p),R(p')\le R(p),

也没有可相加的步长. 「反馈更尖锐」不等于更新更大, 两段看似相反的反馈也可能生成相同改写. 这里真正存在的是带评价器的离散邻域搜索.

可以把一轮文本更新拆成三个随机核. 诊断器从失败轨迹产生解释 g∼Q(g∣p,τ)g\sim Q(g\mid p,\tau), 编辑器产生候选 p′∼E(p′∣p,g)p'\sim E(p'\mid p,g), 评价器返回带噪分数 J^(p′)\hat J(p'). 失败可能来自三处: 诊断归因错了, 编辑没有落实诊断, 评价样本无法区分新旧候选. 只保存最终分数会把三种错误混成一句「优化没起作用」. 保存诊断、补丁和逐样本差值, 才能判断下一轮该换诊断提示、编辑策略还是评测集.

文本更新需要自己的信赖域. 在连续优化里, 信赖域限制一步不要离局部模型有效范围太远. 对提示可以限制允许修改的字段、最大编辑距离、示例集合变化和工具权限. 表面字符距离并不能代表语义距离, 所以还需行为探针: 给定一组覆盖核心规则与边界条件的输入, 比较新旧提示允许的动作集合. 若候选在目标错误上改善, 却改变了无关规则, 应拆成更小补丁后重测.

束搜索的价值也由此清楚. 贪心只保留当前最高分候选, 遇到必须先短暂降分才能到达的组合修改时会卡住; 较宽的束保留多个解释方向. 但束宽 BB 与轮数 TT 让查询次数近似按 BTBT 增长, 多重比较偏差随之变大. 最佳束宽由评估预算、分数噪声和候选多样性共同决定, 并非越宽越好. 如果束中候选只是同义改写, 有效宽度仍接近一; 可以按行为差异或错误覆盖聚类, 每簇保留代表候选.

反例能说明文本梯度的边界. 假设分类提示在十个失败样本中九个漏掉否定词, 一个混淆实体. 诊断器可能概括为「加强否定识别」, 编辑器加入一条醒目规则, 开发集上九题转对; 新提示却过度把双重否定也判为负类. 这次更新忠实执行了主要误差方向, 仍因样本覆盖不足而损害总体风险. 诊断文本提供假设, 留出反例决定假设是否成立. 因此文本梯度适合提出可读的局部修订, 不能替代统计验证.

提示搜索为什么会过拟合:提示优化把验证集分数当作适应度. 每看一次分数, 搜索器便获得关于验证集的信息. 候选提示反复依据同一批样本改写后, 即使提示没有直接包含答案, 也会逐渐吸收题型、措辞和评分器偏好. 这与手工调参查看验证集没有本质区别.

设候选真实效用为 J(p)J(p), 有限验证集观测为 J^(p)=J(p)+ϵp\hat J(p)=J(p)+\epsilon_p. 从 NN 个候选中取最大值时, 被选提示往往同时拥有较高真实效用和正噪声. 若候选真实效用相近, 极值主要由噪声决定. 增加搜索轮数会继续提高开发分数, 测试分数可能早已饱和.

控制办法是嵌套验证. 内层样本用于生成文本反馈和快速筛选, 外层样本只比较少数入围提示, 密封测试在提示冻结后使用. 任务存在同模板变体时要按模板族划分, 随机按题划分会让近重复题跨集合泄漏.

提示优化还有评分器过拟合. LLM 判官偏好特定长度、标题和语气, 搜索器很快学会这些特征. 用执行结果、人工子集和不同家族判官交叉评价, 可以判断提升来自任务质量还是风格迎合. 对判官分歧最大的样本抽查, 比均匀抽查更容易发现漏洞.

指令与示例的耦合:一个提示常包含任务指令、输出格式和若干示例. 改写指令后, 原示例可能不再覆盖新边界; 更换示例后, 指令中的概念也可能产生歧义. 把两者分别优化虽然便于归因, 仍需联合验收.

示例选择可以看作覆盖问题. 每个示例覆盖一组错误模式, 在 token 预算下选择能覆盖最多重要模式的子集. 单纯选择与当前输入最相似的示例, 容易重复同一模式; 加入多样性项能扩大覆盖, 但表面嵌入距离不一定对应推理差异.

示例顺序也会影响结果. 语言模型可能更重视靠近输入的示例, 或沿用最终一个示例的格式. 因而候选提示要在多种顺序上复测. 只在最佳顺序报告结果, 等于把顺序也纳入未披露搜索.

负例能说明规则边界, 但错误答案本身可能被模型复制. 更安全的负例写法同时标出错误位置、修正过程和正确结果. 对事实任务尤其要避免把虚假陈述放入上下文后只用一句“不对”否定, 因为表面共现仍可能影响生成.

提示的语义不变量:自动改写时需要定义哪些内容不得改变. 任务目标、允许工具、输出模式和安全约束属于语义不变量; 解释顺序、措辞和示例可搜索. 没有不变量, 优化器可能通过缩小任务逃避失败, 例如把“回答所有问题”改成“只回答有把握的问题”.

可用双向蕴含测试检查指令语义. 从旧提示生成一组允许与禁止行为, 再判断新提示是否保持; 让不同模型分别解释两版提示, 比较它们对边界的理解. 这种检查仍有模型误差, 对关键约束还要写成机器可执行断言.

提示长度减少可能是有效压缩, 也可能删掉低频保护条款. 回归集必须包含这些条款对应的异常输入. 平均任务分数无法保护罕见但严重的行为, 应把安全和接口约束设为晋升硬门.

跨模型迁移用于检验提示是否表达了真正规则. 只对某个模型有效的特殊措辞可能利用了其训练习惯; 在多个模型上方向一致, 更像通用指令. 迁移不必要求绝对分数相同, 重点是相对改动是否稳健.

2. 改程序和符号规则

2.1. 从指令到程序

把被改的对象从一段话换成一段程序, 本地检查立刻变强: 能编译, 能运行, 能 diff, 能跑回归测试.

SelfEvolve (Fahim 等, 2026, 都柏林大学学院) 在运行时为没覆盖到的用户请求生成新的 Python 函数. 先生成测试再生成代码, 在沙箱里最多迭代 6 次, 通过的函数写入持久的知识库并热加载. 在作者手工构造的 11 个自扩展任务上 (共 55 次运行), pass@1 是 51/55 (92.7%), AutoGen 17/55 (30.9%), MetaGPT 15/55, AgentCoder 0/55. 摘要的「比最好基线高 61.8%」是百分点差, 即 92.7 减 30.9. 去掉测试驱动, 通过数降到 40/55, 平均迭代次数从 2.2 升到 4.7. 只测了 GPT-4.1 一个模型.

这里保留的是新函数, 它们进了工具集 T\mathcal{T}, 之后的请求能调用, 所以是 L2. 生成函数的流水线本身没变.

综述还举了一个例子: 固定模型在一个正确性加质量的联合循环里, 反复改写 ABC 逻辑综合系统的源码. 这类系统的本地检查只能证明在覆盖到的执行上语法和行为正确, 证明不了迁移.

2.2. 模拟器下的程序发现与先过筛的符号规则

同样的「提出, 编译, 评测」循环出现在科学和算法发现里: 模型演化一个外部程序, 模拟器或下游效用决定留不留.

MLEvolve (Du 等, 2026, 上海人工智能实验室) 是一例. 它用渐进式蒙特卡洛图搜索, 分支之间可以互相参考; 配一个冷启动知识库和动态全局记忆; 规划和编码分开. 在 MLE-Bench 75 个任务, 3 个种子, 12 小时预算下, 平均奖牌率 65.3±0.8 (Gemini-3.1-Pro-preview); 最强基线 AIBuildAI 用 24 小时和 Claude-Opus-4.6, 是 63.1. 和 AlphaEvolve 等专门的算法发现方法比, 15 个数学算法优化任务里 11 个最好.

这类循环跨代迭代, 外表像自改进, 但改进器不变, 变的只是外部程序. 按 1.2 的约定, 搜出来的程序是产物. 产物被装进 Agent 的 Σ\Sigma, 之后的任务继续调用, 才是 L2; 一次性的控制器不跨任务携带, 只是一次输出. 这一类特有的风险是钻模拟器的空子: 程序在评测 harness 上赢了, 换到真实环境不迁移.

还有一组生成符号规则, 由验证链路先筛一遍. 综述举的 GenTI 把分析员的提示转成可部署的 Snort, Suricata, YARA 入侵检测规则, 中间经过逐步验证. 在升级前拒掉格式错误的产物, 是实际的可靠性收益. 但编译和单元测试证明的仍然只是覆盖到的情况, 要证明更广的收益, 还得做留出的端到端评测. 这条要求在后面每一层都会重复出现.

2.3. 程序契约与观察等价

程序能运行只是最弱门槛. L2 修改的对象若进入长期使用的脚手架, 还要保持外部契约. 把组件写成状态转移

(o,s′)=F(i,s;e),(6)(o,s')=F(i,s;e), \tag{6}

ii 是输入, ss 是持久状态, ee 是工具与环境, oo 是输出. 契约由前置条件 P(i,s)P(i,s)、后置条件 Q(i,s,o,s′)Q(i,s,o,s') 与允许副作用集合 AA 构成. 候选程序 F′F' 至少应满足

P(i,s)⟹Q(i,s,F′(i,s;e)),effects(F′)⊆A.(7)P(i,s)\Longrightarrow Q(i,s,F'(i,s;e)),\qquad \mathrm{effects}(F')\subseteq A. \tag{7}

类型检查只覆盖契约的一小部分. 一个检索函数返回合法 JSON, 仍可能把来源字段填成错误页面; 一个写入函数正常返回成功, 仍可能越过用户指定目录. 后置条件要同时检查结构、语义与副作用. 对无法完全形式化的语义, 可以把执行器、人工抽样和独立模型判官组合起来, 其中可执行断言优先级最高.

比较新旧程序时, 源码差异不是行为差异. 若对允许输入集合 X\mathcal X 有

∀x∈X,Obs⁡(F,x)=Obs⁡(F′,x),(8)\forall x\in\mathcal X,\quad \operatorname{Obs}(F,x)=\operatorname{Obs}(F',x), \tag{8}

两者在当前观察边界下等价. Obs⁡\operatorname{Obs} 应包含返回值、外部写入、异常类别、资源上界和审计事件. 忽略副作用会把「输出一样但多发了一封邮件」误判为等价; 把内部日志全部纳入又会让无害重构无法通过. 观察边界需由调用者真正依赖的契约决定.

完整证明式 (8) 通常不可行, 测试只能在有限样本上近似. 性质测试从输入生成器采样, 验证不变量而非固定答案; 差分测试让 FF 与 F′F' 接受同一输入并比较观察; 变异测试故意给程序植入小错误, 检查测试是否能杀死这些变体. 三者分别回答「一般规则是否保持」「升级有没有非预期变化」「测试自身有没有辨错能力」. 自动程序搜索若可以反复查看固定测试, 隐藏测试和任务族留出仍不可省.

契约还有时间维度. 某次调用满足后置条件, 不代表一串调用后仍成立. 例如缓存写入正确, 但版本变化后读取旧值; 重试一次正确, 网络抖动下却重复提交. 对状态机可写线性时序性质: 安全性要求坏事从不发生, 如「未经确认永不产生外部写入」; 活性要求好事最终发生, 如「已接受任务最终完成或明确失败」. 固定长度回归能发现常见路径, 长循环和并发交错还要靠模型检查、模糊测试或在线守卫补足.

程序生成常把测试当规格, 这里容易发生规格博弈. 若测试只检查文件存在, 搜索器会生成空文件; 若只检查平均延迟, 它可能让少数困难任务超时; 若评分脚本依赖某个字段, 候选可能直接读取该字段而没有学会任务. 防止这类捷径要把评价拆成多种互不完全公开的证据, 并审查候选是否接触标签、评测文件和基准专用标识. 程序越能自由读取环境, 越需要把可见信息列入威胁模型.

部分可观测下的控制程序:Agent 脚手架通常无法直接看到真实任务状态 sts_t. 它只接收用户文本、工具返回与历史摘要组成的观察 oto_t, 再选择动作 ata_t. 更贴切的形式是部分可观测马尔可夫决策过程: 状态按 T(st+1∣st,at)T(s_{t+1}\mid s_t,a_t) 演化, 观察来自 O(ot∣st)O(o_t\mid s_t), 脚手架维护信念 bt(s)=P(st=s∣o1:t,a1:t−1)b_t(s)=P(s_t=s\mid o_{1:t},a_{1:t-1}). 提示、记忆与控制流共同决定怎样近似更新 btb_t.

这解释了为什么把所有逻辑塞进一段提示并不等价于显式程序. 长提示可以描述「若证据不足则继续检索」, 但模型每轮能否记住证据缺口取决于上下文中的隐式状态. 显式控制器可以保存 missing_evidence, verified_claims, budget_left 等字段, 并规定状态转移. 两者表达能力都可能足够, 可验证性不同: 程序状态能做断言和回放, 隐式文本状态容易受摘要、截断和措辞干扰.

信念状态也不能简化成一个自报置信度. 模型给出 0.9 并不保证在相似任务上有九成正确率. 更可靠的状态把不确定性分解为可检查来源: 事实有没有独立证据, 工具调用是否成功, 候选之间是否冲突, 关键假设是否经过反例测试. 这些离散变量可以驱动动作. 例如证据缺失触发检索, 执行失败触发修复, 证据冲突触发独立裁决; 同一个「低置信」无法决定该走哪条恢复路径.

控制程序的价值可用信息价值解释. 当前信念下直接提交的期望效用为 V(bt)V(b_t). 调用工具 uu 会产生成本 c(u)c(u) 和随机观察 oo, 更新为 bt+1=τ(bt,u,o)b_{t+1}=\tau(b_t,u,o). 只有当

Eo[V(τ(bt,u,o))]−V(bt)>c(u)(9)\mathbb E_o[V(\tau(b_t,u,o))]-V(b_t)>c(u) \tag{9}

时, 额外调用才值得. 这是一条原理性的停止边界. 实际系统无法精确求信念与价值, 仍可用历史任务估计不同故障状态下某个工具的边际收益. 如果一次复核在答案已经有可执行证明时几乎从不改结果, 它应被剪掉; 如果在来源冲突时经常纠错, 就应条件启用.

反例是「循环越多越可靠」. 多轮反思在观察没有增加时只是对同一信息重复采样, 可能提高候选多样性, 不会消除共同盲点. 新一轮只有引入独立证据、不同执行路径或更强验证器时才真正改变信息集. 若所有 Agent 共享底座、提示与来源, 多数投票的误差高度相关. 脚手架应记录每轮新增了什么可辨识信息, 没有信息增量且候选稳定时停止, 而非机械完成预设轮数.

部分可观测还带来状态别名: 两个真实状态产生相同观察, 却要求不同动作. 工具返回「未找到」可能表示目标不存在, 查询写错, 权限不足或服务暂时不可用. 若控制器把它们都映射成空结果, 后续策略无法正确恢复. 工具接口应返回结构化错误类别与可重试属性, 必要时追加诊断动作来区分状态. 这里的接口设计会直接改变 Agent 可以识别的环境, 因而不是无关紧要的工程包装.

程序搜索与提示搜索的差别:提示依靠模型解释, 程序则显式规定控制流. 同一意图写成代码后, 分支、循环、异常和状态更新可以被测试. 代价是搜索器拥有更大破坏面: 一个语法正确的改动也可能泄露数据、吞掉异常或绕过验证.

程序候选第一步要通过静态门: 语法、类型、依赖白名单、文件与网络权限. 随后运行单元测试、性质测试和资源限制. 最终才在端到端任务上计分. 分层验证把明显错误挡在昂贵模型调用之前, 也减少把基础运行能力误当成任务智能.

测试通过只证明观察行为. 搜索器能看到测试时, 会找到硬编码和边界漏洞. 隐藏测试、随机性质测试与变异测试分别检查未见输入、一般性质和测试集辨错能力. 若轻微错误程序也能全部通过, 测试集不具备足够判别力.

程序修改应保持最小差异. 一次同时改五个模块, 即使得分提高也很难知道原因. 原子补丁、明确前置条件和回滚点让每个变化可审计. 多个原子补丁确实存在协同效应时, 再用组合实验确认.

符号规则与自然语言规则:自然语言规则表达灵活, 边界可能含糊; 符号规则精确, 覆盖范围依赖形式化. 把“高风险请求必须复核”写成布尔谓词, 需要定义高风险分类器、复核成功条件和分类器不确定时的行为. 形式化不会自动解决概念缺失, 它会迫使缺失暴露出来.

混合系统让模型提出候选, 符号层执行约束. 例如模型选择工具与参数, 类型系统检查参数, 权限策略决定是否允许, 执行器返回结构化结果. 这比让一段长提示同时承担规划与安全更容易验证.

规则冲突需要显式优先级. 安全规则要求停止, 任务规则要求继续时, 系统应有确定裁决. 依靠模型临场解释会使同一状态得到不同结果. 优先级图还要检查循环, 避免 A 高于 B、B 高于 C、C 又高于 A.

规则表不断增长会造成不可达条款和重复条件. 可记录每条规则在回归集中的触发次数, 对长期未触发规则做专门测试后再决定保留. 删除规则同样属于结构修改, 必须证明其保护能力已被其他机制覆盖.

停止条件决定计算边界:迭代代理若没有可靠停止条件, 很容易把更多尝试误当进步. 固定最大轮数简单但不适应任务难度. 基于验证的停止在答案通过执行器或证据一致时结束, 更节省预算; 验证器误判会提前终止.

停止可写成最优停止问题. 第 tt 轮当前答案效用估计为 VtV_t, 再运行一轮的预期增益为 GtG_t, 成本为 ctc_t. 当 Gt<ctG_t<c_t 时停止. 实际只能估计 GtG_t, 可以从历史同类任务学习, 并对高风险任务采用保守阈值.

连续几轮答案不变并不代表正确, 可能表示系统陷入固定点. 应把“不再变化”和“已被外部证据验证”分成两个状态. 前者触发换策略、换工具或升级模型, 后者才允许成功退出.

失败退出也要定义. 工具持续超时、证据冲突无法消解或预算耗尽时, 系统应返回已知范围与失败原因, 而非生成一个看似完整的答案. 这种可控失败是脚手架质量的重要组成部分.

状态、缓存与幂等性:工作流不仅是节点图, 还包含跨节点状态. 同一工具调用重试时是否重复写入、缓存结果是否过期、并行分支怎样合并, 都会改变实际行为. 忽略状态语义的架构搜索可能在离线回放很好, 在线运行产生重复副作用.

幂等操作允许安全重试. 对外部写操作要使用请求标识、提交前检查或两阶段确认. 搜索器若增加重试节点, 必须知道下游动作是否幂等; 否则提高“成功率”的同时可能重复发送或重复扣费.

缓存减少成本, 也会冻结旧错误. 缓存键应包含模型、提示、工具版本和关键参数, 缓存条目带来源与时间. 比较新旧脚手架时要说明是否共享缓存, 否则一方可能因命中历史结果获得不公平优势.

并行分支写同一状态时需要合并规则. 最终写入获胜简单却不稳定; 基于版本号的乐观并发能发现冲突; 将状态设计成可交换合并的数据结构可减少顺序依赖. 这些工程性质直接决定工作流能否复现, 也属于 L2 产物的语义.

3. 架构与工作流

3.1. 分阶段的角色

上一节改的是一个组件说什么, 算什么. 这一节改的是组件怎么组织: 有哪些角色, 角色之间怎么通信, 谁能调哪些工具, 工作怎么在系统里流转.

最小的结构改动是把一个大 Agent 拆成几个角色, 按阶段串起来, 每个阶段结尾放一个验证器, 出错时能定位到阶段.

AgentOrchestra (Zhang 等, Skywork AI 与南洋理工) 让一个中央规划 Agent 调度深度研究, 浏览器操作, 深度分析, 工具生成, 报告五个子 Agent, 工具, 环境和 Agent 都当作带版本和生命周期的资源管理. 工具生成 Agent 在运行中造新工具, 保留下来复用, 论文报告造了 50 多个专用工具, 之后任务的复用率 30%. 论文当前修订版报告 GAIA 测试集 89.04%. 「Evolved」变体对分析 Agent 的提示和解答做自我反思改写, GPQA 上 gpt-4o 从 47.98 到 58.08, gpt-4.1 从 65.15 到 67.67. 论文 v1 发布于 2025 年, 这里的数字取自更新后的修订版.

角色分离的可靠性贡献是归因: 能判断哪个组件失败了. 但分工是人设计的, 它说明一个好的手工结构, 说明不了一次能迁移的结构改动. 跨任务保留下来的是固定角色里积累的工具和经验.

3.2. 把架构当候选

第二组把架构本身当候选产物, 在角色池, 模块图或 Agent 配置上搜索.

ADAS (Hu, Lu, Clune, 2024, 不列颠哥伦比亚大学) 让 GPT-4 当元 Agent, 把完整的 Agent 写成 Python 的 forward() 函数. 每个候选在目标领域的验证数据上评测, 不论好坏都加入一个不断增长的档案, 元 Agent 看着档案写下一个. 搜索跑 30 轮, 被发现的 Agent 用 GPT-3.5 评测:

方法 DROP F1 MGSM MMLU GPQA
CoT 64.2 28.0 65.4 29.2
LLM Debate 60.6 39.0 65.6 31.4
Role Assignment 65.8 30.1 64.5 31.1
提示优化 (OPRO) 69.1 30.6 67.6 32.9
Meta Agent Search 79.4 53.4 69.6 34.6

引言里「DROP F1 高 13.6, MGSM 高 14.4%」是和最好的手工设计比 (Role Assignment 65.8, LLM Debate 39.0), 和 OPRO 的差距更小. 在 MGSM 上搜出的 Agent 迁到 GSM8K 和 GSM-Hard, 分别比基线高 25.9% 和 13.2%; 论文也承认, 跨领域时它们赶不上专门为目标领域设计的 Agent. 在 ARC 上用 GPT-3.5 搜出的 Agent 迁到 Claude-Sonnet, 得 48.3, Self-Refine 是 39.3. 一次 ARC 上的搜索加评测约花 500 美元 API 费用, 推理领域约 300 美元.

AgentSquare (Shang 等, 2024, 清华) 把 Agent 拆成规划, 推理, 工具使用, 记忆四个接口统一的模块, 从 16 个已发表的 Agent 里抽出模块, 组合空间有 1050 种. 搜索交替做两件事: 让元提示写新模块的代码, 让模型替换模块重新组合. 一个上下文内的代理模型预测候选表现, 跳过没希望的设计. 新模块进入模块池, 之后可以复用. 六个任务上比最好的人工设计平均高 17.2%. 和其他搜索方法比 (GPT-4o), AgentSquare 在 ALFWorld 上 0.695, ADAS 0.543, 随机搜索 0.620, 贝叶斯优化 0.634. 在 Travel 上随机搜索 0.563, 高于 ADAS 的 0.373. 随机搜索都能拿到不错的分数, 说明搜索空间本身的设计占了增益的一部分.

AFlow (Zhang 等, 2024, DeepWisdom 与港科大广州) 把工作流写成代码图, 节点调用模型, 由一组可复用的算子 (集成, 复查等) 组成. 用蒙特卡洛树搜索, 每轮只改一处; 优化器是 Claude-3.5-sonnet, 执行器是 GPT-4o-mini, 在验证集上执行打分, 跑 20 轮. 过去的修改和分数构成的树是它保留的经验. 六个基准平均 80.3, ADAS 67.2, 5 次采样的 CoT 自洽 76.0, 直接问答 72.8. 摘要说「让小模型在特定任务上以 GPT-4o 4.55% 的成本超过它」, 附录给出的条件是: 只在 HumanEval 上, 对比 GPT-4o 直接问答, 4.55% 成本那一组是持平 (0.9390 对 0.9389), 严格超过的是 5.92% 和 8.05% 成本的两组.

GPTSwarm (Zhuge 等, 2024, KAUST 与 IDSIA) 把 Agent 写成有向无环计算图, 节点是模型调用或工具, 边是信息流. 边优化用 REINFORCE 学每条边存在的概率, 节点优化改写节点提示. 保留下来的是学到的边分布和节点提示. 迷你填字游戏上, GPT-3.5-Turbo 优化十轮后 0.575, 初始分布 0.465, 一个边密度相近的固定分布 0.510; 迁到 GPT-4-Turbo 得 0.800. HumanEval 上节点优化从 0.76 到 0.88.

GPTSwarm 表 1 的 GAIA 结果 (平均 18.45, GPT-4-Turbo 单独 9.70) 常被引用为「提升 90.2%」. 论文 3.4 节写明, 这组实验既没有边优化也没有节点优化, 用的是 7 个 ToT 组成的群加自洽投票. 这个数字说明多 Agent 集成有效, 说明不了图优化.

6. 参考来源

  1. Kaiqi Wang, Wenjin Hou, Yuchen Yan 等 (2026). Diving into Reliable Self-Evolving Agents: A Survey. §5 Scaffold-Level Self-Evolution, §5.1 Prompts and Programs, §5.2 Architecture and Workflows.
  2. Yongchao Zhou, Andrei Ioan Muresanu 等 (2022). Large Language Models Are Human-Level Prompt Engineers. ICLR 2023.
  3. Chengrun Yang, Xinyun Chen 等 (2023). Large Language Models as Optimizers. ICLR 2024.
  4. Reid Pryzant 等 (2023). Automatic Prompt Optimization with "Gradient Descent" and Beam Search. EMNLP 2023.
  5. Qingyan Guo 等 (2023). EvoPrompt: Connecting LLMs with Evolutionary Algorithms Yields Powerful Prompt Optimizers. ICLR 2024.
  6. Mert Yuksekgonul 等 (2024). TextGrad: Automatic "Differentiation" via Text.
  7. Omar Khattab 等 (2023). DSPy: Compiling Declarative Language Model Calls into Self-Improving Pipelines.
  8. Krista Opsahl-Ong, Michael J Ryan 等 (2024). Optimizing Instructions and Demonstrations for Multi-Stage Language Model Programs.
  9. Lakshya A Agrawal 等 (2025). GEPA: Reflective Prompt Evolution Can Outperform Reinforcement Learning.
  10. Arthur Câmara, Vincent Slot, Jakub Zavrel (2026). Self-Optimizing Multi-Agent Systems for Deep Research.
  11. Xiwen Chen, Wenhui Zhu, Songzhu Zheng 等 (2026). SHARP: A Self-Evolving Human-Auditable Rubric Policy for Financial Trading Agents.
  12. Hanchen Li 等 (2026). Combee: Scaling Parallel Prompt Learning for Self-Improving LLM Agents.
  13. Weixian Xu, Shilong Liu, Mengdi Wang (2026). Eevee: Towards Test-time Prompt Learning in the Real World for Self-Improving Agents.
  14. Md Asif Iqbal Fahim, Oluwadamilola Adebayo, Alessio Ferrari (2026). Software Self-Extension with SelfEvolve: an Agentic Architecture for Runtime Code Generation. SEAMS 2026.
  15. Shangheng Du 等 (2026). MLEvolve: A Self-Evolving Framework for Automated Machine Learning Algorithm Discovery.
  16. Wentao Zhang 等 (2025). AgentOrchestra: Orchestrating Multi-Agent Intelligence with the Tool-Environment-Agent (TEA) Protocol.
  17. Shengran Hu, Cong Lu, Jeff Clune (2024). Automated Design of Agentic Systems. ICLR 2025.
  18. Yu Shang, Yu Li 等 (2024). AgentSquare: Automatic LLM Agent Search in Modular Design Space. ICLR 2025.
  19. Jiayi Zhang 等 (2024). AFlow: Automating Agentic Workflow Generation. ICLR 2025.
  20. Mingchen Zhuge 等 (2024). GPTSwarm: Language Agents as Optimizable Graphs. ICML 2024.
  21. Zixuan Ke 等 (2025). MAS-ZERO: Designing Multi-Agent Systems with Zero Supervision.
  22. Martin Legrand, Tao Jiang 等 (2026). Mimosa Framework: Toward Evolving Multi-Agent Systems for Scientific Research.
  23. Yufan Dang 等 (2025). Multi-Agent Collaboration via Evolving Orchestration. NeurIPS 2025.
  24. Guibin Zhang 等 (2024). G-Designer: Architecting Multi-agent Communication Topologies via Graph Neural Networks.
  25. Guibin Zhang 等 (2024). Cut the Crap: An Economical Communication Pipeline for LLM-based Multi-Agent Systems.
  26. Congjia Tian, Yuhang Yao, Jiaming Cui (2026). QueenBee Planner: Skill-Evolving Communication Topologies for Token-Efficient LLM Multi-Agent Systems.

上一篇: 2.2.2 · L1: 合作式协同演化与模型层的上限 · 下一篇: 3.1.2 · L2: 技能, 记忆与 Harness