← 返回 2026-07-09

教 LLM 低资源语言:增强 Pharo 代码补全 Teaching LLMs a Low-Resource Language: Enhancing Code Completion in Pharo

Kilian Kier, Alessandro Giagnorio, Omar AbedelKader, Oleksandr Zaitsev, Robert Peharz, Romain Robbes, Gabriele Bavota, Stéphane Ducasse 📅 2026-07-06 👍 5 2026-07-13 08:37
Pharo Smalltalk 代码补全 低资源编程语言 持续预训练 模型微调

通过端到端流水线将代码大模型适配到极低资源语言 Pharo,实现高质量的 IDE 内实时代码补全

前置知识

Fill-in-the-Middle (FIM)

FIM 是一种语言模型训练目标,模型需要在给定文本前后缀的情况下预测中间缺失的部分。与传统的自左向右生成不同,FIM 允许模型利用光标前后的上下文信息,这在代码补全场景中特别重要,因为开发者的光标位置可能在代码的任意位置。常见的 FIM 策略包括前缀-后缀-中间和后缀-前缀-中间两种不同的遮蔽模式,论文中的 Qwen2.5 Coder 使用前者而 Mellum 使用后者。

论文使用 FIM 进行模型训练,这是实现代码补全的核心技术,理解它对于掌握论文方法至关重要,因为 FIM 使模型能够同时利用光标前后的上下文信息来生成更准确的代码补全建议。

Pharo 和 Smalltalk

Pharo 是一个开源的 Smalltalk 实现,具有动态类型、反射特性和实时编程环境。Smalltalk 的独特之处在于控制流结构如 if 和 while 不是语言语法的一部分而是普通方法,方法签名使用关键词消息语法且参数穿插在方法名中,代码通常保存为 Tonel 格式这种混合了可执行代码和元数据的特殊文件格式,这些特性使得从高资源语言迁移学习到 Pharo 变得格外困难。

论文的核心贡献就是针对 Pharo 这些独特特性设计专门的数据处理和训练策略,理解这些特性是理解论文挑战的关键,因为 Tonel 格式的复杂性和 Smalltalk 语法的特殊性是现有 LLM 在 Pharo 上表现不佳的主要原因。

Low-Rank Adaptation (LoRA)

LoRA 是一种参数高效的微调技术,它通过在预训练模型的权重矩阵上添加低秩矩阵来实现适配而不是更新全部参数。具体来说对于权重矩阵 W,LoRA 训练两个低秩矩阵 A 和 B 使得 W 等于 W 加上 BA,其中 A 和 B 的秩远小于 W 的维度,这样可以大幅减少可训练参数数量同时保持模型性能,使得在有限计算资源下适配模型到低资源语言成为可能。

论文使用 LoRA 进行持续预训练和微调,这使得在有限计算资源下适配模型到 Pharo 成为可能,因为 LoRA 只需要训练少量参数就能实现有效的模型专门化,大大降低了计算和存储成本。

ChrF 和 CrystalBLEU

ChrF 即字符 n-gram F 值通过计算生成文本和参考文本之间字符 n-gram 的调和平均数来衡量相似度。CrystalBLEU 是 BLEU 指标的代码适配版本,它移除了琐碎的 n-gram 如语言特定的标记,使评估更专注于有意义的代码元素。在论文中这两个指标用于评估代码补全结果与开发者原始代码的相似度,因为没有可执行的测试用例来验证功能正确性,只能通过相似度来评估质量。

论文在仓库级基准测试中使用这些指标评估补全质量,理解它们有助于解读实验结果,因为这些指标反映了模型生成代码与真实开发者代码之间的相似程度,是衡量补全实用性的重要标准。

研究动机

代码补全是 IDE 的核心功能,能显著提升开发者效率。当前基于大语言模型的代码补全工具在主流语言如 Python 约有两千六百万个公共仓库上表现出色,但在低资源语言上效果不佳。Pharo 作为 Smalltalk 的现代实现,仅有约两千个公共仓库,比 Python 少四个数量级,导致现有 LLM 对 Pharo 的补全支持非常有限。Pharo 当前的 IDE 即 COMPLISHON 引擎只能提供单 token 补全,远不如主流 IDE 中开发者习惯的多 token 上下文感知补全。问题的根源不仅是数据稀缺,还包括 Pharo 特有的 Tonel 格式混合了代码和元数据,以及 Smalltalk 独特的语法特征即控制流是方法而非语法,这些因素阻碍了从高资源语言的迁移学习。

本文的目标是论文的目标是为 Pharo 这一极低资源语言开发高质量的基于 LLM 的代码补全系统,要求模型足够小以支持在开发者机器上实时推理,同时补全准确率要显著优于现有工具。具体而言要构建一个端到端流水线,从数据收集清洗训练到评估,证明通过专门化训练可以让小型代码 LLM 在 Pharo 补全任务上达到甚至超过大型通用模型的性能,从而为 Pharo 社区提供实用的代码补全工具。

与已有工作不同的是,现有研究主要关注离线代码生成而非实时 IDE 补全,或者针对相对不那么低资源的语言如 Lua 有六十二万个仓库、Julia 有八万五千个。没有工作针对 Pharo 这样的极端低资源语言,且需要同时解决 Tonel 格式、Smalltalk 语法特异性和实时推理约束的组合挑战。论文的独特切入角度是证明对于代码补全这一特定任务,专门化训练的小模型可以在低资源语言上胜过规模大数百倍的通用模型,这挑战了越大越好的常规认知,为低资源语言的工具开发提供了新思路。

核心方法

论文提出一个端到端的模型专门化流水线,包含三个核心组件:数据收集与清洗、两阶段训练即持续预训练加监督微调、以及专门构建的评估基准。整体思路是先通过领域特定的数据让模型学习 Pharo 的语法和 API,再通过模拟真实补全场景的微调让模型适应实际使用模式。技术路线上论文开发了一套 Pharo 专用工具包括 lexer 和 parser 来处理 Tonel 格式,构建了两种训练数据集即 AST 遮蔽和随机遮蔽,并设计了方法级和仓库级两类评估基准来全面评估模型性能。

核心创新点是将代码补全任务分解为两个互补的子任务,分别对应两个训练阶段。第一阶段通过 AST 遮蔽的持续预训练让模型学习 Pharo 的语法结构即遮蔽完整的 AST 节点,第二阶段通过随机遮蔽的监督微调让模型适应真实光标位置的补全场景。另一个关键创新是仓库级补全的上下文选择策略,发现提供同一次提交中最近修改的其他方法作为上下文,比提供类或包的方法签名更有效,这为实际 IDE 中的上下文选择提供了重要指导。

方法步骤详情

数据收集阶段从 GitHub 挖掘带 Pharo topic 且 MIT 许可的仓库,通过版本兼容性检查确保代码兼容 Pharo 10-14,最终得到 415 个仓库和 387159 个方法。训练实例构建阶段开发 Pharo lexer 和 tree-sitter parser,创建两种数据集:预训练数据集包含 387159 个方法,其中 25% 使用左到右因果语言建模,75% 使用 FIM 即 AST 遮蔽策略遮蔽 3-10 个 token 的完整 AST 节点;微调数据集使用随机 AST 遮蔽策略,从方法体随机位置开始遮蔽到语句结束,共 324725 个实例。两阶段训练阶段使用 LoRA 技术进行持续预训练和微调,超参数为 alpha=32、r=16、dropout=0.05,学习率 eta=5e-5,最大序列长度为 2048,训练 3 个 epoch。评估阶段构建方法级基准即 HumanEval+ 和 Exercism 翻译到 Pharo 各有 AST-aware 和随机-AST 两个变体和仓库级基准即从 22 个测试仓库的真实提交中提取补全任务,测试四种上下文策略。

技术新颖性

技术新颖性体现在三个方面:首次为极端低资源语言构建完整的 LLM 补全流水线,包括语言专用工具即 lexer 和 parser 和领域特定训练策略;创新的上下文选择策略,发现同次提交的修改方法比静态签名信息更有用;证明了对于代码补全任务,7B 专门化模型在低资源语言上可以超越 480B 的通用模型,挑战了规模崇拜。此外论文开发了 Pharo 专用工具链并开源,为后续研究提供了基础设施,这使得其他研究者可以在此基础上继续改进或应用到其他低资源语言。

General structure of a Tonel file
Figure 1: General structure of a Tonel file

实验结果

实验结果证实了专门化训练的有效性。在方法级基准测试上 Qwen2.5 Coder 7B 经过完整训练后,在 HumanEval+ AST-aware 上的 pass@1 从 71.12% 提升到 89.04% 即提升 17.92%,在 Exercism AST-aware 上从 68.58% 提升到 85.84% 即提升 17.26%。在更现实的随机-AST 任务上,Qwen2.5 Coder 3B-SFT 在 HumanEval+ r-AST 上达到 51.83%,而 Qwen3 Coder 480B 只有 45.13%。错误分析表明基线模型的失败主要 65.6% 是由于语法错误,训练过程将语法错误减少了 33%。在仓库级测试中,使用修改方法作为上下文时 Qwen2.5 Coder 7B-SFT 的 ChrF 达到 75.96%,CrystalBLEU 达到 58.99%,相比无上下文分别提升 15.91% 和 23.03%。

任务指标本文基线提升
HumanEval+ AST-aware pass@1 89.04% (Qwen2.5 Coder 7B-SFT) 71.12% (Qwen2.5 Coder 7B Base) +17.92%
HumanEval+ r-AST pass@1 51.83% (Qwen2.5 Coder 3B-SFT) 45.13% (Qwen3 Coder 480B) +6.70%
Exercism AST-aware pass@1 85.84% (Qwen2.5 Coder 7B-SFT) 68.58% (Qwen2.5 Coder 7B Base) +17.26%
仓库级补全 (修改方法上下文) ChrF 75.96% (Qwen2.5 Coder 7B-SFT) 60.05% (无上下文) +15.91%
仓库级补全 (修改方法上下文) CrystalBLEU 58.99% (Qwen2.5 Coder 7B-SFT) 35.96% (无上下文) +23.03%

局限与改进

论文承认的局限性包括:数据污染风险虽通过日期截止和 n-gram 过滤缓解但无法完全排除,特别是对于大型基线模型;方法级评估使用基准实现构造的遮蔽任务可能不能完全反映真实编码场景;仓库级评估使用 ChrF 和 CrystalBLEU 等相似度指标而非功能正确性无法保证生成的补全语义等价于原始代码;推理延迟评估仅在高规格机器上进行未覆盖所有使用场景;未进行真实的 IDE 集成和用户研究仍在开发 Pharo IDE 插件。我的观察是论文的 4-bit 量化结果只报告了小部分基准可能存在其他未报告的性能下降;上下文选择策略虽然有效但依赖跟踪最近修改的方法这在实际 IDE 中可能需要额外的工程实现。

独立分析的弱点

论文的主要弱点是评估不完整:仓库级基准缺乏功能性验证仅使用相似度指标无法判断补全是否真正可运行和语义正确。另一个弱点是上下文策略的可扩展性未充分探索论文只测试了四种上下文类型但实际 IDE 可能需要更智能的动态上下文选择。第三个弱点是 Pharo 的特定特性如 Tonel 格式和 Smalltalk 语法使得方法难以直接泛化到其他低资源语言论文声称策略可迁移但缺乏实证支持。改进方向包括:为仓库级任务设计可执行的测试用例探索基于语义相关性的上下文检索策略在其他 Smalltalk 方言或完全不同的低资源语言上验证方法的泛化能力。

未来方向

作者提出的未来工作包括:将模型集成到 Pharo IDE 并进行真实用户交互评估目前正在开发相关插件;研究方法对其他 Smalltalk 方言如 Gemstone S、VA Smalltalk、VisualWorks 的泛化能力;改进上下文选择策略探索基于语义而非单纯时间戳的上下文检索;优化推理延迟例如通过 prompt caching 或更激进的量化。基于论文成果的可延伸方向包括:将两阶段训练范式应用于其他低资源语言;研究专门化训练与模型规模的最佳权衡;探索从高资源语言到低资源语言的更有效迁移学习方法例如利用跨语言的代码结构相似性。

复现评估

复现性评估:论文提供了完整的复制包即 Zenodo DOI 为 10.5281 除以 zenodo.18833238,包含数据收集脚本、训练代码、评估工具和实验结果。所有使用的模型即 Qwen2.5 Coder 和 Mellum 都是开源的,基线模型即 Qwen3 Coder 480B 和 Claude 4.5 Sonnet 可以通过 API 访问。训练数据来自 GitHub 公共仓库,MIT 许可,可公开获取。计算需求方面,论文使用 LifeWare 提供的算力支持,具体硬件未详细说明,但量化后的 7B 模型可在消费级硬件即 Apple M3 Max 上运行。整体而言,论文的复现难度中等,主要挑战在于需要足够的 GPU 资源进行训练,以及 Pharo 环境的搭建。