读懂 DevQualityEval v0.4.0 评估报告:代码生成 LLM 分类体系的完整解读
【免费下载链接】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
本报告文档是 eval-dev-quality(DevQualityEval)基准框架在version 0.4.0下生成的第 5 次(共 5 次)横向评估快照,记录了 2024-04-25 19:31:35 前后对 140 余个模型(涵盖 GPT-4、Claude 3、Llama 3、Mixtral、Gemma 等主流开源与商用模型)在 Go、Java 两种语言的测试生成任务上的表现。阅读本文,你将掌握 DevQualityEval 从"响应质量"到"覆盖率达到"再到"无多余输出"的八级分类体系及其判定逻辑、各分类下的完整模型名单、评分权重背后的设计动机,以及如何结合报告目录中的 CSV 明细复现与深入分析每次评估结果。该报告被收录在 Qwen3-Coder 项目的 qwencoder-eval/instruct/eval-dev-quality 评估目录下,作为代码生成模型横向能力对比的历史参考资料。
一、这是一份什么样的报告
报告正文首先给出了生成时间戳(Evaluation from 2024-04-25 19:31:35)、一张按分类统计模型数量的柱状图(categories.svg),并声明它由 DevQualityEval 基准在version 0.4.0下自动生成。该报告并非手工整理,而是由评估框架在每次运行结束后自动渲染输出——这一点可以从报告生成器的源码得到印证:在 markdown.go 中,Markdown 报告由 Go 模板动态填充评估时间、版本号、分类列表与每个分类下的模型清单,同时由 barChartModelsPerCategoriesSVG 使用go-chart库生成"Models per Category"柱状图(即categories.svg)。
报告同级目录下还保留了两份关键产物:
- evaluation.csv:每行对应"模型 × 语言 × 仓库"的一个评估单元,给出该单元在
score、coverage-statement、files-executed、response-no-error、response-no-excess、response-not-empty、response-with-code七个维度上的得分,共 281 行明细; - categories.svg:按分类统计模型数量的柱状图。
注意:原报告引用的
evaluation.log在本仓库对应目录下并未保留,因此本文以evaluation.csv与分类名单为分析依据。
二、八级分类体系:从"无法分类"到"无多余响应"
报告的核心是把所有被评估模型划分进八个由低到高的质量类别。这八个类别并不是报告作者临时定义的,而是由框架在 category.go 中以注册表形式统一声明:
| 分类(Category) | 内部 ID | 含义 |
|---|---|---|
| Category Unknown | category-unknown | 模型无法被归类(如总任务数为 0) |
| Response Error | response-error | 模型在尝试生成响应时遇到错误 |
| Response Empty | response-no-code分支下的空响应情形 | 模型产生了空响应 |
| No Code | response-no-code | 模型响应中不包含任何源代码 |
| Invalid Code | code-invalid | 模型生成的代码执行/编译出错 |
| Executable Code | code-executed | 模型生成的代码可以无错误执行 |
| Statement Coverage Reached | code-coverage-statement | 模型生成的代码达到 100% 语句覆盖率 |
| No Excess Response | code-no-excess | 模型响应中没有超出请求范围的额外内容 |
需要特别说明的是,"Response Empty"(空响应)在本版报告的类别注册表中对应AssessmentCategoryResponseNoCode的变体描述——从源码看,category.go 中"no code"类别的描述是"Models in this category produced no code",而报告正文为了可读性将其拆分为"Response Empty"与"No Code"两个呈现名称,二者在源码层面共用同一判定分支。
分类的判定顺序(源码级)
模型的最终类别不是取所有指标的最高分,而是按照从低到高的顺序,取模型在所有任务上"持续达标"的最高层级。核心判定逻辑位于 Category 方法:
- 若所有任务中都未出现
response-no-error(即存在响应错误),归类为Response Error; - 若
response-with-code与files-executed均未在所有任务中达标,归类为No Code(空响应也落在此处); - 若代码文件并非在所有任务中都执行成功,归类为Invalid Code;
- 若覆盖率指标未在所有任务中达标,归类为Executable Code;
- 若存在多余响应,归类为Statement Coverage Reached;
- 全部达标,才归类为No Excess Response(最高级)。
源码注释特别强调了"一致性"原则:例如总共 3 个任务中,模型只在一个任务里达到覆盖率目标,则其类别仍然只是 "CodeExecuted",因为覆盖率目标未被一致地达成。这也解释了为什么报告中"Statement Coverage Reached"是相当有含金量的类别——它要求模型在每一个评估单元上都稳定产出达到 100% 语句覆盖率且可编译的测试代码。
三、分类结果完整名单与解读
以下是本份报告(v0.4.0 第 5 次快照)中落在每个分类下的全部模型,按类别从低到高排列。模型 ID 采用provider/model形式(绝大多数为openrouter/前缀,即通过 OpenRouter 网关调用的模型)。
3.1 "Response Error"(14 个)
该类别下的模型在评估过程中遇到了错误(超时、网关异常、鉴权失败等),未产生可用的评估信号:
openrouter/jebcarter/psyfighter-13bopenrouter/anthropic/claude-2openrouter/openchat/openchat-7b:freeopenrouter/openrouter/cinematika-7b:freeopenrouter/jondurbin/bagel-34bopenrouter/anthropic/claude-instant-1openrouter/haotian-liu/llava-13bopenrouter/undi95/toppy-m-7b:freeopenrouter/anthropic/claude-2:betaopenrouter/nousresearch/nous-hermes-2-vision-7bopenrouter/anthropic/claude-instant-1:betaopenrouter/nousresearch/nous-capybara-7b:freeopenrouter/perplexity/pplx-70b-onlineopenrouter/lynn/soliloquy-l3
值得注意的细节:同一模型的:beta变体(如claude-2:beta、claude-instant-1:beta)与其正式版本在本次快照中均落入此类别,说明错误往往与模型无关,而更可能来自端点可用性或请求配置层面的问题。
3.2 "No Code"(27 个)
该类别下模型虽成功返回了响应,但响应中没有包含任何源代码(例如只输出了文字说明、拒绝回答或空内容)。名单包括:
openrouter/neversleep/noromaid-20bopenrouter/koboldai/psyfighter-13b-2openrouter/nousresearch/nous-capybara-7bopenrouter/neversleep/noromaid-mixtral-8x7b-instructopenrouter/gryphe/mythomist-7b:freeopenrouter/meta-llama/codellama-34b-instructopenrouter/undi95/remm-slerp-l2-13b:extendedopenrouter/meta-llama/llama-3-8b-instruct:extendedopenrouter/anthropic/claude-instant-1.0openrouter/openai/gpt-3.5-turbo-1106openrouter/gryphe/mythomist-7bopenrouter/nousresearch/nous-hermes-llama2-13bopenrouter/teknium/openhermes-2.5-mistral-7bopenrouter/mistralai/mistral-tinyopenrouter/intel/neural-chat-7bopenrouter/gryphe/mythomax-l2-13b:nitroopenrouter/gryphe/mythomax-l2-13b:extendedopenrouter/mistralai/mistral-7b-instruct:nitroopenrouter/01-ai/yi-34bopenrouter/google/gemini-proopenrouter/togethercomputer/stripedhyena-hessian-7bopenrouter/cognitivecomputations/dolphin-mixtral-8x7bopenrouter/openai/gpt-3.5-turbo-instructopenrouter/pygmalionai/mythalion-13bopenrouter/mancer/weaveropenrouter/undi95/remm-slerp-l2-13bopenrouter/openai/gpt-3.5-turbo-0613
3.3 "Invalid Code"(60 个)
这是本份报告中数量最多的类别:模型输出了代码,但这些代码无法编译或在执行中出错。名单包括:
openrouter/mistralai/mistral-7b-instruct:freeopenrouter/codellama/codellama-70b-instructopenrouter/microsoft/wizardlm-2-7bopenrouter/google/palm-2-codechat-bisonopenrouter/open-orca/mistral-7b-openorcaopenrouter/google/palm-2-chat-bisonopenrouter/perplexity/pplx-7b-chatopenrouter/01-ai/yi-34b-chatopenrouter/nousresearch/nous-hermes-2-mistral-7b-dpoopenrouter/anthropic/claude-3-haiku:betaopenrouter/undi95/toppy-m-7bopenrouter/huggingfaceh4/zephyr-7b-beta:freeopenrouter/xwin-lm/xwin-lm-70bopenrouter/01-ai/yi-6bopenrouter/undi95/toppy-m-7b:nitroopenrouter/openai/gpt-3.5-turbo-16kopenrouter/huggingfaceh4/zephyr-7b-betaopenrouter/rwkv/rwkv-5-world-3bopenrouter/cohere/command-r-plusopenrouter/anthropic/claude-2.0openrouter/google/gemini-pro-visionopenrouter/sao10k/fimbulvetr-11b-v2openrouter/sophosympatheia/midnight-rose-70bopenrouter/alpindale/goliath-120bopenrouter/perplexity/sonar-medium-onlineopenrouter/openchat/openchat-7bopenrouter/mistralai/mixtral-8x7bopenrouter/meta-llama/llama-3-8b-instructopenrouter/austism/chronos-hermes-13bopenrouter/mistralai/mistral-largeopenrouter/mistralai/mixtral-8x22bopenrouter/anthropic/claude-1.2openrouter/meta-llama/llama-2-13b-chatopenrouter/nousresearch/nous-capybara-34bopenrouter/openrouter/cinematika-7bopenrouter/perplexity/pplx-7b-onlineopenrouter/cohere/commandopenrouter/anthropic/claude-instant-1.1openrouter/teknium/openhermes-2-mistral-7bopenrouter/mistralai/mixtral-8x7b-instruct:nitroopenrouter/nousresearch/nous-hermes-2-mixtral-8x7b-sftopenrouter/perplexity/sonar-small-onlineopenrouter/cohere/command-ropenrouter/togethercomputer/stripedhyena-nous-7bopenrouter/google/gemma-7b-it:nitroopenrouter/nousresearch/nous-hermes-yi-34bopenrouter/nousresearch/nous-hermes-2-mixtral-8x7b-dpoopenrouter/recursal/rwkv-5-3b-ai-townopenrouter/meta-llama/llama-3-8b-instruct:nitroopenrouter/perplexity/pplx-70b-chatopenrouter/fireworks/firellava-13bopenrouter/jondurbin/airoboros-l2-70bopenrouter/google/gemma-7b-it:freeopenrouter/anthropic/claude-2.0:betaopenrouter/google/palm-2-codechat-bison-32kopenrouter/google/gemma-7b-itopenrouter/recursal/eagle-7bopenrouter/perplexity/sonar-small-chatopenrouter/google/palm-2-chat-bison-32k
3.4 "Executable Code"(1 个)
该类别下模型生成的代码在所有评估单元中都能成功执行(但未在所有单元上达到覆盖率目标):
openrouter/mistralai/mistral-7b-instruct
3.5 "Statement Coverage Reached"(26 个)
该类别下模型生成的测试代码在全部评估单元中都实现了 100% 语句覆盖率。这是本次快照中能力最扎实的中坚梯队,名单包括:
openrouter/anthropic/claude-2.1:betaopenrouter/openai/gpt-4-32kopenrouter/microsoft/wizardlm-2-8x22b:nitroopenrouter/anthropic/claude-3-sonnetopenrouter/openai/gpt-3.5-turbo-0125openrouter/lizpreciatior/lzlv-70b-fp16-hfopenrouter/databricks/dbrx-instructopenrouter/meta-llama/llama-2-70b-chat:nitroopenrouter/openai/gpt-4-1106-previewopenrouter/mistralai/mistral-mediumopenrouter/mistralai/mixtral-8x7b-instructopenrouter/phind/phind-codellama-34bopenrouter/perplexity/sonar-medium-chatopenrouter/anthropic/claude-3-opusopenrouter/anthropic/claude-1openrouter/anthropic/claude-2.1openrouter/mistralai/mistral-smallopenrouter/meta-llama/llama-3-70b-instruct:nitroopenrouter/anthropic/claude-3-opus:betaopenrouter/gryphe/mythomax-l2-13bopenrouter/microsoft/wizardlm-2-8x22bopenrouter/anthropic/claude-3-sonnet:betaopenrouter/anthropic/claude-3-haikuopenrouter/mistralai/mixtral-8x22b-instructopenrouter/meta-llama/llama-3-70b-instructopenrouter/meta-llama/llama-2-70b-chatopenrouter/huggingfaceh4/zephyr-orpo-141b-a35b
3.6 "No Excess Response"(12 个)
这是最高类别:模型不仅在所有单元上达到覆盖率,且响应中没有超出请求的额外内容(例如没有附带解释文字、注释或多余的测试用例)。名单包括:
openrouter/openai/gpt-4-turboopenrouter/openai/gpt-3.5-turboopenrouter/google/gemini-pro-1.5symflower/symbolic-executionopenrouter/openai/gpt-4-turbo-previewopenrouter/openai/gpt-4-32k-0314openrouter/openai/gpt-4openrouter/openai/gpt-3.5-turbo-0301openrouter/openai/gpt-4-vision-previewopenrouter/openai/gpt-4-0314openrouter/anthropic/claude-instant-1.2openrouter/openrouter/auto
从名单中可以读出的信息
- OpenAI 系列几乎垄断了最高类别:GPT-4 家族的多个版本(
gpt-4、gpt-4-turbo、gpt-4-32k-0314、gpt-4-0314等)以及较新的gpt-3.5-turbo都稳定产出"覆盖率达标且无多余输出"的测试代码; - 同一模型的不同快照差异显著:例如
mistral-7b-instruct的:free/:nitro变体落在 "Invalid Code",而无后缀版本却进入 "Executable Code";gpt-3.5-turbo-0125达到覆盖率而gpt-3.5-turbo-1106未产出代码。这与报告开头的提醒一致——LLM 具有非确定性,结果只是"当前快照"; - 许多 7B-8B 量级的开源模型(Yi、Gemma、Llama-3-8B 等)落在 "Invalid Code",说明为空白函数编写可编译且 100% 覆盖的测试,本身就是一个对语言理解与工程规范要求很高的任务。
四、评分机制:积分权重与设计动机
分类之外,报告同级目录中的 evaluation.csv 记录了每个评估单元的数值得分。这些得分由 assessment.go 中的注册权重决定,与框架 README 中声明的奖励规则一致:
| 指标 | 权重 | 说明 |
|---|---|---|
response-no-error | +1 | 响应未遇到错误 |
response-not-empty | +1 | 响应非空 |
response-with-code | +1 | 响应包含源代码 |
files-executed | +1 | 源码文件成功执行 |
coverage | +10 | 每达成一个覆盖率目标计 10 分(write-test任务中每达成一个代码覆盖对象) |
tests-passing | +10 | 每个通过的测试计 10 分(code-repair/transpile任务中使用) |
response-no-excess | +1 | 响应没有超出请求的额外内容 |
其中两个高权重指标(coverage与tests-passing)分别在两类任务中互相禁用:在"测试生成"任务中禁用tests-passing(防止模型靠堆砌任意测试用例刷分),在"代码修复/转译"任务中禁用coverage(防止模型靠添加无关语句刷覆盖率)。这一设计在 README 的 Reward Points 一节有明确说明。
可以对照 CSV 中实际的计分逻辑:例如openrouter/anthropic/claude-1.2,java,java/plain一行的score=6,对应files-executed=1 + response-no-error=1 + response-no-excess=1 + response-not-empty=1 + response-with-code=1 + coverage-statement=1,即六个维度各得 1 分(本版 v0.4.0 快照中覆盖率按 1 分计)。而 v0.4.0 报告目录的 README 特别注明:官方博客发布时把"达成 100% 代码覆盖率"的权重从 1 调整为 10 分,这也解释了不同版本间 score 口径的差异。
从源码结构看,
coverage-statement与 README 中statement-coverage-reached对应;AssessmentKeyCoverage的注册权重为 10,而 v0.4.0 快照 CSV 中覆盖率按 1 计,二者差异正是 v0.4.0 目录 README 所提到的"结果计算权重调整"。
五、评估任务背景:测试生成基准
理解这份报告的价值,需要回到它背后的评估任务。v0.4.0 阶段框架聚焦于Test Generation(测试生成)任务:给定一段源代码,要求模型为其编写测试套件,测试必须可编译且达到 100% 语句覆盖率,且响应中不得包含多余内容。在 README.md 中,作者解释了这个任务的设计动机:测试生成的结果容易自动校验(编译 + 覆盖率),而"只有真正理解源代码的模型才能写出达标测试",因此该任务隐式衡量的是模型的语言理解能力。
本份报告涉及的评估单元为 Go 与 Java 两种语言的plain仓库用例(从 CSV 中可以确认,所有行的repository字段均为golang/plain与java/plain),其对应的测试数据位于 testdata/golang/plain 与 testdata/java/plain。plain用例的特点是包含一个近乎空白的函数(如 Go 的func plain() { return }),意在考验模型能否为空函数写出"能编译、有覆盖、不啰嗦"的测试——README 指出,即使是这样一个空函数,也有大量 LLM 无法完成任务,这正是建立代码生成基准的必要性所在。
六、如何复现与深入分析
如果你想基于本仓库复现或扩展此类评估,可以按以下路径操作:
- 查看全部历史快照:本报告属于 docs/reports/v0.4.0 下的第 5 个子目录(另有 1~4 号快照),目录根部还保留有汇总后的 models-summed.csv、golang-summed.csv 与 java-summed.csv,可用于跨语言对比与多快照一致性分析;
- 对比后续版本:仓库中还保留了 v0.5.0(含
codeqwen、deepseek-coder、gpt-4o等模型的分模型报告目录)与 v0.6(结构化 CSV 报告集,含按任务/按语言的多个维度)的评估结果,可以观察分类体系与模型梯队随版本演进的变化; - 自行运行评估:按 README.md 的 Usage 章节,安装 Go 工具链后执行
go install安装eval-dev-quality二进制,通过PROVIDER_TOKEN环境变量配置 OpenRouter 等推理服务商密钥,然后运行eval-dev-quality evaluate即可生成本报告同款产物(evaluation.csv与 Markdown 报告);框架默认不提供沙箱,README 明确建议通过--runtime docker在隔离环境执行模型生成的代码; - 限制任务范围:README 还说明,可通过仓库根目录的
repository.json配置文件(如 testdata/golang/plain/repository.json)指定该仓库要运行的任务列表,未配置时默认运行全部任务。
七、解读结果的注意事项
报告开头引用了这样一句提醒:"Keep in mind that LLMs are nondeterministic. The following results just reflect a current snapshot."(LLM 具有非确定性,以下结果只是当前快照)。结合 README 的 Results 一节,解读这份报告时应把握三点:
- 结果可复现性有限:同一次评估中的多个快照(本目录下的 1~5 号)之间,部分模型类别会上下浮动,这与采样温度、端点负载等随机因素有关,单次快照不适合作为跨模型的最终裁决;
- "最高分"不等于"最合适":实际选型还需考虑计算资源、云端调用成本、权重是否开源等额外因素——框架作者明确表示"不存在完美总冠军,只有特定场景下的合适模型";
- 分类反映的是"一致达标"能力:由于类别判定要求模型在所有评估单元上持续达标,一个模型只要在一个语言用例上失手,就会被降级,因此 "Statement Coverage Reached" 及以上类别代表的是跨语言稳定性,而非单点峰值能力。
结语
这份由 DevQualityEval v0.4.0 自动生成的评估报告,通过"响应错误 → 无代码 → 无效代码 → 可执行代码 → 覆盖率达标 → 无多余输出"的分层分类,将 140 余个代码生成模型的真实能力做了一次快照式的横向体检。结合仓库中的 category.go 判定逻辑、assessment.go 评分权重、markdown.go 报告生成器与 evaluation.csv 明细数据,读者既可以读懂每一类模型名单背后的技术含义,也可以以此为模板,在自己的环境里复现一套可量化、可追踪的代码生成质量评估流程。
【免费下载链接】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),仅供参考