语言模型代理的自我编程执行

arXiv cs.AI 论文

摘要

本文介绍了自我编程执行(SPE),这是一种代理架构,其中语言模型生成其自身的编排程序,而非依赖固定的外部框架。文章提出了“Spell”,一种基于 Lisp 的语言,支持自我编辑和重新求值,并展示了前沿模型能够利用该方法成功执行代理任务。

arXiv:2605.06898v1 宣布类型:new 摘要:现有语言模型代理的核心是一个固定的编排程序,负责处理连续回合之间的状态转换。本文介绍了自我编程执行(SPE),一种代理架构,其中模型的补全结果本身就是编排程序,而外部框架仅评估该程序,并不强加其自身的编排策略。我使用代理机(agentic machines)对这一概念进行了形式化描述:SPE 状态是指模型补全结果可以加载嵌入的机器副本的任意状态,这意味着它不受任何固定的回合间编排策略约束。在实践中实现 SPE 并非易事,因为相同的数据既作为模型上下文,又作为可执行程序。因此,我引入了 Spell,一种基于 Lisp 的语言,其中的程序可以编辑并重新求值自身,且诸如模型调用等具有副作用的表达式被结构设计为:重新求值编辑后的程序不会重放其副作用。针对现有模型(未针对 SPE 或 Spell 进行训练)的实验表明,前沿模型可以在这种机制下运行并完成具有挑战性的代理任务。这些结果展示了语言模型如何在没有任何固定编排策略的情况下充当代理,同时也引出了这样一个问题:经过自我编程执行训练的模型可能会学习到什么样的自我编排策略。代码可在 https://github.com/lukejoconnor/spell 获取。
查看原文
查看缓存全文

缓存时间: 2026/05/11 07:09

# 大语言模型智能体的自编程执行

**来源:** https://arxiv.org/html/2605.06898

###### 摘要

现有大语言模型智能体的核心是一个固定的编排程序,负责控制连续轮次之间的状态转换。本文引入了**自编程执行**(Self-Programmed Execution, SPE),一种智能体架构,其中模型生成的补全内容本身就是编排程序,而运行环境(harness)仅负责评估该程序,不施加其自身的编排策略。我使用智能体机(agentic machines)的形式化定义来阐述这一概念:SPE 状态是指模型补全可以加载嵌入式机器的任何状态,这意味着它不受固定的轮次间编排策略约束。在实践中实现 SPE 并不简单,因为同一数据既是模型上下文又是可执行程序。因此,我引入了 **Spell**,一种基于 Lisp 的语言,其中程序可以编辑并重新评估自身,且模型调用等带有副作用的表达式被结构化为:重新评估编辑后的程序不会重放其副作用。对未针对 SPE 或 Spell 进行训练的现有模型的实验表明,前沿模型能够在这种机制下运行并完成具有挑战性的智能体任务。这些结果展示了大语言模型如何在没有任何固定编排策略的情况下充当智能体,并提出了一个有趣的问题:经过自编程执行训练的大模型可能会学到什么样的自我编排策略。代码可用:https://github.com/lukejoconnor/spell。

## 1 引言

大语言模型(LM)智能体的运行环境(harness)既充当执行层,允许 LM 与环境交互,又充当编排程序,规定跨轮次持续的状态、提供给模型的上下文以及可用的动作。随着模型能力的增强,运行环境及所有编排策略方面已成为工程努力的主要目标,特别是提供给 LM 的上下文策略(Horthy, 2025 (https://arxiv.org/html/2605.06898#bib.bib13))。(在本文中,我用*编排*来描述多轮次、不一定是多智能体的逻辑或策略。)从业者的经验强调了编排策略的重要性(Anthropic Applied AI Team, 2025 (https://arxiv.org/html/2605.06898#bib.bib12); Lopopolo, 2026 (https://arxiv.org/html/2605.06898#bib.bib66)),并且已经开发了用于定制智能体工作流的商业框架(Trivedy, 2026 (https://arxiv.org/html/2605.06898#bib.bib67); Hong et al., 2024 (https://arxiv.org/html/2605.06898#bib.bib16))。所有这些人力的投入自然引出了自动化的需求。最近的一个趋势是设计自我演化的运行环境,例如通过添加外部的反思循环;另一个趋势是启用部分自我编排,例如提供用于子智能体委托的工具(见第 5 节 (https://arxiv.org/html/2605.06898#S5))。

本文探讨编排策略是否必须属于运行环境。如果运行环境仅作为执行层,而不作为编排者呢?在**自编程执行**(SPE)中,运行环境评估一个由模型编写的程序,该程序完全负责编排。这个程序可能会编写一个提示词,附加工具调用的结果,然后进行递归的自我调用。自我调用重复这一过程:输入一个前缀,调用 LM 进行补全,并评估补全结果:

`self-call(prefix) ≔ eval(complete(prefix))`  
\texttt{self-call}(\text{prefix})\;\coloneqq\;\operatorname{eval}(\text{complete}(\text{prefix})). (1)

第一轮的输出是通过评估带有提示词和自我调用的初始程序产生的。随后,每一次轮次间的转换都由模型编写的自我调用表达式指定,上下文作为该表达式的参数穿过轮次边界。运行环境仍然存在作为执行层,但它执行的程序是由模型编写的。

现有的智能体架构在由模型控制的步骤和由运行环境的固定编排策略控制的步骤之间交替(图 1 (https://arxiv.org/html/2605.06898#S1.F1))。典型的例子是 ReAct 循环(Yao et al., 2023 (https://arxiv.org/html/2605.06898#bib.bib34))。递归语言模型(RLMs)(Zhang et al., 2026 (https://arxiv.org/html/2605.06898#bib.bib20))是最接近的先前架构:它们在 REPL 中执行任意的模型编写代码,并且该代码能够递归地生成子智能体。然而,在模型编写的程序运行后,运行环境发出下一个主智能体轮次,同时保持对话历史和 REPL 状态;主智能体轮次之间的转换受固定编排策略的约束。SPE 与 RLMs 的相同之处在于模型编写的程序由外部运行时评估。不同之处在于,该程序完全负责编排策略,而不仅仅是子智能体委托,并且不在固定的智能体循环内运行。

**图 1:三种智能体架构。** 彩色框区分了在运行环境中实现的程序逻辑(蓝色)与由模型编写的程序逻辑(黄色)。在所有情况下,这些程序都由模型外部的运行环境运行时执行。(a)在 ReAct(Yao et al., 2023 (https://arxiv.org/html/2605.06898#bib.bib34))中,模型从预定义的动作空间中选择动作。编排程序运行智能体循环,跨轮次保持状态(例如,对话历史)。(b)递归语言模型(RLMs)(Zhang et al., 2026 (https://arxiv.org/html/2605.06898#bib.bib20))在运行环境管理的主智能体循环内部执行模型编写的编排代码,该循环负责主智能体自身轮次之间的交接。(c)在 SPE 中,模型编写的程序指定编排策略,不受任何外部智能体循环的限制。模型编写的程序仍由外部运行时执行。

本文做出了四项贡献。首先,它引入了一种简单的智能体架构 SPE,可以看作是近期强大趋势的极限情况。其次,它为编排策略和 SPE 引入了形式化抽象,定义了智能体机的 **SPE 状态**并证明了所提出的架构是充分的。第三,它引入了面向大语言模型的自编程执行语言(Spell),一种用于 SPE 的语言,旨在定位并解决在实践中实现 SPE 时出现的挑战。第四,它实证研究了现有模型在未针对 SPE 或 Spell 进行特定训练的情况下,在使用 Spell 解决困难智能体任务时的表现。

## 2 形式化自编程执行

“固定编排策略”是什么意思?消除它意味着什么?为什么这样做会导致特定的智能体架构——即被称为 SPE 的“将模型补全作为程序进行评估”?本节引入形式化抽象。其主要贡献在于定义了智能体机的“SPE 状态”,而未指定任何特定过程。主定理表明,在具有模型调用和 `eval` 的 CEK 风格求值器中,种子程序 `let y = lm q in eval(y)` 在 `eval(y)` 中会达到这种状态。证明和额外结果见附录 A (https://arxiv.org/html/2605.06898#A1)。

###### 定义 2.1(智能体机)

固定提示空间 $P$ 和补全空间 $C$。在 $(P, C)$ 上的*智能体机*是一个三元组 $X = (S, p, h)$,其中 $S$ 是状态空间,$p: S \to P$ 是将状态映射到提示词的提示函数,$h: S \times C \to S \cup \{\mathbf{1}, \uparrow\}$ 是将状态/补全对映射到下一个状态的运行环境函数,下一个状态可以是 $S$ 中的元素、特殊的终止状态 $\mathbf{1}$ 或发散状态 $\uparrow$。该机器与一个大语言模型配对,该模型将 $P$ 中的提示词映射到 $C$ 中的补全,可能是非确定性的。智能体机每次状态转换恰好进行一次 LM 调用,这是适当的粒度级别,因为它反映了 LM 所观察到的内容。一个机器嵌入到另一个机器中是一种保持模型可观察提示词的注入映射,使得模型无法区分状态与其嵌入(形式化见定理 A.4 (https://arxiv.org/html/2605.06898#A1.Thmdefinition4)),因此它将具有等效的行为。

###### 定义 2.2(嵌入)

将 $X' = (S', p', h')$ *嵌入*到 $X = (S, p, h)$ 是一个单射映射 $e: S' \to S$,扩展为 $e(\mathbf{1}) = \mathbf{1}$ 和 $e(\uparrow) = \uparrow$,使得对于每一个 $x' \in S'$ 和补全 $c \in C$,有 $p(e(x')) = p'(x')$ 和 $h(e(x'), c) = e(h'(x', c))$。

直观地说,SPE 状态是指模型通过选择补全来选择下一个状态,而不仅仅是在预定义的动作中选择的状态。形式上,它由一个由补全生成的自嵌入定义:

###### 定义 2.3(SPE 状态)

对于智能体机 $X$ 的状态 $x$,$(X, x)$*补全生成* $X'$,如果存在 $X'$ 到 $X$ 的嵌入 $e$,使得对于所有 $y \in \operatorname{im}(e)$,存在某个补全 $c$ 生成从 $x$ 到 $y$ 的转换:$h(x, c) = y$。$X$ 的一个 *SPE 状态* 是一个状态 $x_0$,使得 $(X, x_0)$ 补全生成 $X$。

这些抽象清晰地映射到“编排”和“固定编排策略”的语义上。对于 $X$ 的状态 $x$,映射 $c \mapsto h(x, c)$ 是在该状态暴露的编排策略:在模型发出补全 $c$ 后,该策略产生下一个状态。在普通的智能体循环中,该函数的像受到限制,存在一些无法通过任何模型补全达到的状态;我们可以说策略是固定的。相比之下,在 SPE 状态中,模型可以通过发出适当的补全访问任何后继状态(直至嵌入)。因此,“没有固定编排策略”并不意味着外部运行时不存在或 $h$ 消失。它意味着模型自由地选择后继状态。剩下的工作是证明这一定义由本文称为“SPE”的架构满足。该架构可以在以下智能体机中实现:

###### 定义 2.4(智能体求值器)

*智能体求值器*是一种智能体机,它将标准求值器(此处为 CEK 机)包裹在 LM 调用周围。智能体求值器的状态是那些下一步计算是通过项 $(lm \ v)$ 进行 LM 调用的求值器状态的子集;其运行环境函数用采样的补全替换该项,并继续普通求值直到下一个边界状态。程序“提示模型并评估其补全”被编码在 CEK 智能体求值器中如下所示。我们写 $x \leftarrow_{\partial} E$ 表示 $x$ 是通过评估程序 $E$ 达到的第一个边界状态:

$x^* \leftarrow_{\partial} \texttt{let } y = \operatorname{lm} \, q \texttt{ in } \operatorname{eval}(y).$ (2)

###### 定理 2.5(SPE)

状态 $x^*$ 是 CEK 智能体求值器的一个 SPE 状态。

在较低的抽象层面上,评估模型补全的程序 `eval` 可能很复杂。例如,它可能包括 API 传输逻辑和错误恢复逻辑。只有当这种逻辑限制了智能体机的后继状态(在轮次的粒度上)可以被模型到达时,它才算作编排策略。

###### 推论 2.6(通用性)

由于底层的 CEK 机器是图灵完备的,$x^*$ 补全生成所有具有相同 LM 接口的智能体机,只要它们的提示词和运行环境函数是可计算的。

通用性推论意味着原则上,任何固定编排策略(如果是可计算的)都可以由模型编写的程序安装。然而,这也是双刃剑:由模型编写的任何编排程序同样可以由人类编写或以其他固定方式外部指定。也不应将其解读为性能保证,因为它没有说明给定模型实际上会编写什么程序。因此,SPE 的区分特征不是可以表达什么编排策略,尤其不是给定模型实际表达了什么策略,而是哪个实体负责表达它。

## 3 SPE 的实用语言

使 SPE 实用化需要一种具有 unusual 属性的语言,这促使了 **Spell** 的开发(见附录 B (https://arxiv.org/html/2605.06898#A2) 了解语言细节)。在 SPE 中,相同的数据——模型补全——既是模型上下文窗口的内容,又是规定后续轮次的上下文或提示词前缀的程序。考虑以下尝试将 ReAct 风格循环的一次迭代表示为模型编写的程序,特别是 `this_entire_completion()` 的出现:

```lisp
prompt:="Summarize README.md." 
// LM turn 1 begins here
file_contents := read_file("README.md")
next_prefix := concatenate(this_entire_completion(), "observation:=", file_contents)
self_call(next_prefix)
```

**挑战 1:代码作为上下文持久化。** 表达式 `this_entire_completion()` 序列化正在运行的程序的源代码。该源代码经过编辑以生成新的前缀,此处通过附加一行来实现。为了推广此类逻辑,SPE 语言应使模型易于操纵代码作为数据。因此,**Spell** 使用 Lisp 的语法,具体来说是 Clojure(McCarthy, 1960 (https://arxiv.org/html/2605.06898#bib.bib39); Hickey, 2020 (https://arxiv.org/html/2605.06898#bib.bib45)):程序编写为嵌套表达式,其语法与评估它们的程序相匹配,这种语法极大地简化了生成或转换源代码的程序的逻辑。为了支持创建或引用其自身源代码 specifically 的程序或表达式,**Spell** 还添加了一种自引用 **quines** 形式。表达式 `(quine name expr)` 在评估 `expr` 之前将 `name` 绑定到源代码形式 `(quine name expr)` 作为数据。自然语言可以嵌入在代码中,**Spell** 程序通常定义包含模型可见推理或规划的长字符串字面量。使推理轨迹成为程序一部分的动机在于,它让模型控制它们在后续轮次中是否作为上下文保留。

**挑战 2:重放副作用。** 上述示例在第二回合出现第二个问题。第二回合的程序包含第一回合的程序作为前缀;评估它会重放自我调用,产生无法逃脱的循环,并且也会重放 IO 操作。**Spell** 使用尾表达式模式解决此问题。**Spell** 程序的身体执行普通的本地计算,但不能直接触发副作用,包括自我调用。相反,它计算作为数据的副作用表达式。围绕程序主体的包装器(见下文)仅评估最后一个此类表达式,即*尾表达式*,这个特殊的求值器可以访问副作用函数。当旧的尾表达式后面跟上新追加的源代码时,它不再是尾表达式;它被重构为惰性数据但不予评估。这使得将先前的源代码作为后续轮次的前缀重放变得安全。

**挑战 3:轮次边界干扰。** 第三个问题更加微妙。第二回合的程序在

相似文章

AgentSPEX:一种智能体规范与执行语言

Hugging Face Daily Papers

AgentSPEX 提出了一种领域专用语言,用于构建模块化、可解释的大模型智能体工作流,具备显式控制流、状态管理与可视化编辑器,性能优于现有 Python 耦合框架。

PACE: 双时间尺度自进化小语言模型智能体

arXiv cs.LG

PACE 提出了一种双时间尺度框架,用于小语言模型智能体的自进化,协调低风险的提示精炼与高风险的控制器逻辑更新,在多个基准上实现了高达 +9.2% 的相对提升。

重新思考自我进化语言模型智能体中的经验利用

arXiv cs.CL

本文介绍了 ExpWeaver 框架,该框架优化了自我进化语言模型智能体在运行时决策过程中如何利用过往经验。研究表明,基于推理不确定性选择性调用经验,能在多种环境和模型中提升性能。

自压缩语言模型代理

Hugging Face Daily Papers

SelfCompact是一种脚手架方法,让语言模型自主决定何时以及如何压缩长智能体轨迹,相比固定间隔方法,在减少token成本的同时实现了更好的性能。