DevQualityEval 评测报告解读:Qwen3-Coder 仓库中 palm-2-codechat-bison 测试生成质量评估的指标体系与判定机制
【免费下载链接】Qwen3-CoderQwen3-Coder is the code version of Qwen3, the large language model series developed by Qwen team.项目地址: https://gitcode.com/GitHub_Trending/co/Qwen3-Coder
本文以 Qwen3-Coder 仓库中 DevQualityEval v0.5.0 对google/palm-2-codechat-bison的评测报告 为核心,完整解析其七大结果分类体系、评分 CSV 各列的真实含义与汇总数据,并结合评测框架 Go 源码说明分数计算与类别判定的底层逻辑;读完后你将能够独立读懂这类“LLM 生成单元测试”质量评测报告,并理解每个指标是如何产生、如何累加、如何决定模型最终分类的。
报告概览:一次针对测试生成能力的评测快照
该报告由 DevQualityEval benchmark(version 0.5.0)于 2024-06-19 10:01:10 自动生成,评估对象是通过 OpenRouter 接入的openrouter/google/palm-2-codechat-bison模型。报告目录内除 README 外,还保留了完整的可复核数据文件:
- evaluation.csv:逐条任务的详细评分记录;
- models-summed.csv:全模型维度的汇总数据;
- golang-summed.csv 与 java-summed.csv:分语言汇总数据;
- categories.svg:报告头部的分类条形图(对应 README 中引用的
./categories.svg)。
原报告在 Results 一节中特别提示:LLM 是非确定性的(nondeterministic),结果只反映一次运行快照。这意味着同一模型重复评测可能得到不同的分数与分类,这也是解读任何此类评测数据时必须记住的前提。本次评测覆盖 4 组“语言 × 仓库”组合:golang/light、golang/plain、java/light、java/plain,任务类型均为write-tests(为已有源码文件生成测试)。
七大结果类别:模型被如何分级
原报告将模型结果划分为以下 7 个类别(下表完整继承自 报告原文),这些类别在源码 category.go 中均有对应的AssessmentCategory常量定义:
| 类别 ID | 报告中的名称 | 含义 |
|---|---|---|
category-unknown | category unknown | 无法对模型进行分类 |
response-error | response error | 模型在产生响应时遇到了错误 |
response-no-code | no code | 模型响应中未包含任何代码 |
code-invalid | invalid code | 模型生成的代码执行时产生了错误 |
code-executed | executable code | 模型生成了可执行的代码 |
code-coverage-statement | statement coverage reached | 模型生成的代码达到了 100% 语句覆盖率 |
code-no-excess | no excess response | 模型响应没有包含超出要求的内容 |
在palm-2-codechat-bison的这份报告中,模型最终被列入"category unknown"类别。结合 category.go 中Category()的实现 来看,判定逻辑是一个自高而低的级联开关:
- 若
response-no-error计数未达到总任务数,归为response-error; - 若
response-with-code与files-executed均未达标,归为no code(源码中附有 TODO 注释,说明当时代码检测尚不总可靠,故用“代码未检出且文件未执行”双条件兜底); - 若
files-executed未达标,归为invalid code; - 若
coverage未达标,归为executable code; - 若
response-no-excess未达标,归为statement coverage reached; - 全部达标,归为
no excess response。
而返回category unknown的唯一路径是totalTasks == 0。也就是说,从源码结构看,可以推断生成这份单模型 README 时,报告生成器并未携带该模型的总任务数,因而类别判定退化为 unknown;这与同目录下其他模型报告(如 codeqwen 报告)呈现相同类别的现象一致。因此类别字段在这份快照中不承载区分度,真正承载信息的是 CSV 中的数值指标。
逐行解读 evaluation.csv:指标列的含义
evaluation.csv 的表头由 csv.go 的EvaluationHeader()生成,固定为model-id, language, repository, task, score加上全部已注册的指标键。本次评测的实际数据为 4 行:
| 语言 | 仓库 | 任务 | score | coverage | files-executed | 测试目标文件字符数 | 处理耗时(ms) | 响应字符数 | no-error | no-excess | with-code |
|---|---|---|---|---|---|---|---|---|---|---|---|
| golang | golang/light | write-tests | 1464 | 1100 | 41 | 110461 | 360994 | 112382 | 115 | 102 | 106 |
| golang | golang/plain | write-tests | 59 | 40 | 4 | 665 | 5984 | 740 | 5 | 5 | 5 |
| java | java/light | write-tests | 2675 | 2340 | 20 | 132017 | 364598 | 133359 | 115 | 100 | 100 |
| java | java/plain | write-tests | 59 | 40 | 4 | 701 | 3918 | 766 | 5 | 5 | 5 |
各指标列的语义、以及是否计入总分,由 assessment.go 中的指标注册表 决定:RegisterAssessmentKey为每个指标分配一个乘数(multiplier),乘数为 0 的指标只记录、不计分:
files-executed(乘数 1,计分):成功执行的文件数;coverage(乘数 10,计分):语句覆盖计数对象数;tests-passing(乘数 10,计分):通过测试的比例,本报告中未产生该列数据;response-no-error(乘数 1,计分):模型无错误响应的次数;response-with-code(乘数 1,计分):响应中包含代码的次数;response-no-excess(乘数 1,计分):响应未包含超出要求内容的次数;processing-time(乘数 0,不计分):任务完成耗时,单位为毫秒(源码注释明确说明);response-character-count/generate-tests-for-file-character-count(乘数 0,不计分):分别记录模型响应总字符数、待生成测试的目标文件总字符数,属于工作量与规模参照指标。
score列的合成规则可以直接从 Score() 的实现 得到验证:它把所有乘数非 0 的指标原始值直接相加。用golang/light这一行验证:41 + 1100 + 115 + 106 + 102 = 1464,与 CSV 中记录的 1464 完全一致;golang/plain行同样有4 + 40 + 5 + 5 + 5 = 59。这个可复算性意味着任何人都可以离线核验报告数据的自洽性。
从数据本身可以看出几个稳定的模式:
- light 仓库与 plain 仓库的量级差异极大:golang 下 1464 对 59,java 下 2675 对 59。plain 仓库的目标文件仅 665/701 字符、5 个文件,属于极小的冒烟级评测集;light 仓库则是 11 万字符量级的真实代码库,能真正拉开模型差距。
- java/light 的 coverage(2340)显著高于 golang/light(1100),而两者执行文件数相仿(20 对 41 时 coverage 反超),说明该模型在 Java 测试上触达了更密集的语句覆盖。
response-no-error合计 240 次而无一次错误,表明该快照内模型 API 调用层面是稳定的;response-no-excess合计 212、response-with-code合计 216,即有少量响应未含代码或带有超出要求的额外内容。
汇总数据与聚合机制
三个汇总 CSV 是evaluation.csv按维度求和的结果,聚合逻辑对应 csv.go 中RecordsToAssessmentsPerModel对记录按模型分组、用Assessments.Add逐项累加的实现:
| 维度 | score | coverage | files-executed | 目标文件字符数 | 耗时(ms) | 响应字符数 | no-error | no-excess | with-code |
|---|---|---|---|---|---|---|---|---|---|
| 全模型(models-summed.csv) | 4257 | 3520 | 69 | 243844 | 735494 | 247247 | 240 | 212 | 216 |
| golang(golang-summed.csv) | 1523 | 1140 | 45 | 111126 | 366978 | 113122 | 120 | 107 | 111 |
| java(java-summed.csv) | 2734 | 2380 | 24 | 132718 | 368516 | 134125 | 120 | 105 | 105 |
可以核验1523 + 2734 = 4257、1140 + 2380 = 3520等所有列的加法关系,数据链路是闭合的。全模型视角下,这次评测让模型为合计约 24.4 万字符的源码生成了测试,总耗时约 735 秒(两个 light 仓库各约 36 万毫秒占绝对大头),生成了约 24.7 万字符的响应,其中 69 个文件最终成功执行。
如何延续这份报告的分析
- 若要做横向对比,同版本报告位于 docs/reports/v0.5.0/ 下,每个被评测模型一个子目录,目录内文件结构完全一致,可直接用相同的列语义对比不同模型的 score、coverage 与分类表现;
- 若要理解评测流程本身,框架主体是 Go 工程 eval-dev-quality,其中 evaluate/ 目录包含指标(metrics)、报告(report)与任务定义,language/ 包含 golang、java、ruby 三种语言的覆盖统计实现;
- 需要注意的边界:报告 README 中提及的完整日志文件
evaluation.log并未包含在当前仓库快照中,仓库内保留的是上述 CSV 数据文件,因此逐请求级别的原始输出无法在仓库内复核,只能以 CSV 数值为准; - 再次强调原报告的提醒:LLM 输出非确定性,这份数据只是 2024-06-19 的一次运行快照,不应被当作模型能力的恒定基准。
【免费下载链接】Qwen3-CoderQwen3-Coder is the code version of Qwen3, the large language model series developed by Qwen team.项目地址: https://gitcode.com/GitHub_Trending/co/Qwen3-Coder
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考