Harness as a Language: A Minimalist Agent Framework With Maximal Expressivity
Zhening Li, Joshua Liu, Mateja Vukelic, Nicole Shen, Supriya Lall, Amitayush Thakur, Alex Zhang, Omar Khattab, Jonathan Light, Armando Solar-Lezama
cs.AI
2026-09-23
MIT的JAZ把agent循环收成可递归的invoke,不另外挂记忆或自改进套件。StuLife远距回忆69.9%对Letta的61.8%、花费约一半;AppWorld任务完成率74.2%对ACE的69.9%。
现在的语言模型智能体围着 agent loop 转:模型调工具、看输出、再决定下一步。ReAct 把动作交给模型选,CodeAct 把动作升级成 REPL 里的可执行代码,Recursive Language Models 再把子智能体做成默认能力。长程记忆和跨任务自改进却仍被做成套在循环外面的专用套件,MemGPT/Letta 一类管记忆,ACE 一类管提示词演化。
MIT CSAIL 的 Li、Liu、Vukelic 和 Solar-Lezama、Khattab 等人问的是:一个几乎只剩循环本身的最小 harness,能不能把这些专用套件做的事也做了。答案是框架 JAZ,核心原语就一个:invoke。
先把 invoke 定义成语言层的东西。给任意图灵完备语言加一个原语 invoke(...),语义是:把所有命名参数序列化给语言模型,模型当场写出这次调用的函数体并执行。提示词、工具、普通数据在 invoke 里不作区分,都是参数。因为语言里已经有 invoke,模型写的代码可以递归再调 invoke,子智能体是默认能力。函数式的尾递归 invoke 在理论上就是一个闭合的 agent loop;Python 里这么写浪费栈、也破坏前缀缓存,于是 harness 自动补上尾调用并做成 REPL。这个循环有两条硬性质:
框架侧还有动态作用域 scope()(工具自动传给所有子孙 invoke)、一套 hook(预算、校验、窗口告警、轨迹回放)和 Config(llm, repl, protocol)。默认协议把模型原文整段当代码,REPL 输出过长才截断。
长程任务用尾递归委托:窗口快满时,把剩余工作 return invoke(..., prevhistory=旧历史+history),历史按引用传下去,不靠摘要。实验里用内置 ContextWindowWarning 在窗口过线时塞一条用户消息,告诉模型去委托,并给一段代码模板。
跨任务自改进则让顶层 invoke 当元智能体:改子 invoke 的提示词和 skill 函数,跑下一批任务,读返回的 history 和评测,再改输入。提示词只写工作流,不含代码模板。子智能体递归深度封顶为 2。
对照的 CodeAct 和 CodeAct+子智能体是在 JAZ 里用 hook 抠掉「提示和历史是变量」之后的受控消融,因为已有开源实现的提示词和 REPL 有缺陷,官方数字更差。
StuLife 模拟一个大学生一学期的 1284 个有序任务,典型一局 7000–8000 次环境交互、3000–5000 次模型调用。939 个计分任务里 207 个要回忆 50 个任务之前的信息。模型一律 GPT-5.4 nano (high),3 次独立运行。
| 方法 | 全量通过率 | 远距回忆通过率 | 花费 |
| CodeAct(逐任务、无记忆) | 52.5% | 24.8% | $4.4 |
| CodeAct+子智能体(JAZ 重实现) | 60.0% | 32.0% | $13.1 |
| Letta Agent | 70.9% | 61.8% | $42.1 |
| JAZ invoke | 72.6% | 69.9% | $18.3 |
远距回忆上 JAZ 比 Letta 高约 8 个点,花费不到一半。一个期末虚构协议题,正确选项的课在 497 个任务之前。JAZ 当时已递归 70 层,但 prevhistory 里全文还在,搜协议名一拍就召回。CodeAct+子智能体把用户提示手抄进子智能体,抄丢了「这是虚构协议、必须查课」的说明,按真实世界知识答错。Letta 的 conversationsearch 做关键词加向量检索,顶中的是题目本身或名字相近的别的协议,没有精确子串匹配。
AppWorld test-challenge 417 题,求解端 GPT-5.4 nano,元智能体 GPT-5.4,自改进方法跑 6 次。JAZ 任务完成率(TGC)74.2%,场景完成率 51.1%,花费 $20.9。ACE 接到同一套 CodeAct 上是 69.9% / 47.1%,花费 $30.6,其中元智能体就 $17.1。ACE 的 reflector 和 curator 单题成本大约是 JAZ 元智能体的 10 倍,所以 ACE 只在前 42 题(10%)上学习;JAZ 可以在全测试集上学习还更便宜,因为它按批调度、按需读轨迹,而且除了提示词还能改 skill。
这篇把「记忆系统」和「自改进系统」从独立产品降成循环表达力的推论。历史是对象,就可以按引用传递、按程序检索;顶层能改子调用的输入,就可以当元智能体。对正在堆 MemGPT、playbook、skill 库的人,这是一个明确的对照:先问缺的是专用套件,还是模型没法程序化地碰到自己的上下文。
它仍是框架论文,不是新模型。数字绑在 GPT-5.4 家族和两个基准上。但消融是干净的:同一套 JAZ 里关掉「提示和历史是变量」,远距回忆从 69.9% 掉到 32%。多出来的表达力有着落。
论文没有独立的局限节。几个口子要自己补。所谓 prompt-only 的长程实验,仍然靠 ContextWindowWarning 塞代码模板,不是模型自发发明尾递归委托。按引用保存全文历史,递归 70 层之后对象会膨胀,评测没报内存和延迟。AppWorld 的自改进每题都能看到完整测试反馈,生产里没有这种老师。StuLife 和 AppWorld 都是模拟器,n 只有 3 到 6。官方 CodeAct 数字更差被归因于提示词和 REPL 缺陷,于是对照也在 JAZ 里重写,框架质量本身是一个混杂因素。只测了 GPT-5.4 家族,换模型表达力够不够,还没有。