判断一条日志是否紧急、修复残缺的 JSON、按意图排序搜索结果——这些任务有个共同特点:你脑子里知道该怎么做,但写不出干净的正则或规则。于是代码里越来越多地出现 gpt("extract answer", text) 这种调用:每次输入都跑一遍 32B 参数的大模型,花钱、慢、依赖网络、还不可复现。
Waterloo 和哈佛团队在这篇论文里问了一个更根本的问题:能不能把这些"模糊函数"编译一次、本地运行?答案就是 PAW(Program-as-Weights)——一个全新的编程范式。
PAW 把传统编程的"编译-运行"二分法搬到了神经网络世界:
翻译成人话:你写"判断邮件是否紧急",编译器给你一个 23MB 的文件,之后每次判断邮件都不需要联网,0.6B 小模型就能搞定。
PAW 的程序是混合体——离散和连续两部分:
离散部分的作用被鲁棒性实验完美验证了。当用户规格有拼写错误时,带伪程序的 PAW 只下降 1.6 分,跳过伪程序直接用原始规格则下降 4.5 分——编译器在编译阶段就把噪声过滤掉了,解释器看到的是干净输入。
| 配置 | 基座大小 | 适配器 | 精度 |
|---|---|---|---|
| PyTorch bf16 | 1515 MB | — | 65.80% |
| Q6_K + Q4_0 LoRA | 623 MB | 23 MB | 65.75% |
| Q4_K_M + Q4_0 LoRA | 484 MB | 23 MB | 64.53% |
| IQ4_XS + Q4_0 LoRA | 430 MB | 23 MB | 64.62% |
在 MacBook M3 上,量化后的系统跑 31.6 tokens/s,冷启动 0.48 秒。430MB 共享基座 + 每个程序 23MB——比很多 npm 包都小。还有一条 GPT-2 124M 的路径,完全能在浏览器 WebAssembly 里跑。
论文给了五个端到端 case study:日志分流、意图分类、模糊搜索重排、Agent 工具调用管线(ToolCall-15 达 93%)、多语言猜词游戏。
更优雅的是,PAW 的编译器-解释器分离支持多模态扩展:解释器不用改,只换编译器——换成 Qwen3-VL-4B 后,同一个 0.6B 文字解释器就能处理图像条件任务。
PAW 最深层的 insight 是重新定义了基础模型的用途。传统用法是 per-input solver——每来一个输入,调一次大模型。PAW 把大模型变成 tool builder——只在编译时调用一次,产出一个小而可复用的"神经二进制",之后每次调用廉价且离线。
这和传统编程的类比非常精确:编译器只在构建时运行,编译出的程序可以被调用无数次。PAW 做的,是把"程序"的形式从符号代码扩展到了权重空间。
10M 例子的 FuzzyBench 数据集也已开源,覆盖 800+ 类别的模糊文本任务。代码在 GitHub,demo 在 programasweights.com。