Qwen3-Coder 仓库中 DevQualityEval v0.5.0 评测报告详解:toppy-m-7b 单模型案例与评分、分类机制
【免费下载链接】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 仓库内归档的一份真实评测报告——openrouter/undi95/toppy-m-7b在 DevQualityEval v0.5.0 中的单项结果——为样本,逐字段解读报告目录中的 CSV 数据,并结合仓库中 vendored 的基准工具源码验证其得分构成与七档结果分类算法。读完本文,你将掌握 DevQualityEval 报告的完整阅读方法:如何从evaluation.csv还原每个任务的实际表现、如何用源码中的评分乘数交叉验证 score 列、以及为什么一个总得分高达 3858 的模型最终却被归档进 "category unknown"。
报告出处与目录结构
本报告由 DevQualityEval 基准(版本0.5.0)于2024-06-19 10:52:54生成,原始说明文件为 toppy-m-7b/README.md。它是 v0.5.0 整轮评测(同目录下还归档了数十个模型,如gpt-4o/、deepseek-coder/、qwen-2-72b-instruct/等)中针对单一模型的独立报告目录,当前仓库保留了以下文件:
| 文件 | 内容 |
|---|---|
| README.md | 报告正文:分类图、结果分类说明、模型归类清单 |
| evaluation.csv | 逐任务明细:模型、语言、仓库、任务、得分与各项指标 |
| models-summed.csv | 模型级汇总(所有任务求和) |
| golang-summed.csv | Go 语言维度汇总 |
| java-summed.csv | Java 语言维度汇总 |
| categories.svg | "Models per Category" 分类柱状图 |
需要注意两点边界事实:其一,原 README 中提到的完整请求/响应日志evaluation.log在当前仓库目录中并未保留,因此下文的量化分析全部以 CSV 文件为准;其二,报告原文明确提示"LLMs are nondeterministic. The following results just reflect a current snapshot."(LLM 是非确定性的,结果只反映一次快照),因此这份数据只能作为该时间点的一次采样,不适合跨运行直接比较。
七档结果分类及其源码定义
原 README 将本轮所有模型划分为 7 个类别,并给出了逐字定义:
- category unknown:无法归类的模型;
- response error:产生响应时遇到错误的模型;
- no code:未产生任何代码的模型;
- invalid code:产生了无效代码的模型;
- executable code:产生了可执行代码的模型;
- statement coverage reached:产生的代码达到了完整语句覆盖率的模型;
- no excess response:响应中没有超出要求内容的模型。
这 7 段文字并非人工撰写,而是由基准工具的分类定义直接渲染而来。在 evaluate/metrics/category.go 中,每个类别都是一个带ID、Name、Description的AssessmentCategory结构体,注册顺序与描述文案和 README 完全一一对应:
| 源码常量 | ID | Name(报告展示名) |
|---|---|---|
AssessmentCategoryUnknown | category-unknown | category unknown |
AssessmentCategoryResponseError | response-error | response error |
AssessmentCategoryResponseNoCode | response-no-code | no code |
AssessmentCategoryCodeInvalid | code-invalid | invalid code |
AssessmentCategoryCodeExecuted | code-executed | executable code |
AssessmentCategoryCodeCoverageStatementReached | code-coverage-statement | statement coverage reached |
AssessmentCategoryCodeNoExcess | code-no-excess | no excess response |
报告生成侧的入口在 evaluate/report/markdown.go:遍历每个模型的Assessment,调用assessment.Category(m.TotalScore)得到档位,把模型名追加进ModelsPerCategory,随后由barChartModelsPerCategoriesSVG渲染出categories.svg。也就是说,README 中"### Result category ..."小节下的模型列表和柱状图,都是这段代码对同一份分类结果的不同视图。
本次运行的任务与完整明细数据
DevQualityEval 的核心任务之一是Test Generation(write-tests):给定一段源码,要求模型编写能编译通过并达到 100% 语句覆盖率的测试(完整任务与测试用例说明见 基准 README 的 The Evaluation 一节,测试数据仓库在 testdata)。toppy-m-7b 本轮恰好运行了 3 个write-tests用例,evaluation.csv 的完整内容如下:
| model | language | repository | task | score | coverage | files-executed | gen-tests-for-file-char | processing-time | response-char | no-error | no-excess | with-code |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| openrouter/undi95/toppy-m-7b | golang | golang/plain | write-tests | 12 | 0 | 0 | 2300 | 12493 | 2874 | 5 | 3 | 4 |
| openrouter/undi95/toppy-m-7b | java | java/light | write-tests | 3825 | 3540 | 28 | 135475 | 514422 | 177124 | 115 | 31 | 111 |
| openrouter/undi95/toppy-m-7b | java | java/plain | write-tests | 21 | 10 | 1 | 2200 | 16178 | 4166 | 5 | 0 | 5 |
各列的含义可以在 evaluate/metrics/assessment.go 的指标注册处找到权威定义:
response-no-error(乘数 1):响应无错误,每个成功响应计 1 分;response-with-code(乘数 1):响应中包含源码,计 1 分;response-no-excess(乘数 1):响应没有超出要求的内容,计 1 分;files-executed(乘数 1):成功执行的文件数;coverage(乘数 10):执行的覆盖率对象计数,每单位计 10 分;processing-time(乘数 0):任务耗时(毫秒),不参与评分;response-character-count/generate-tests-for-file-character-count(乘数 0):响应与生成测试文件的字符数,仅作观测指标。
得分机制验证:score 列如何由各项指标加总
Score() 方法 的语义是"对所有乘数非零的指标求和"(乘数为 0 的processing-time、字符数等只记录不评分)。用这个规则对上面三行逐行验算,可以完全复现score列:
- golang/plain:no-error 5 + with-code 4 + no-excess 3 + files-executed 0 + coverage 0 =12✓(该任务的生成测试未能执行,0 覆盖、0 执行文件,得分全部来自"响应行为"指标)
- java/plain:no-error 5 + with-code 5 + no-excess 0 + files-executed 1 + coverage 10 =21✓(有 1 个文件执行成功并拿到 1 个覆盖对象,但响应存在多余内容,no-excess 为 0)
- java/light:no-error 115 + with-code 111 + no-excess 31 + files-executed 28 + coverage 3540 =3825✓
三行相加得到 models-summed.csv 的模型级汇总,同样自洽:no-error 125 + with-code 120 + no-excess 34 + files-executed 29 + coverage 3550 =3858,与汇总行的score=3858一致;而 java-summed.csv(3825+21=3846)与 golang-summed.csv(12)之和也恰为 3858。
这份数据还揭示了该模型在本轮的行为画像:绝大多数产出集中在java/light(生成测试文件 135475 字符、响应 177124 字符、耗时 514422 毫秒,约 8.6 分钟),占全部响应的 96%;Java 侧 29 个执行文件中 28 个跑通并拿到 3540 分覆盖率,但 115 次无错误响应中只有 31 次"无多余内容"——即大多数 Java 响应在测试代码之外还附带了额外文本,这与测试生成任务"响应必须只包含测试代码"的要求相违背,直接拉低了response-no-excess档位的表现。
为什么总得分 3858 仍被归入 "category unknown"
报告最终的分类结果与得分形成了鲜明反差:README 的模型清单中,toppy-m-7b 被列在唯一的"category unknown"小节下,而没有出现在其余任何高档位。对照 Category() 分类算法,可以推断原因:
- 分类是一个严格的"阶梯判断",自上而下依次检查:
no-error未达totalTasks×1→response error;with-code与files-executed双双未达 →no code;files-executed未达 →invalid code;coverage未达totalTasks×10→executable code;no-excess未达 →statement coverage reached;全部达成才是no excess response。 - 源码注释与 category_test.go 的 "Inconsistent" 用例(2 个任务中覆盖只达成 1 次 → 类别止步于
code-executed)共同表明:档位取决于模型是否在所有任务上一致达成该档标准,而非平均分或总分数。 - 算法首行
if totalTasks == 0 { return AssessmentCategoryUnknown }:从源码结构看,"category unknown" 只在该分支触发,即传入分类器的任务总数为 0。报告模板(markdown.go)传入的是m.TotalScore作为该计数,结合本报告把模型归入 unknown 的事实,可以推断这份单模型独立报告在分类时使用的任务计数口径为 0,因此模型跳过了全部阶梯判断——这与它拥有 3858 分的逐任务得分并不矛盾:CSV 里的分数是逐任务累计的真实产出,而分类档位是另一个独立判定的口径。阅读此类报告时应把"得分"和"档位"当作两套结论,而不是互相替代。
如何复现:安装与运行基准
Qwen3-Coder 仓库在 qwencoder-eval/instruct/eval-dev-quality/ 内置了该基准的完整副本,其 README 给出了安装与运行方式(需 Go 环境):
# 安装评测二进制 go install -v github.com/symflower/eval-dev-quality/cmd/eval-dev-quality基准默认不在沙箱中执行 LLM 生成的代码,README 明确建议在隔离环境中运行,例如使用
--runtime docker。
使用 OpenRouter 作为推理提供方(本报告中的openrouter/undi95/toppy-m-7b即经此通道调用):
export PROVIDER_TOKEN=openrouter:${your-key} # 运行全部模型与任务 eval-dev-quality evaluate # 只评估指定模型(本报告对应的调用形态) eval-dev-quality evaluate --model=openrouter/undi95/toppy-m-7b也可以用 Docker 运行时获得隔离执行:
docker build . -t eval-dev-quality:dev eval-dev-quality evaluate --runtime docker --runtime-image eval-dev-quality:dev --model symflower/symbolic-execution除 OpenRouter 外,README 还登记了 Ollama(--model ollama/...,默认端口 11434)与任意兼容 OpenAI chat completion API 的自定义端点(--urls=custom-${name}:${endpoint-url})两类提供方;完整选项见eval-dev-quality evaluate --help。评测结果会写入evaluation.csv,并额外生成包含分类结果的报告文件——本报告目录就是该流程对 topy-m-7b 的一次输出快照。
结果解读的注意事项
- 非确定性:原 README 的提示依然成立,同一模型多次运行会得到不同的
score与coverage,本目录数据仅代表 2024-06-19 的一次采样。 - 档位 ≠ 得分:如前文所述,
category由"全任务一致达成"的阶梯逻辑决定,总分高的模型也可能因覆盖未全达成或响应携带多余内容而止步于中低档。 - 版本口径:仓库中同时归档了
v0.2.0/、v0.4.0/、v0.5.0/、v0.6/多轮报告,不同版本的指标列与奖励规则可能不同(例如本轮 CSV 的列集合与当前 assessment.go 注册的指标键一致),跨版本比较前应先核对各自 CSV 的列定义。 - 数据可得性:本轮报告未保留
evaluation.log原文,逐条提示词与模型响应已不可查,深度归因(例如java/light中 87 次多余响应的具体内容)无法在仓库内完成,CSV 指标即为可验证的全部依据。
对于要在 Qwen3-Coder 评测体系中复现或扩展单模型报告的分析工作,建议的阅读顺序是:先读单模型目录的README.md看档位归属,再用evaluation.csv按"乘数非零项求和"规则复核score列,最后对照 category.go 的阶梯逻辑解释档位结果——本文对 topy-m-7b 的解析过程即是这一方法的完整示例。
【免费下载链接】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),仅供参考