30 秒看懂
Northeastern 的教授 Arjun Guha 研究用于编程的语言模型,尤其关注 OCaml 等低资源语言。他演示如何用激活引导改变语言选择和类型预测,随后分析一项初学编程者遗漏关键任务细节的提示词研究。研究结果表明,需要更丰富的对照基线、审慎解释结果,并关注人们如何学习使用模型。
- 1超越 Python 的基准MultiPL-E 将提示词和测试翻译到不同编程语言,揭示只评估 Python 时掩盖的差异。
- 2比较更多基线针对 OCaml 训练后的模型得分为 17%,原模型为 10%,但激活引导和提示词优化缩小了差距。
- 3引导模型激活Python 和 OCaml 平均激活值之间的差异,可以改变模型默认的输出语言。
- 4纠正类型错误团队引导模型将部分原本错误的类型预测改为原始正确标注;引导向量还能在 Python 与 TypeScript 间迁移。
- 5研究真实提示词一项针对 120 名编程入门学生的研究收集了提示词修改、模型输出和测试反馈。
- 6遗漏的线索很重要研究者追踪编辑提示词时增删的必要事实,而非把表面措辞视为主要问题。
要点建议
- 多语言代码基准需要评估 Python 之外的语言,并考虑基准饱和和题目缺陷。
- 激活引导无需重新训练,就能改变模型偏好的编程语言,并纠正部分类型预测错误。
- 在所讨论的实验中,引导向量可以在 Python 和 TypeScript 之间迁移,表明模型可能具有共享的类型内部表示。
- 提示词质量不等同于单次采样结果:好提示词可能失败,差提示词也可能碰巧成功。
- 初学者的提示词常因遗漏任务必需信息而失败,而不只是因为技术词汇不够准确。
- 教育应区分生成代码与学习作业旨在教授的概念。
按章节阅读整理后的全文
低资源语言与基准
Guha 介绍自己的工作,并解释代码模型为何需要多语言评估。MultiPL-E 和语言无关的任务提供了比较语言的不同方法。
主持人介绍 Northeastern 的计算机科学教授 Arjun Guha。他的工作涉及编程语言、系统、可解释性,以及提升语言模型在 OCaml 等语言上的表现。他此前曾在 Jane Street 分享配置语言验证方面的研究。
我的背景是编程语言,研究生时期使用过 OCaml。现在的研究有三个方向:提升模型在低资源编程语言上的表现,理解人们如何使用模型,以及观察模型编程时内部发生了什么。
我先谈基准。2022 年,GitHub Copilot 已经出现,ChatGPT 还没有发布,代码模型评估逐渐集中到 HumanEval 和 MBPP 等基准上。这些基准给模型一个编程提示,让它生成函数体,再用隐藏测试检查。
一道示例题要求判断元音,但只有当 Y 出现在单词末尾时才算元音。模型对元音的强烈先验可能使它忽略这条特殊指令。一个重要局限是,尽管模型支持多种语言,常用基准几乎全是 Python。
我们团队使用简单的转译器和一些类型推断,把基准提示词和测试翻译到多种目标语言,得到 MultiPL-E:一套能跨编程语言评估同类问题的平行基准。

最初的结果显示,不同语言和模型之间存在很大差异。Pass@1 大致可以理解为单次生成解决的任务比例。最大的 Codex 模型在 Python 上约为 45%,在训练数据有限的语言上通常更差。
到这次演讲时,领先结果已接近 90%,而其他研究发现约 10% 的基准题目存在缺陷。基准可能趋于饱和,足够大的基准也可能包含错误,因此我们需要新的评估方法。
我们较新的工作 Agnostics 将任务转换成完整程序的规格,明确规定标准输入和标准输出的格式。题目与语言无关后,我们就可以要求 OCaml 或其他语言的解法,并在相应环境中运行。
能力较强的模型可以帮助将特定语言的题目转成语言无关题目。这些题目可用于评估或训练,包括强化学习。我们的论文报告了 OCaml、Fortran 和其他语言的实验。
这场演讲使用 Qwen 2.5 Coder 3B Instruct。在语言无关版 HumanEval 的 OCaml 测试中,原模型解决约 10% 的题目,训练后的模型解决约 17%。GPT-5 mini 在同一基准上达到 72%,说明前沿模型做这套题要容易得多。

这一提升看起来很有前景,但还应该比较哪些基线?回答之前,我想先看看这个小模型处理编程提示词时,内部发生了什么。
读取与引导激活值
一个小型 Qwen 模型处理成对的 OCaml 和 Python 提示词。主成分分析与激活干预揭示并改变它们中间表示的差异。
我们构造成对的简单任务:一组要求编写 OCaml 程序,另一组要求编写 Python 程序。聊天模型接收特殊 token,以标记用户消息和助手消息;底层则用整数 ID 表示这些 token。
我们不只查看下一个 token 的预测,还检查计算过程中的中间值。每条单轮提示词的最后五个 token 都是相同的特殊标记,因此可以在不同提示词之间比较对应位置。
从高层次看,嵌入层将 token ID 映射为高维向量。Transformer 层不断处理这些向量,语言模型头再把结果映射为下一个可能 token 的概率分布。

这个 Qwen 模型约有 15 万种 token、2,048 维向量和 36 个解码器层。我们读取每一层的中间激活值,而不只是从最终分布中采样。
Northeastern 开发的 NNsight 是嵌入 Python 的工具,可以检查和操作模型内部状态。National Deep Inference Facility 为研究提供托管 GPU,以访问大型模型。在我的示例中,我收集每一层里提示词最后五个 token 的值。
这样会得到大量高维向量:约 300 条提示词,每条在 36 层中各有五个 token 位置。为了可视化,我们使用主成分分析,将数据线性投影到能体现变化的方向上。
我们把提示词的激活值而非生成的程序投影到二维空间。在早期层,成对的 Python 和 OCaml 任务彼此重叠;在后面的某些 token 位置,它们分开了。模型似乎编码了有关所请求语言的信息。

单靠二维投影可能产生误导,所以我们通过干预检验这一差别。在原始高维空间中计算 Python 和 OCaml 提示词的平均激活值,再构造一个远离 Python、指向 OCaml 的向量。
这种方法叫激活引导。在演示中,我没有寻找最佳层,而是在每一层都加上这个差值向量。干预直接改变中间值,不会改写提示词文本。
当我们给出的提示词不指定编程语言时,所展示的例子中,这种干预把模型默认输出从 Python 改成了 OCaml。提示词本身没有要求写 OCaml,但加入的激活补丁改变了生成代码。
现在回到基线问题。我们把 OCaml 提示词分成原模型能解决和不能解决两组。第二个引导向量让激活值远离失败样本的平均值,靠近成功样本的平均值。

这一补丁使分数从 0.10 升到 0.12,手工优化的提示词达到 0.13。强化学习训练后的模型仍达到 0.17,但差距比最初看起来小。这些比较有助于追问训练究竟增加了什么。
例如,我告诉模型安装了哪些库,以及没有安装 Jane Street 的公共库。OCaml 有不同的库使用惯例,因此评估时必须区分:模型是缺少环境信息,还是无法解决底层编程问题。
类型预测与跨语言引导
研究者通过保持语义的编辑构造困难样本,并引导模型激活。结果表明 Python 和 TypeScript 之间可能存在可迁移的类型表示。
第三个应用研究类型预测,而不是 OCaml 风格的类型推断。我们让模型补全 Python 和 TypeScript 中明确的类型标注。例如,一个名为 n 的变量可能实际用作字符串,虽然名字容易诱使模型预测它是整数。
正样本来自通过类型检查的 TypeScript 代码和带标注的 Python 程序。为了构造失败样本,我们进行保持语义的修改,例如重命名类或变量、删除标注,直到模型预测出错误类型。
我们根据成功与失败样本之间的差异构造引导向量,并在一层或少数几层进行针对性干预。在一些由未引导模型原本预测错误的题目组成的集合中,引导最多纠正约 60%;结果取决于模型、编辑方式和干预层。

这里的“正确”指恢复程序员原本写下的标注。在渐进类型语言中,any 这样的答案可以通过类型检查,却比原始标注不够精确。解释结果时,这一区别很重要。
当原始预测确实会造成类型错误时,干预比面对不够精确但仍可接受的类型时更有效。因此,这一结果更适合解释为纠正类型错误,而不是普遍提高类型精度。
我们还把从 Python 得到的向量用于 TypeScript 样本,反过来也用 TypeScript 向量处理 Python 样本。Guha 表示,两者效果相近,暗示这两种语言可能共享类型的内部表示;能否扩展到其他语言仍只是推测。

编程是研究可解释性的有用场景,因为我们可以在编辑代码时保持语义、运行生成的程序,并使用类型检查器。即便如此,我们对这些模型内部机制的理解也才刚刚起步。
提示词、任务与编程初学者
提示词细节影响基准分数,因此 Guha 研究学生如何描述编程任务。一项 2023 年的实验记录了完整的提示词修改轨迹和测试反馈。
问模型能否完成一项任务,实际含义比听上去更窄:基准通常只问它能否根据某个特定提示词成功。要理解实际使用情况,还需要了解向模型描述任务的人。
在另一项基准实验中,团队不断为简短的并行编程提示词增加细节,直到模型能够可靠地解决问题,然后再减少细节。随着信息减少,表现下降,说明任务得分可能取决于提示词的措辞和完整程度。
2023 年初,我们研究了三所大学的 120 名学生。他们完成了 Python 入门课程,但没有修过其他编程课程。没人用过 Copilot 或 ChatGPT,很多人甚至没听说过 ChatGPT。我们希望了解有基本编程知识、却没有大语言模型使用经验的初学者,会如何向当时最先进的模型编写提示词。
学生使用最大的 OpenAI Codex 模型,解决来自课程作业和考试的小问题。他们编写自然语言描述,但不能编辑生成的代码。尝试失败后,可以重试同一个提示词、修改它或继续下一题。
研究向学生展示函数签名和测试用例,然后运行全部测试,给出预期输出和实际输出。没有隐藏测试。这有意排除了现实中另一个独立的难题:判断生成代码是否正确。
实验共 60 分钟,包含六项任务,学生可以按需反复尝试。即使有直接反馈,结果仍然差异很大;如果把每次失败的生成都算作失败,成功率会低于只看最终是否成功的结果。
研究者发布了一份匿名数据集,包含 2,000 多条提示词,以及每位学生的修改、生成代码和测试结果。从这些轨迹中提取首次和最后一次提示词,可以构造一个基准:同一任务有多个质量不同的提示词。
用其他模型重新采样表明,一次成功并不能证明提示词可靠:一些学生用质量较差的提示词碰巧成功。反过来,也有学生放弃了后来证明相当有效的提示词;再采样一次可能就会成功。
第一次尝试就成功的提示词,往往比经过多次修改后最终成功的提示词更可靠。Guha 把后者比作学生每次失败后不断添加代码,却不退一步重新思考解决方案。
线索与失败的提示词修改
团队分析学生在解决账单计算问题时增删了哪些必要事实。遗漏细节和反复回到失败状态,有助于解释他们何时会放弃。
为了理解修改改变了什么,研究者分析了一道涉及数量、价格、税和四舍五入的购物账单题。13 名学生尝试了这道题,通常不止一次,产生了各种各样的自然语言描述。
Guha 的学生 Francesca 提议追踪每次提示词修改增加、删除或改变的必要事实,也就是“线索”。对于账单问题,团队识别出八条线索,包括输入列表结构和将答案四舍五入到两位小数。
轨迹图交替展示学生的编辑,以及模型结果和测试反馈。它把等价的失败状态归在一起,便于观察不同学生如何修改,以及他们最终在哪里成功或放弃。
一位学生包含了几乎所有线索,却遗漏了四舍五入到两位小数。失败后,学生把 tax 改成 taxes,接着修改了已经描述过的列表细节。这两次修改都没有补上缺失信息;后来的一次修改还删掉了对结果求和的信息。
这位学生在一个接近其他学生发现四舍五入要求的状态时放弃了。Guha 指出,初学者可能还没有关于浮点输出的心智模型。在整个数据集中,线索完整与成功相关,而遗漏哪怕一条线索或反复陷入错误,则与失败或放弃有关。
应用、教育与观众提问
Guha 讨论生产力、智能体生成的提交以及尚待开展的研究。观众提问涉及计算机教育、词汇、激活补丁和内部表示。
Guha 表示,尽管他个人认为大语言模型有用,受控研究仍未明确随机选取的开发者能获得多少收益;一些研究甚至发现工作速度下降。他还介绍了对开源项目中智能体使用情况的早期研究:利用提交签名,团队在 Claude Code 出现后的头几个月识别出约 130 万次提交。
被问及大语言模型可能如何改变计算机科学教育时,Guha 说也许存在好的使用方式,但教育者目前还了解不足。大学作业的目标是学习,而不只是交出一个实现;让模型完成任务可能绕过这一学习过程。
一位听众问,学生是否会按照自己增加的线索来思考。Guha 说,学生反而常把困难归因于语法或词汇。在因果干预实验中,与传达必要信息相比,把 array 换成 list 或反过来替换,通常影响很小。
另一位听众问,团队是否反转过用于纠正类型的激活补丁,以引入错误。论文没有这样做。团队确实测试了随机噪声基线,包括幅度相当的噪声,但没有看到同样明显的纠正效果。
最后一位提问者询问如何理解主成分分析图中 Python 与 OCaml 激活值的分离。Guha 将模型描述为复杂分类器的堆叠:持续出现的分离表明,这些提示词在高维计算中受到不同的分类。
同频道的其他文章
1:48:29EN → 简体中文
1:05:45EN → 简体中文
1:25:00EN → 简体中文
1:16:29EN → 简体中文
4:41EN → 简体中文
1:34:29EN → 简体中文