Page 122 - 《软件学报》2026年第6期
P. 122
舒善富 等: 基于自适应知识蒸馏的代码大模型轻量化 2441
教师模型选自当下领先的开源的代码生成模型家族: StarCoder-7B、Code Llama-Python-7B 及 CodeGen-
Mono-6B, 采用每个模型家族中最小的模型作为学生模型, StarCoder-1B、TinyLlama-1.1B 及 CodeGen-Mono-
350M.
4.2 实验细节及基准模型
4.2.1 衡量指标
LLM 需根据给定的 prompt 生成功能正确的代码并通过所有测试用例. 为衡量代码生成的准确性, HumanEval
Pass@k 指标, 即 LLM 解决的任务百分比. 如果 LLM k 个代码可以通过所有测试用例, 则认
提供了 生成的任何前
为该任务已解决. 由于 Pass@k 具有高方差, 本文使用无偏版本 [49] , 其公式定义如下:
[ ( )/( )]
n−c n
Pass@k: = E 1− (18)
k k
( )
n
其中, E 表示所有任务的平均表现; n 是任务总数; c 是正确解决的任务数; 是从 n 个任务中选择 k 个任务的组
k
( )
n−c
合数; 是从一个模型无法解决的任务 (即 n−c 个任务) 中选择 k 个任务的组合数量, 即失败的方式数量. 本
k
文采用的评估指标为 Pass@1.
为进一步验证 AKD 方法在代码生成任务中的有效性, 本文对各知识蒸馏方法训练得到的模型进行生成代码
的质量问题评估. 采用 Wen 等人 [51] 提出的针对代码大模型生成代码的错误类别及完整性评估作为评测标准, 具体
类别如表 2 所示.
表 2 代码大模型生成代码的评估标准
评估类型 评估内容 评估描述
AssertionError 空函数 模型创建一个空函数、使用pass语句、return 0等
函数名使用错误 Model定义了一个函数, 但是用不正确的名称调用它
NameError 缺少的内容 模型不生成任何内容, 导致缺少入口点
缺少包的导入 模型未导入需要的包
不平衡的分隔符 生成代码中的引号或括号不平衡
SyntaxError
函数溢出 过多的函数生成达到限制, 导致不完整的输出和SyntaxError
空序列 函数处理空输入失败, 导致ValueError
ValueError 有意使用raise 模型生成raise代码以提高健壮性
不合适的参数 函数接收到正确的类型但不正确的值
IndexError 越界 试图访问序列范围外的索引
TypeError 不兼容的操作 对不适当类型的对象应用操作
AttributeError 不存在属性 访问对象中不存在的属性
TimeoutError 执行超时 代码执行超过设定的时间限制
IndentationError 不一致缩进 同一代码块中的缩进级别不一致
ModuleNotFoundError 缺少模块导入 导入未安装的非标准库模块
KeyError 不存在的键 试图访问字典中不存在的键
UnboundLocalError 未赋值的变量 在赋值前引用局部变量
RecursionError 无穷递归 函数缺乏适当的终止条件
NotImplementedError 有意使用raise 模型生成raise代码以提高健壮性
生成的代码完整 生成的代码完整, 能够进入到测试阶段
完整性评估
生成的代码不完整 生成的代码不完整, 无法进入到测试阶段
生成的代码正确 生成的代码能通过测试
正确性评估
生成完整的代码通过测试的比例 生成完整的代码中通过测试的比例
4.2.2 实验环境设置
本文的实验环境如下: CPU 为 96 核 Intel(R) Xeon(R) Gold 6342 @ 2.80 GHz, 512 GB 物理内存, GPU 为 1 张

