这项由滑铁卢大学、康奈尔大学和哈佛大学联合完成的研究,以预印本形式于2026年7月2日发布在arXiv平台,编号为arXiv:2607.02512v1,研究方向属于机器学习与自然语言处理的交叉领域。
每一位写过代码的人都曾遭遇过这样的困境:有些事情人类一眼就能判断,但你就是没办法把它写成规则。比如,怎么用程序判断一封邮件是否"紧急"?怎么自动修复一段格式稍有错乱的JSON数据?怎么让搜索引擎真正理解用户的意图,而不仅仅是匹配关键词?这些问题的共同特点是:它们太"模糊"了,充满了人类的直觉和语境,无法用精确的规则和公式一一列举。
过去几年,开发者们找到了一个看起来很聪明的解决办法:直接把这类问题丢给大型语言模型的API去处理。每当程序遇到这种"说不清楚"的任务,就远程发一条请求给GPT或类似的服务,让它来做判断。这个方法确实好用,但代价也很明显——每次调用都要花钱,数据要传到别人的服务器上,一旦服务商悄悄更新了模型,你的程序行为就可能悄然改变,而且完全无法离线使用。
这项研究给出了一个截然不同的解法,可以用一个比喻来理解:以前的做法像是每次做菜都给米其林厨师打电话请教,而这项研究的方案则是让那位大厨把他的烹饪直觉"压缩"成一本只有几十页的私人食谱手册,之后你拿着这本手册,在家里用普通厨具就能做出大厨水平的菜肴。这个"手册"就是所谓的"神经程序",而整个范式被研究团队命名为**Program-as-Weights(权重即程序,简称PAW)**。
一、为什么有些任务无法用规则写清楚
日常编程中有大量任务是清晰、确定的:排序一组数字、计算矩阵乘积、处理结构化的数据库查询。这些任务有精确的输入和输出,可以用严格的代码逻辑描述清楚。但还有另一大类任务,研究团队把它们叫做"模糊函数"(fuzzy functions)——这个概念早在2012年就由学术界提出,指的是那些人类觉得直觉显而易见、但用符号规则却怎么也写不全的功能。
以筛选计算机日志为例,一个系统每秒可能产生成百上千条日志信息,你想自动识别出哪些是真正需要人工介入的"报警"信息,哪些只是无关紧要的"噪音"。你可以试着写正则表达式,但真实世界的日志格式五花八门,边界情况层出不穷,任何规则很快就会漏报或误报。又比如修复格式破损的JSON文件,人类扫一眼就知道哪里缺了括号、哪里多了逗号,但要写一个能处理所有可能损坏形式的程序,几乎是不可能完成的任务。
再比如意图搜索——用户输入"最近哪里有好吃的,带孩子去也合适",搜索引擎应该返回什么?关键词匹配根本理解不了这种语境化的需求。这类任务的共同困境在于:它们不是"错"与"对"的问题,而是"模糊"与"清晰"之间的连续谱,充满了人类语言和情境的微妙性。
二、一本可以随身携带的"大厨食谱":PAW的核心思路
研究团队设计的解决方案分为三步,整个流程就像委托一位大厨编写专属食谱,然后由一位普通厨师执行。
第一步,开发者用自然语言描述他们想要的功能,比如"把这封邮件分类为紧急或不紧急"。这个描述被送入一个"神经编译器"——一个经过专门训练的大型语言模型,相当于那位米其林大厨。编译器读懂这个需求之后,会生成一个"神经程序",这就是那本压缩了大厨智慧的"专属食谱"。
第二步,这本"食谱"被存成一个文件,大小通常只有几十兆字节,可以像普通的程序库文件一样保存、版本控制、分发。
第三步,一个"冻结"的小型"神经解释器"——相当于那位按食谱做菜的普通厨师——被永久安装在用户设备上,它只有0.6亿到0.8亿参数(相当于一个非常小巧的语言模型),加载对应的"食谱"文件之后,就能针对每一个新输入执行对应的任务,完全在本地运行,不需要网络连接。
这里有一个精妙之处:解释器本身是"冻结"的,意思是它的参数永远不会改变。每次引入一个新的模糊功能,只需要编译一本新"食谱",不需要重新训练解释器。这就像一台通用烤箱,只需要换不同的"烘焙程序卡",就能烤出不同风格的面包,而烤箱本身不用任何改动。
三、食谱的两个组成部分:文字描述与参数调味料
"神经程序"并不是单一的东西,而是由两部分拼合而成,研究团队称之为"混合程序"。
第一部分是"离散伪程序"(discrete pseudo-program):这是一段自然语言文字,对任务进行清晰的重述,并附上几个典型的输入输出示例。可以把它理解为食谱中的文字说明部分,比如"将鸡蛋打散,加入适量盐,用中火翻炒至凝固"。这部分文字会在每次运行时作为上下文"喂"给解释器,帮助它理解当前任务的大方向。
第二部分是"连续参数模块"(continuous PEFT module):这是一组由编译器生成的、可以直接"注入"解释器神经网络的参数调整量。可以把它理解为食谱中的"秘制调料配方"——具体用多少盐、多少糖、哪种香料,精确到克,这是文字描述无法完全传达的细节。研究团队尝试了两种技术实现方式:一种叫"前缀调优"(prefix-tuning),像是在解释器的注意力机制中预置几行特殊的"记忆钥匙";另一种叫"LoRA"(低秩适应),像是给解释器的每一层神经网络都套上一个轻薄的"微调外壳"。实验证明,LoRA的效果更好,最终成为主力方案。
这两部分的分工很有道理:文字描述部分保证了解释器不会被用户描述中的错别字或模糊表达所干扰,因为编译器已经把用户的原始说明"翻译"成了清晰规范的语言;参数调整部分则提供了文字无法传达的精细行为控制,确保解释器能真正理解任务的微妙边界。
四、编译流水线:大厨是如何写出食谱的
整个编译过程分为两个阶段,都运行在4B(40亿参数)规模的Qwen3模型上——这已经是相当有能力的"大厨"级别了。
第一阶段是"伪编译器"(pseudo compiler),这是一个完全不需要训练的现成模型,就是直接拿来用的Qwen3-4B-Instruct-2507。研究团队给它设计了一个简单的任务重写模板:输入用户的原始描述,输出一段规范化的任务重述加上几个代表性的输入输出示例。这个阶段的产物就是"离散伪程序"。
第二阶段是"LoRA编译器"(LoRA compiler),这才是真正经过专门训练的核心,也是整个系统中唯一需要训练的部分。它读入规范化的伪程序,然后通过自身的神经网络,从隐藏状态中"提炼"出一组LoRA参数。具体的机制是:编译器在处理伪程序的过程中,末尾会额外处理64个专门设计的"前缀词元"(prefix tokens),然后从多个网络深度均匀抽取这些位置上的隐藏状态,把它们合并成一个向量,经过一个小型MLP(多层感知机)网络,映射为一组"混合系数",最终用这些系数对64组共享的LoRA基向量进行加权组合,生成最终注入解释器的LoRA参数。每个模糊功能大约注入3850万个LoRA参数,涵盖解释器中所有的注意力层和前馈层。
执行时,解释器把LoRA"热挂载"到自身,把伪程序拼接在用户输入前面,然后自回归地生成输出。因为解释器本身是冻结的,任意数量的PAW程序都可以共用同一个解释器,只需按需切换挂载的LoRA文件,就像换电影碟片一样。
五、训练数据是怎么来的:一个专门为"模糊任务"打造的数据集
要训练出一个能胜任各种模糊任务的编译器,首先需要大量的训练数据,而这类数据在公开资源中几乎不存在。研究团队于是自己动手,构建了一个名为**FuzzyBench**的数据集,包含整整一千万条样本,随论文一同公开发布。
每一条样本都是一个三元组:任务描述(specification)、输入(input)、目标输出(output)。整个数据集由gpt-5.2生成,分为两个阶段:先让模型生成各种模糊任务的自然语言描述,再对每个描述生成八对输入输出示例。为了避免测试集"泄露"到训练中,数据集按任务描述划分为80%训练、10%验证、10%测试,测试集中的任务在训练阶段完全不可见。此外,测试集还经过额外的"双重验证"处理:只有当另一个独立的强模型(gpt-5-mini)也同意标准答案时,这条样本才会被纳入评估,以排除本身存在歧义的任务。
数据集历经29个版本的迭代积累,每个版本新增10万到50万条样本,覆盖一个新的任务家族。最终涵盖超过800个子类别,大致可以归为七个大方向:核心文本处理与自然语言处理(占30%,包括解析、分类、命名实体识别、情感分析等);搜索、匹配与网络智能(18%);自定义分类与过滤(15%);代码与自然语言命令(12%);安全、验证与领域知识(12%);智能体与工具调用(8%);格式修复与验证(5%)。
作为参照基准,数据生成模型gpt-5.2自身在这个测试集上的正确率是96.09%,gpt-5-mini是91.87%,这两个数字就是PAW系统理论上能达到的性能上限。
六、真正的考验:PAW与各路竞争者的正面比拼
研究团队将PAW与三大类竞争方案进行了全面对比。
第一类是直接提示(direct prompting):把任务描述和输入直接交给各种规模的语言模型,看它能表现多好。测试覆盖了从0.6B到32B参数的Qwen3系列、OLMo3-7B以及gpt-oss-20B,还有封顶的两个API模型。
第二类是代码生成路线(ALCHEmist方案):让一个强大的语言模型把模糊任务翻译成Python代码,然后用Python解释器来执行。
第三类是对同一个0.6B基础模型的标准适应方案:全量微调,或者用固定的(非编译器生成的)LoRA进行适应。
核心结论相当引人注目:使用PAW方案,一个只有0.6B参数的解释器在FuzzyBench测试集上达到了73.78%的精确匹配准确率,而直接提示规模大得多的Qwen3-32B只有68.70%。换句话说,一个小约50倍的模型,借助PAW这个"食谱机制",表现反而更好。而且在内存占用上,0.6B解释器大约只需要1.2GB,而32B模型需要约60GB——差距是50倍。
与同一个0.6B基础模型的其他适应方案相比,差距同样显著。全量微调(把整个0.6B模型在训练数据上重新训练)只能达到58.40%;固定LoRA(不用编译器,直接训练一个通用LoRA)最高只有52.10%;而PAW达到73.78%,领先15到22个百分点。这说明性能提升的关键确实来自"编译器根据具体任务动态生成LoRA"这个机制本身,而不是模型大小或训练数据。
代码生成路线的表现则参差不齐:在SMS分类这类简单任务上还能保持竞争力,但在FuzzyBench的综合测试中只有35.81%,而且某些任务上表现极差(Yelp准确率只有50.35%),原因是代码逻辑无法捕捉模糊判断的细节。
七、把食谱带进相机:跨模态的泛化能力
这个编译器-解释器框架还有一个优雅的特性:可以在不改变解释器的情况下,扩展到处理图像输入。
具体做法是:把编译器从文本专用的Qwen3-4B-Instruct换成多模态的Qwen3-VL-4B(一个能同时理解图像和文字的模型),保持解释器和LoRA映射器不变。图像的信息被完全"蒸馏"进LoRA参数之中,解释器完全看不到原始图像,却能通过LoRA传递过来的"图像理解"来处理视觉任务。
研究团队在六项图像任务上测试了这个方案,包括电路图理解、化学结构图理解、乐谱理解,以及图像转LaTeX代码、图像转化学分子式,还有开放式视觉问答。PAW(LoRA版)在前三项涉及图表理解的任务上,表现超过了所有参数量高达4B的视觉语言模型基线:电路图理解从最好基线的0.196提升到0.274,化学结构从0.258到0.414,乐谱从0.470到0.552。
不过,在需要生成长篇结构化输出的任务(如图像转LaTeX)上,LoRA版PAW的表现反而弱于前缀调优版本。研究团队通过消融实验查明了原因:这类任务的伪程序中包含大量的输入输出示例,这些示例会占据小型解释器的上下文窗口,挤压了实际推理所需的空间。这一发现提示未来在处理长输出任务时,可以考虑减少或调整伪程序的内容结构。
八、架构设计的精妙:为什么"更复杂"反而更差
在LoRA映射器的设计上,研究团队做了一系列看起来应该"更强"的变体,结果全部适得其反——这个发现本身就很有趣。
最简单的默认设计:把所有前缀位置的隐藏状态做平均池化,得到一个向量,经过一个浅层MLP,然后映射为每层每种模块类型的混合系数,用来加权组合64组共享的LoRA基向量。测试准确率是62.23%。
研究团队尝试了"逐位置聚合"(不做平均,保留每个位置的独立信息),结果准确率跌到55.98%。尝试"逐层使用独立基向量"(每一层都有自己的LoRA基,而不是共享),结果59.59%,仍然不如默认方案。同时使用LoRA和前缀调优两种机制,结果60.33%,也没有提升。研究团队坦率地表示,他们目前没有找到一个清晰的理论解释,但这个发现本身值得记录,免得后来者重蹈覆辙。
此外,消融实验还发现:编译器的输入同时包含原始用户描述和伪程序,比单独使用任意一个都更好;离散伪程序和LoRA参数分别用独立的预测头生成,比共用一个头更好;不在映射器输入上做层归一化比加上层归一化更好;解释器从未微调的基础版本初始化,比从已经微调的版本初始化效果更好。
九、为什么PAW不怕你写错字:离散伪程序的防噪声作用
真实世界中,开发者给出的任务描述往往不够规范,可能有拼写错误、语法错误,或者表达模糊。研究团队在测试集上加入了八种类型的噪声变体:错别字、语法错误、歧义表达、格式漂移、综合噪声、过于简短、口语化表达、改写重述,每种噪声又分轻度、中度、重度三个级别。
在最严重的综合噪声条件下,PAW的准确率从干净输入时的66.92%下降到63.26%,降幅只有3.7个百分点,表现出相当强的鲁棒性。
研究团队对这种鲁棒性给出了解释:4B的编译器负责把用户的原始描述(无论多混乱)翻译成清晰规范的伪程序,真正"看"到混乱描述的只有编译器;解释器只看到编译器输出的干净版本,所以不受影响。
通过对比实验可以验证这个猜想:在干净输入条件下,把伪程序换成原始描述喂给解释器,准确率只下降1.6个百分点;但在重度错别字噪声条件下,同样的替换导致准确率下降4.5个百分点——这正是因为绕过了编译器的"净化"步骤。
十、30 tokens/秒,笔记本就能跑:本地执行的实际体验
这套系统的工程实现同样值得关注。研究团队开发了一个简洁的Python/JavaScript接口,整个使用流程分为两步:先调用`paw.compile(spec)`把自然语言描述发到云端编译服务,获得一个可序列化的程序对象(这是唯一需要联网的步骤);然后调用`paw.function("email-triage")`加载已编译的程序,之后每次调用都完全在本地运行,不需要网络连接。
为了让系统在普通设备上运行,研究团队对模型进行了量化压缩,使用了GGUF格式(一种专门为边缘设备设计的模型存储格式)。实验结果显示,6位量化的解释器基础模型(大约623MB)加上4位量化的LoRA适配器(每个程序约23MB),在准确率上与未压缩的bf16版本几乎没有差别,统计上不可区分。即使更激进地压缩到4位(约484MB),准确率也只降低1.3个百分点。
在一台MacBook M3上,使用5.5位量化的基础模型加上4位量化的LoRA,系统以每秒31.6个词元的速度运行,冷启动延迟只有0.48秒。这意味着对于短文本的分类和处理任务,用户几乎感知不到延迟。更进一步,GPT-2(1.24亿参数)版本的PAW可以通过WebAssembly完全在浏览器中运行,实现真正的客户端本地推理。
有趣的是,即使是参数量只有1.24亿的GPT-2担任解释器,在FuzzyBench上也能达到54%的准确率,远超直接提示0.6B Qwen3的9.84%——这说明编译器生成的LoRA确实将有效的任务知识"写入"了解释器,即使是非常弱小的基础模型也能从中受益。
十一、五个真实应用场景:PAW能帮你做什么
研究团队在五个实际应用场景中展示了PAW的能力,每一个都是那种"理论上能写代码,但实际上根本写不好"的经典模糊任务。
第一个场景是事件驱动的日志监控。传统方案是定时检查终端输出,但研究团队用PAW编译了一个本地分类器,只监测真正重要的日志行。任务描述极其简单:"分类日志行,只返回ALERT或QUIET",附上几个示例,编译完成后这个分类器就永久部署在本地,每次有新日志写入就自动判断,不需要任何API调用。
第二个场景是基于意图的网站导航。用户输入的查询往往是自然语言而不是精确的关键词,PAW编译了一个意图分类器,可以把"怎么开始用"这样的查询映射到"docs"页面,把"浏览社区作品"映射到"hub"页面。整个导航管道由五个串联的PAW函数组成:页面分类器、问题类型分类器、是否问题回答器、如何/什么问题回答器,以及答案验证器。每个函数编译一次,之后每次调用耗时毫秒级。
第三个场景是语义搜索重排序。关键词索引返回候选结果后,PAW编译的重排序器会给每个候选打分(精确匹配、高度相关、有些相关、不相关四档),按分数重新排列结果,让搜索结果真正符合用户意图,而不是仅仅包含关键词。
第四个场景是工具调用管道。研究团队用10个PAW函数搭建了一个工具调用代理,包括判断是否需要工具、路由到哪个工具、提取各类参数等功能,在TOOLCALL-15基准测试上达到了93%的准确率——这个成绩通常只有参数量大得多的模型才能达到。唯一失败的场景(TC-13)是因为代理代码中的循环防护逻辑过于激进,不是PAW函数本身的问题。
第五个场景是多语言词语猜谜游戏(Alien-Taboo)。每位玩家描述一个单词,AI(一个名叫"Zog"的外星人角色)猜这个单词。游戏支持英语和中文,每种语言对应一个PAW程序,同一个0.6B解释器热切换不同的LoRA来服务不同语言的玩家。大语言模型只在编译阶段被调用一次,之后每局游戏的每个回合都完全在本地小服务器上运行,让这类互动游戏的托管成本变得可以接受。
十二、尚存的局限与未来的方向
研究团队在论文中坦诚地列出了当前版本的几个主要局限,这种客观态度让整个研究更加可信。
编译器与解释器之间存在绑定关系:一对训练好的编译器和解释器是配套的,如果想换用不同的解释器(比如从Qwen3 0.6B换到Qwen3.5 0.8B),就需要重新训练编译器。这个局限在大多数参数生成类方法中都存在,但研究团队指出PAW在两个维度上具有泛化能力:跨任务(同一对编译器-解释器可以处理无限多种模糊任务描述)和跨模态(只需换编译器即可处理图像任务)。
神经程序的可解释性有限:PAW程序的文字部分(伪程序)是人类可读的,但LoRA参数那部分是不透明的,没有人能直接阅读它来理解其行为,就像你无法通过阅读编译后的机器码来理解原始逻辑一样。如何调试和解释神经程序,是一个完全开放的研究方向。
当前所有评估都是单步的,即一个输入对应一个输出。对于需要多轮推理的复杂任务,PAW函数可以在用户代码层面串联组合(案例研究已经做了这种组合),但编译器目前还不能生成真正的多步"组合型"程序,这是下一步需要探索的方向。
此外,训练数据完全由gpt-5.2生成,属于合成数据,外部验证仍在进行中,五个案例研究是初步的实际验证尝试。不同任务类型下最优PEFT方案不同(文本任务用LoRA好,长输出图像任务用前缀调优好),目前还没有能提前预判的理论准则,需要靠实验比较。
归根结底,这项研究提出的是一个关于"谁来做繁重工作"的新答案。过去的思路是:让大模型随时待命,每次遇到模糊任务就临时发请求。PAW的思路是:让大模型只在"编写食谱"的时候出马,之后所有真正的烹饪工作都由本地的小厨师完成。
这种分工在实践中意味着什么?它意味着隐私(用户数据不用传到云端)、可复现性(程序行为由版本化的文件决定,不会因为云端模型更新而悄然改变)、成本(小模型推理比大模型API便宜得多)、以及离线能力(没有网络也能运行)。
当然,这套范式目前还有很多需要完善的地方,但它提供了一条真实可行的路径:让小模型来执行,让大模型来编译。有兴趣深入研究的读者可以通过arXiv编号2607.02512查阅完整论文,对应的代码已发布于GitHub,交互演示也已上线。
Q&A
Q1:Program-as-Weights(PAW)生成的LoRA文件有多大,普通电脑能运行吗?
A:PAW编译出的LoRA适配器文件在4位量化后约为23MB,加上一次性下载的共享基础解释器(约430至623MB),总占用通常在500MB左右。在MacBook M3上使用Metal加速,系统以每秒约31.6个词元的速度运行,冷启动延迟不到0.5秒,普通现代笔记本完全可以流畅运行。更轻量的GPT-2版本甚至可以通过WebAssembly在浏览器内运行,无需任何本地安装。
Q2:PAW编译出的程序能不能用在原本没见过的全新任务类型上?
A:可以,这正是PAW系统的核心优势之一。编译器训练时覆盖了FuzzyBench的800余个任务类别,但在推理时面对全新的任务描述,只要用自然语言说清楚需求,编译器就会动态生成对应的LoRA,不需要针对新任务重新训练任何部分。测试集与训练集之间按任务描述严格隔离,验证了这种跨任务泛化能力。
Q3:FuzzyBench数据集和普通的指令微调数据集有什么不同?
A:FuzzyBench的特别之处在于它是任务类型驱动的,而不是开放式的问答或对话。它的每一条样本都是一个"规格-输入-输出"三元组,对应一个具体的模糊函数,覆盖开发者实际遇到的800多种模糊任务类别,包括格式修复、意图分类、工具调用等。此外,测试集经过双重验证(需要两个独立强模型同意才纳入),排除了歧义样本,这使得评估结果更可靠。
热门跟贴