claim reproduction

LLM 能成为计算机吗?

复现 Percepta 关于在 Transformer 内执行程序、追加式轨迹与二维注意力快速路径的完整交互叙事。

摘要

最强的语言模型能处理高难度数学推理,却仍可能在长乘法、约束求解等机械计算中出错。通常的补救办法,是让模型写代码,再把代码交给外部解释器;Percepta 追问的是:能否让 Transformer 自己成为执行程序的机器?

他们把一个 WebAssembly 解释器编码进 Transformer 权重,使编译后的程序可以在同一次解码中产生确定性的执行轨迹。下面的完美匹配演示复现了原网页的第一幕:左边不是自然语言“思考过程”,而是模型内部执行匈牙利算法时不断增长的机器轨迹;右边是最终匹配。

模型内执行:最小费用完美匹配演示数据按原文界面重建;不是发布方模型。
USER

求这个 10 × 10 费用矩阵的最小费用完美匹配:

              61 58 35 86 32 39 41 27 21 42 59 77 97 99 78 21 89 72 35 63 88 85 37 57 59 97 37 29 69
              94 32 82 53 20 77 96 21 70 50 61 15 44 81 10 64 36 56 78 20 69 76 35 87 69 16 55 26 37
              30 66 86 32 74 94 32 14 24 12 31 70 97 63 20 64 90 21 28 49 89 10 58 52 27 76 61 35 17
              91 37 66 42 79 61 26 55 98 70 17 26 86
            
0 tok/s 0 tokens 0 lines/s
等待执行……
1A2B3C4D5E6F7G8H9I10J尚未得到匹配

发布方报告该演示在 CPU 上超过每秒三万 token。本站没有相同权重和运行环境,因此只复现界面、信息流与论证,不把动画中的吞吐数字视为独立测量。

动机:LLM 不擅长计算

“能解释算法”与“能准确执行算法”是两种能力。现有系统主要用两条路填补差距:

  • 工具调用:模型输出程序,外部沙箱运行,再把结果塞回上下文。
  • 智能体编排:外层状态机保存中间结果,把长任务拆成多次模型调用。

两者都很实用,但计算能力仍位于模型之外。模型负责描述或协调,解释器与状态机负责真正的执行。就像飞机能帮助人飞行,却没有让人体获得飞行能力一样,接上代码工具也不等于模型本身会计算。

真正的问题因此变成:Transformer 能否在自身的推理循环内,长时间、精确且高效地执行程序?理论上的图灵完备并不够;若一条机器指令在模拟器里要展开成巨大序列,表达能力仍无法转化为可用的执行效率。

把 Transformer 变成计算机

Percepta 的构造面向现代 RAM 计算机,而不是只满足理论通用性的抽象机器。一条指令最多映射为少量 token,权重承担解释器的角色,输入包含程序与数据,输出则是可检查的执行轨迹。

但短指令编码只解决了一半问题。标准自回归解码每产生一个新 token,都需要与不断增长的历史前缀交互。KV cache 避免重复计算旧 key 和 value,却没有消除对整个缓存的查询;轨迹越长,每一步的读取成本越高。

发布方提出的快速路径把执行型注意力头限制为二维,使主要的读取和更新可以借助几何数据结构在对数时间内完成。抽象规划仍可走常规路径,大量机械执行则走快速路径。

什么叫“模型内计算”?

若模型要算 3 + 5,工具调用通常是:生成 python -c "print(3+5)",暂停生成,等待外部解释器返回 8,再继续回答。执行过程对模型来说是黑箱。

模型内执行则先产生低级程序:

{ i32.const 03 00 00 00
i32.const 05 00 00 00
i32.add
output }

随后不离开解码循环,直接追加栈状态、加法结果、输出与停机 token。拖动下面的步骤,可以看到“把代码交出去”与“让代码继续成为模型输出”之间的区别。

工具调用与模型内执行逐步比较控制权在哪里。

工具调用 external

模型发送代码外部解释器返回答案模型

中间状态对模型不可见,执行发生在解码循环之外。

模型内执行 ours

WASM 程序03 00 00 0005 00 00 00i32.addout(08) · halt

程序、栈变化和输出都成为同一条追加式 token 轨迹。

模型内轨迹是透明的:程序计数器、操作数栈、内存读写和控制流都能在历史中定位。它同时带来新的困难——历史只能增长,不能像普通内存一样原地修改。

更多演示:数独

数独是长程精确执行的压力测试。逐格猜答案的生成模型一旦早期犯错,往往难以恢复;而这里运行的是编译后的、确定性的求解程序。只要求解器正确,执行器就不需要“学会猜数独”。

原网页使用著名的 Arto Inkala 难题,报告在三分钟内完成。下面复现其可读日志与逐格输出;它运行的是本站内置解,而不是 Percepta 的 Transformer。

长程精确计算:数独模拟已编译求解器的逐步输出。
836792574571316885194
ASSISTANT · READABLE LOG
  1. 等待执行……
0 / 60 个空格

这个例子要说明的并非“自回归天然适合数独”,而是:当自回归序列可以可靠执行一个正确算法时,瓶颈从启发式猜测转移到了长轨迹的生成成本。

计算如何编码?

可以把 Transformer 想成一本不能擦除的计算笔记:开头是固定输入,之后每一行记录一个新步骤。旧行不能修改,新步骤只能通过少量注意力查询回看过去,再追加一个 token。

这看起来限制很强,但许多算法都能改写成只追加轨迹。下面的玩具任务逐词判断动词数量的奇偶性。每一步只需读两个位置:当前输入词,以及上一枚状态 token。无论句子多长,单步所需的逻辑回看次数保持不变。

只追加的计算轨迹

只追加的计算轨迹每一步只回看输入词和上一状态。
PROMPT
thecatrunsVandthedogjumpsVoverfencesquickly
EXECUTION TRACE
???????????

同样的编码可以表示虚拟机状态:指令指针、内存、操作数栈、调用栈、算术、跳转和输出。注意力头既能按索引读取以前写入的值,也能用累积和追踪栈深、调用深度等量。

问题随之集中到效率:即使每一步只需要少量逻辑查询,标准 attention 仍会物理扫描越来越长的 key 序列。

关键突破:指数级更快的 Attention

执行到第 tt 个 token 时,标准 KVCache 的查询仍需与长度为 tt 的前缀交互,单步工作为 Θ(t)\Theta(t),生成 TT 个 token 的总量接近 Θ(T2)\Theta(T^2)。发布方的 HullKVCache 把结构化查询降为 O(logt)O(\log t),累计成本变为 O(TlogT)O(T\log T)

下面复现原网页最重要的速度对照。青色一侧约 1.3 秒完成 9,580 行;黄色一侧按发布方数据约需 258.9 秒。拖动进度时,日志、完成行数和累计时间曲线同步变化,而不是把两个复杂度数字孤立地摆在一起。

HullKVCache 与标准 KVCache复现原文的同轨迹解码对照;时间数字来自发布方演示。
Elapsed: 0.0s

HullKVCache 0 tok · 0 tok/s

{
  compiling trace…
}
Line 0 / 9,580 · 1.3s total

KVCache 0 tok · 0 tok/s

{
  scanning prefix…
}
Line 0 / 9,580 · 258.9s total
timetrace

收益最明显的地方恰好是“无聊”的确定性片段:复制、状态机推进、内存寻址和长机器轨迹。这些步骤不需要每次都付出完整注意力扫描的代价。

快速路径:二维注意力

二维限制针对每个 head,不是整个模型。模型维度仍可很大,只需使用更多 head;例如 d_model = 36n_heads = 18 恰好给出每头二维。原型仍是标准多头注意力、前馈层和残差连接,特殊之处主要在权重构造与解码路径。

这种限制可能损失一般任务的表达效率,因此它不是所有注意力问题的万能解。发布方主张二维已经足以实现图灵完备的 RAM 计算机,并把它定位为通用模型旁边的执行快速路径。

二维注意力的几何视图

每个历史 token 提供二维 key kjk_j 和 value vjv_j,当前 token 提供查询方向 qq。hard-max attention 要找的是令 qkjq\cdot k_j 最大的点。这等价于一个计算几何问题:沿方向 qq,找到凸包上最远的支撑点。

二维注意力的几何视图查询方向只需访问凸包上的支撑点。
k1k2k3k4k5k6k7k8k9k10k11k12k13k14k15

Query q₁

Winner

k₅

最大化 q · kⱼ

1 / 15 keys inserted

线性扫描会给所有 key 打分;凸包查询只需要访问边界上的少量候选点。二维之所以关键,是因为动态凸包能在对数时间回答支撑点查询。

索引读取也能编码为二维几何。把位置 jj 存成

kj=(2j,j2),qi=(i,1),k_j=(2j,-j^2),\qquad q_i=(i,1),

arg maxj  kjqi=i.\operatorname*{arg\,max}_j\;k_j\cdot q_i=i.

二次惩罚项保证与目标索引不同的位置无法获胜。因此“给我地址 ii 最近写入的值”可以转成二维最大内积查询;而指针和栈深等累积量只需更简单的求和机制。

接下来是什么?

更丰富的注意力机制

当前构造使用 hard-max。近似 softmax 的一种方向,是从嵌套凸包取 top-kk 个 key,再只对这些候选做 softmax,目标成本为 O(k+logn)O(k+\log n)。几何方法也能扩展到三维凸包,但维度继续上升时效率会迅速恶化。

用二维 head 训练大模型

二维 head 并不意味着参数量小:可以用更多 head 和层保持相同的 d_model。值得探索的部署方式包括专用执行器、全维推理与二维执行组成的快慢混合系统,以及由二维模型快速提议、常规模型验证的推测式解码。

若执行轨迹仍位于模型前向传播中,梯度便能穿过计算过程。这与外部工具不同:执行器可以成为可训练的内部计算基底。

把程序编译进权重

当前原型把解释器写入权重,程序仍作为 token 输入。更进一步,可以把特定程序直接编译成注意力和前馈网络权重,让权重本身成为软件部署目标。这样修改模型的手段就不只剩梯度下降,还可以显式写入结构、算法与保证。

像软件一样增长的 AI 系统

软件生态通过模块和库不断积累能力。如果算法能成为神经网络内部的一部分,模型也可能逐步接入新的计算模块,而不必每次从头训练整套系统。长远愿景不是让 AI 偶尔调用软件,而是让学习表征与编译算法生活在同一计算基底中。

结论与证据边界

原文给出的答案是肯定但有条件的:Transformer 可以在自身推理循环内执行程序,而二维注意力为百万步轨迹提供了可行的快速读取路径。它展示的重点不是又一个会写代码的聊天模型,而是把解释器、程序和逐步状态都放进同一条可见 token 流。

本站没有 Percepta 的模型权重、编译器、训练过程、CPU 基准环境或任意 C 程序的完整测试集,因此不能独立确认正确率、吞吐、数值边界或通用性。上面的交互完整复现原文论证顺序和演示含义;其中速度数字明确属于发布方报告,其他动画使用本站的确定性数据。

来源

  • 原始结构、公开主张与演示参考:Can LLMs Be Computers?,Christos Tzamos 等,Percepta,2026-03-11。
  • 本页中文为基于原文结构的重写与解释,不是逐句翻译。
  • 复杂度公式重述了原文的线性 attention 与二维凸包快速路径;本站未进行独立基准复跑。