推理转 Program 了吗?从「只给 Agent 一个 IPython」说起

一位读者看完 Prime Agent「唯一工具是 Python 解释器」的设计后问:这是不是意味着推理转向程序?回查四年论文链(PAL/PoT → CodeAct → RLM)后我的答案是:对了一半。转成程序的不是推理,而是「算、做、记」三件事的执行权;语言仍然负责想。这篇给出谱系、边界和五个可证伪的推演。

有读者看完《Prime Agent 内幕》——那个默认工具列表只有 ["ipython"] 的 agent——提了一个好问题:照这个趋势,是不是「推理」正在转成「Program」? 这个问题值得单独写一篇,因为它把四年里三件不同的事压成了一句话。拆开看:转成程序的从来不是推理本身,而是推理的三个「下游动作」——算、做、记。语言负责想,这一点四年来没有变,反而被反复确认。

名词速查

术语一句话解释
REPL / IPython交互式代码解释器:喂一段代码、立刻执行、返回结果,且变量在会话里持续存活
JSON tool call主流的工具调用格式:模型输出一个 JSON(工具名 + 参数),宿主执行后把结果塞回上下文
CodeAct2024 年的论文路线:让模型直接输出可执行 Python 代码作为动作,替代 JSON
MCPModel Context Protocol,工具接入的开放协议,详见决策地图·行动接口
RLMRecursive Language Model:把长上下文装进解释器变量里、让模型写代码去查它,而不是全文塞进窗口
sandbox隔离的代码执行环境,模型写的代码在里面跑,坏代码伤不到宿主机

先回答问题:对了一半

没有转的部分:规划、拆解、语义判断——「想」——仍然发生在自然语言里。DeepSeek-R1 式的长思维链是纯自然语言(见《推理机器内部》),Prime Agent 的模型在写下 Python 之前,思考轨迹也是语言。四年里没有任何一篇主流论文成功把开放式推理整体搬进程序。

转了的部分:推理想清楚之后要落地的三个动作,被先后卸载给了解释器——

  1. (2022):PAL/PoT 把算术和数值计算交给 Python;
  2. (2024):CodeAct 把「调用工具、操作环境」统一成执行代码;
  3. (2025–2026):RLM/Prime Agent 把「工作记忆」从 token 窗口搬进解释器的变量空间。

一句话主线:语言负责意图,程序负责执行;四年来这条分界线一步步向语言一侧推进,每一步推进的判据都相同——凡是「执行起来有确定对错」的环节,解释器就比自然语言便宜且可靠。

下面按时间线给证据。

四年谱系:三次卸载

timeline
    title 执行权向解释器的三次转移
    2022 : PAL 与 PoT<br>卸载「算」
    2023 : Voyager 代码技能库 : Chain of Code<br>半代码半语言
    2024 : CodeAct 统一动作空间 : SWE-agent 的 ACI : Wand 综述
    2025 : Cloudflare Code Mode : Anthropic MCP 代码执行 : RLM<br>卸载「记」
    2026 : Prime Agent<br>唯一工具 ipython

第一次卸载:算(2022-11)

PAL(arXiv 2211.10435,ICML 2023)的出发点是一个精确的观察:思维链(CoT)做数学题时,分解常常是对的,算错的是执行。于是 PAL 让模型只负责把题目翻译成 Python 程序(分解、命名、建关系),把「跑出答案」交给解释器。同月的 PoT(arXiv 2211.12588,TMLR 2023)把这个思想命名得更直白——论文副标题就是 Disentangling Computation from Reasoning:在 8 个数值推理数据集上,比 CoT 平均高约 12%(论文自报数字,我核对过摘要,未复现)。

注意这两篇的分工声明:推理(reasoning)留在模型,计算(computation)交给解释器。「推理转 Program」这个说法在源头处就不成立——源头论文恰恰是把推理和程序分开

第二次卸载:做(2024-02)

CodeAct(arXiv 2402.01030,ICML 2024)把同一逻辑从「算数」推广到「行动」:与其让模型每次输出一个 JSON 工具调用,不如让它输出一段可执行 Python,工具变成可以 import 的函数。17 个模型的测试中成功率最高提升 20%——这篇在《决策地图》的行动接口一节详细拆过,不重复。机制差异用伪代码看最清楚:

# 示意伪代码:任务「找成交额 top10 客户,逐个发对账单」
# 路线 A:JSON tool call——每个中间结果都要经过模型上下文
customers = call("list_customers")      # 全量结果进上下文
# 模型肉眼排序、挑 10 个,再逐个:
statement = call("get_statement", c1)   # 又进一次上下文
call("send_email", c1, statement)       # 模型在当复读机
# ……重复 10 遍,30 次往返

# 路线 B:code-as-action——中间结果留在解释器里
top10 = sorted(list_customers(), key=lambda c: c.revenue)[-10:]
for c in top10:
    send_email(c, get_statement(c))     # 循环、变量、组合都是免费的
print(f"已发送 {len(top10)} 封")          # 模型只看这一行

为什么代码赢?我能从来源里核实到三个机制:

  • 表示能力:代码天然有循环、条件、中间变量、函数组合;JSON 一次只能发一枪。这是 CodeAct 论文的核心论证。
  • 训练分布Cloudflare 的 Code Mode 博客(2025-09)给了一个直白的假设——训练语料里有海量真实 TypeScript/Python,而「工具调用」只有少量人造样例;让模型写代码是让它做分布内的事。这是 Cloudflare 的推测,我认为可信但注意它未被对照实验证明。
  • token 经济Anthropic 的 MCP 代码执行博客(2025-11)给出的例子是把工具定义和中间结果从上下文里挪进执行环境后,一个任务从 150k token 降到 2k(自报数字,降幅 98.7%);Cloudflare 的后续实践把 2500+ 个 API 端点压到约 1000 token 的常驻开销(Code Mode MCP,自报)。

工程侧的收敛信号:HuggingFace smolagents 的 README 直接建议默认用 CodeAgent,并自报「比 JSON 工具调用少 30% 步数」(仓库,未见第三方复核);SWE-agent(arXiv 2405.15793)从另一个方向证明同一件事——接口的形状本身就是模型能力的放大器或瓶颈。

第三次卸载:记(2025-12 起)

前两次卸载都发生在「输出侧」。RLM(arXiv 2512.24601)把解释器用到了「记忆侧」:长上下文不再塞进 token 窗口,而是装进解释器里的一个变量,模型写代码去切片、检索、递归地摘要它。论文自报的数字(GPT-5 根模型):600 万到 1100 万 token 的检索任务 BrowseComp-Plus 从 0.0(超窗,不可做)提到 91.3。Prime Agent 把这条路线产品化——变量跨轮次持久化、对话历史本身是一个可以 open() 的文件。数字与源码细节我在《Prime Agent 内幕》里核对过原文,未亲手复现。

这一步值得停一秒:它意味着上下文工程的一部分正在变成状态工程。「窗口里放什么」的问题,被改写成「变量名叫什么」的问题——token 窗口里只需要留一个名字,值住在解释器里。

边界:什么没有转、什么转不了

灰度地带比口号重要。四条边界,每条都有来源:

其一,语义判断转不了。 Chain of Code(arXiv 2312.04474,ICML 2024)是最好的反面证据:它让模型用代码的格式思考混合任务(BIG-Bench Hard 上 84%,比 CoT 高 12%,论文自报),但关键设计是「LMulator」——像 detect_sarcasm(text) 这种写不出实现的语义函数,由语言模型假装自己是解释器来模拟返回值。可执行的行交给 Python,不可执行的行交回语言。代码是壳,语义洞仍然由语言来填——这条边界就是「推理没有转成程序」的最硬证据。

其二,长思维链仍是自然语言。 推理模型的「想」发生在 CoT 里,而不是程序里;程序是想清楚之后的落笔。

其三,JSON tool call 生态没有死。 协议层(MCP)与表示层(JSON vs 代码)是两回事:前者已收敛,后者双路线并存——通用集成用 tool call,组合密集的动作用代码。这个判断在《决策地图》里展开过,至今我没看到推翻它的证据。

其四,语言和代码在权重里本来就纠缠。 Cohere 的消融研究《To Code, or Not To Code?》(arXiv 2408.10914)发现:预训练里加代码数据,能一致地提升非代码任务(自然语言推理、世界知识)的表现;论文引述 Llama 2 到 Llama 3 的代码占比从 4.5% 提到 17%。也就是说「语言 vs 程序」不是模型内部的真实分界——代码本来就是模型学会推理的养料之一。UIUC 的综述《If LLM Is the Wizard, Then Code Is the Wand》(arXiv 2401.00812)把这层关系总结为三重收益:解锁推理、结构化中间步骤、提供可执行反馈。

所以对原问题更精确的表述是:「执行转 Program,推理留在语言」,而解释器在不断把「可执行」的边界向语言一侧推——2022 年只有算术可执行,2024 年「调工具」可执行,2026 年连「记住工作集」都可执行了。

如果趋势继续:五个推演

以下是我的推测,不是事实——每条附一个未来 12 个月可以观察的证伪信号。

  1. 工具的终局是库。 N 个工具定义退化成一个解释器加一堆可 import 的 API。信号:主流 harness(Claude Code、OpenHands、各家 SDK)的默认工具数是否持续缩减,MCP 服务器是否普遍提供「代码 API」形态。
  2. 上下文工程部分改名状态工程。 持久内核、变量快照、可寻址的对话日志成为 harness 标配。信号:新发布的 agent 框架是否内置跨轮次的解释器状态。
  3. 训练环境 REPL 化。 既然推理时的动作空间是代码,训练时的 RL 环境也会是解释器——RLM 论文已经训了第一个原生模型 RLM-Qwen3-8B(自报比基座平均好 28.3%)。信号:开源 agentic RL 框架的环境接口是否以代码执行为一等公民。
  4. sandbox 成为新的安全边界。 动作空间从「有限的工具白名单」换成「图灵完备的代码」,安全模型必须从「审工具」换成「关笼子」。Cloudflare 用隔离 Worker、smolagents 文档明说本地执行器不是沙箱、建议上 E2B/Modal——能力越强,隔离越硬。信号:sandbox 供应商的增长,以及主流 harness 是否把隔离执行设为默认。
  5. 可执行即可验证,奖励侧随之扩张。 代码跑没跑对是免费的过程信号(解释器报错、断言失败),这正是可验证奖励(RLVR)需要的判定器。信号:更多非代码领域被「编译」成可执行判定(数据任务、网页操作的断言化验收)。

第五条有一个我认为最值得盯的反例风险:《Prime Agent 内幕》记录过它在 Factorio 环境里当场 reward hacking——可执行的判定器同样可以被可执行的动作钻空子。执行权交给程序,博弈也跟着进入程序。

带得走的总表

卸载年份代表工作交给解释器的留在语言里的
2022PAL 2211.10435;PoT 2211.12588算术、数值求解题意理解、步骤分解
2024CodeAct 2402.01030;Code Mode;MCP 代码执行工具调用、组合、循环、中间数据要做什么、做到什么算完
2025–26RLM 2512.24601;Prime Agent工作集存储、历史检索什么值得记、记了怎么用
(未卸载)Chain of Code 2312.04474 的 LMulator语义判断、开放式规划

读表方式:每一行的右列就是「推理」实际的居住地。三次卸载没有搬走它,只是把它的邻居一个个搬走了——这也正是《什么才是好的 Harness》里「判断归模型、物理归代码」那句话的四年版谱系。

一个最低成本的验证实验

不用信我,也不用信 HuggingFace 的 30%。smolagents 同时提供 CodeAgentToolCallingAgent,接口一致:

# pip install smolagents —— 同一模型、同一任务、只换动作表示
from smolagents import CodeAgent, ToolCallingAgent, InferenceClientModel
task = "取 https://example.com 页面标题,统计单词数,返回 top3 高频词"
for Agent in (CodeAgent, ToolCallingAgent):
    agent = Agent(tools=[...], model=InferenceClientModel())
    agent.run(task)   # 对比两者的步数(LLM 调用次数)与成败

跑十个组合类任务(需要循环或多步数据传递的那种),数两边的步数。如果代码路线没有显著更少,这篇的第二次卸载论证对你的场景就不成立——这正是要点:卸载的收益集中在组合密集的任务上,单发任务里 JSON 并不吃亏。

诚实的提醒

  • 本文所有性能数字(PoT 约 12%、CodeAct 最高 20%、BBH 84%、150k→2k token、BrowseComp-Plus 91.3、smolagents 少 30% 步数、RLM-Qwen3-8B +28.3%)均来自论文或官方博客并当场核对过出处,没有一个是我亲手复现的;其中 smolagents 与两家云厂商的数字属于自报口径,利益相关。
  • 「训练分布让代码赢」是 Cloudflare 的假设,缺对照实验。
  • 第五节五条推演是猜想,证伪信号已逐条给出;12 个月后值得回来对答案。

参考来源

arXiv 论文

工程实践