资讯动态

Qwen3-Coder 评测专题:CRUXEval 数据集构建全流程与过滤机制深度解析

发布时间:2026/9/14 17:28:30 来源:尧图企业网站定制
Qwen3-Coder 评测专题CRUXEval 数据集构建全流程与过滤机制深度解析【免费下载链接】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本文以 qwencoder-eval/instruct/cruxeval/data/README.md 为核心骨架结合 Qwen3-Coder 仓库中qwencoder-eval/instruct/cruxeval与qwencoder-eval/base/benchmarks/cruxeval两套评测工程系统解析 CRUXEval 从数据生成、三道过滤到最终 800 样本落地的完整构建管线并给出过滤脚本的字节码级实现原理、两种评测任务输入预测/输出预测的推理与计分方式。读完本文你可以完整复现 CRUXEval 的构造思路理解其样本形态与过滤标准并直接复用仓库内的推理、评估脚本对代码模型开展评测。CRUXEval 在 Qwen3-Coder 评测体系中的定位CRUXEvalCode Reasoning, Understanding and eXecution Evaluation是一套专门考察模型代码理解与执行能力的基准它不要求模型从头写代码而是给定一段 Python 函数f要求模型完成两类推理任务——由输出反推输入input prediction或由输入推演出输出output prediction。在 Qwen3-Coder 仓库中该基准以近乎一致的形态被同时收纳于评测工程的两个分支qwencoder-eval/instruct/cruxeval面向指令微调模型含完整的数据生成、过滤脚本、推理inference/与评估evaluation/模块qwencoder-eval/base/benchmarks/cruxeval面向 Base 模型除推理与评估模块外还额外提供 openai/ 的 API 推理路径评测结果汇总于 qwencoder-eval/outptus/qwen2.5-coder 下的1.5b-base、7b-base等目录。两者共享同一份核心数据与构建说明即本仓库中 data/README.md 所描述的构建流程。下面按该文档的三大环节Data Generation → Filtering → Dataset逐步展开。数据生成让 Code Llama 34B 产出函数 测试输入对生成思路CRUXEval 不依赖人工编写题目而是采用模型生成 严格过滤的流水线。第一步使用Code Llama 34B作为生成器向它给定一个 Python 标准库函数名如str.zfill要求它编写一个用到了该库函数的自定义 Python 函数f并为该函数配套5 个测试输入。由于目标函数来自标准库其行为完全确定、可执行、可验证为后续的自动化过滤与评测打好了基础而由模型自由发挥的包装函数则保证了样本的多样性——每个样本实际考察的是模型对一段全新代码的执行与推理能力而非对某道题的背诵。69 个标准库函数种子按文档说明构建时从 Python 标准库中选取了69 个公开方法作为生成种子分布为来源数量str字符串方法如split、capitalize、rindex、rpartition、center47dict字典方法11list列表方法如pop、insert、remove、append、index11这 69 个方法由 generate_function_prompts.py 自动枚举产生脚本对dir(str)、dir(list)、dir(dict)过滤掉_开头的私有/魔术方法后得到全部候选并打印方法总数print(f{len(all_methods)} methods)与本仓库 data/README.md 记载的 69 个函数一一对应。生成 prompt 的构造与 few-shot 多样性generate_function_prompts.py 中的make_prompt(function, examples)负责组装每次调用的提示词先给出统一任务描述你将收到一个位于 [TASK] 与 [/TASK] 标签之间的函数名参照示例编写一个使用该函数的 Python 函数并给出 5 个测试输入随后拼接两个 few-shot 示例最后追加目标函数名与[PYTHON]开标记。few-shot 示例定义在 diverse_fewshot_examples.py 中其多样性体现在两点覆盖不同方法族string_1~string_5演示字符串类方法str.split、str.capitalize、str.rindex、str.rpartition、str.centerlist_1~list_5演示列表类方法list.pop、list.insert、list.remove、list.append、list.index组合轮换每个生成任务都会从 string 示例与 list 示例中各取一个进行组合并通过嵌套循环产生大量不同配比对list/dict方法还会额外重复两轮进一步扰动示例分布防止模型过度拟合单一模板。示例统一采用[TASK]函数名、[PYTHON]函数实现、[TEST]5 条assert f(...) ??待补全测试三段的标记式格式。以list.pop示例为例[TASK] list.pop [/TASK] [PYTHON] def f(names, num): queue names while len(queue) 1: for _ in range(num): queue.append(queue.pop(0)) queue.pop(0) return queue.pop() [/PYTHON] [TEST] assert f([aiwn, xke, mpwiy], 2) ?? assert f([y, z, cc, 2, 5, ., zksdfjn], 7) ?? ... [/TEST]生成的全部 prompt 被写入 data_generating_prompt.jsonl每条记录包含text完整提示词与method目标方法名两个字段本仓库中共2040 条。生成结果的样本形态Code Llama 34B 依据上述 prompt 产出大量(函数, 输入, 输出)三元组最终入库格式以 cruxeval.jsonl 为准每行一条 JSON 记录包含四个字段字段含义示例值code待执行的函数定义def f(nums):\n output []\n ...input函数输入可含多个参数用逗号分隔[1, 1, 3, 1, 3, 1]output对应输出[(4, 1), (4, 1), (4, 1), (4, 1), (2, 3), (2, 3)]id样本编号sample_0其中id从sample_0起连续编号该编号约定同时被推理端与评估端复用见下文两种评测用法是整个评测流程的数据契约。过滤三道关卡筛掉不合适的样本大模型生成的样本良莠不齐直接入库会引入大量不可执行、不可控或过于简单的噪声。因此构建流程的核心环节是过滤只保留短小、低计算/内存开销、一个熟练程序员无需额外记忆即可在一分钟内完成的问题。过滤脚本位于 filter/analyze_ops.py按以下三个维度逐层把关编译期过滤静态检查函数定义必须使用其全部入参避免出现无效参数导致的退化题代码长度控制在75 ~ 300 字符之间保证题目短小无语法错误末行必须是规范断言即assert f(input) output形式。末行断言由check_assert()基于ast语法树校验约束非常严格源码见 analyze_ops.py断言必须是f(...) 字面量的比较表达式比较对象只能是一个且调用方必须是名为f的函数输出必须是字面量ast.Constant、list、tuple、set、dict、UnaryOp等不得含未化简表达式输入参数中不得再次调用f防止递归或自引用式怪题。运行期过滤动态执行监控过滤脚本会真正执行候选代码并在执行过程中通过 Python 的sys.settrace钩子逐条监控字节码操作详见 filter_trace数值运算禁止浮点运算float操作数、真除法BINARY_TRUE_DIVIDE、exp其余整数运算要求至少一个操作数 ≤ 3幂运算BINARY_POWER要求底数 ≤ 1序列运算字符串/列表操作要求至少一个操作数的长度 ≤ 3性能约束整体必须在2 秒内运行完通过signal.SIGALRM定时器实现且单次执行追踪的字节码步数不超过MAX_STEPS 100000异常约束执行过程中不得出现未捕获异常。这里操作数规模限制的意图很清晰把候选题的数值与序列规模压到极小既保证题目无需额外记忆/心算即可解决也让运行时开销可控。值得说明的是sys.settrace与字节码追踪依赖于具体 CPython 版本因此 analyze_ops.py 在文件头显式断言运行环境必须满足3.7 Python 3.10并注明实际过滤在 Python 3.9 上完成——字节码格式在不同版本间并不稳定。不良代码过滤语义约束最后一道防线是尽力剔除有害/不确定/有副作用的代码代码中不允许出现任何 import如os、random源码层面对IMPORT_NAME操作码直接计数判负并预先禁止import、open(、exec(、eval(、globals()、locals()等子串函数必须是确定性的禁止random、set无序遍历、hash()等不确定行为不得有副作用禁止input(、__builtins__/__builtin__访问等。这些禁词以forbid列表的形式硬编码在 annotate() 中并在执行前对源码做字符串级预检与字节码级检查形成先静态、后动态的双保险。过滤机制的底层实现操作数栈窥探运行期过滤之所以能精确感知当前操作的操作数大小依赖的是 filter/get_stack.py 提供的OpStack类它利用ctypes按 CPython 内部PyFrameObject的内存布局f_valuestack、f_stacktop字段直接读出当前帧的求值栈value stack从而在BINARY_*/INPLACE_*等操作码命中时拿到两个操作数的真实对象再对其类型与数值/长度做判定源码见 filter_trace 中type(o1) in NUM_TYPES、abs(o1) 3、len(o1) 3等检查。这也再次印证了 3.9 专用版的必要性——帧内存布局同样随 CPython 版本变化。抽样定稿800 样本全部候选通过上述过滤后最终随机选取 800 个样本构成正式基准。文档指出这一规模的考量是既足够小以便于快速跑完又足够大以便在不同模型之间稳定地拉开性能差距。同时该构建方法具备明显的可扩展性——随着模型能力提升可以按同样的生成 过滤流程制造更困难、考察不同执行维度的后续版本基准。最终数据集过滤完成的正式数据集即 cruxeval.jsonl共 800 行每条记录含code、input、output、id四个字段字段语义见上文表格。该数据集同时发布在 HuggingFace Datasets 平台cruxeval-org/cruxeval仓库内的评估脚本默认读取本地data/cruxeval.jsonl见 evaluate_generations.py 中对data/cruxeval.jsonl的引用因此本地克隆仓库即可离线完成整套评测不依赖外部下载。数据集的两种评测用法从仓库推理/评估源码看虽然数据构建文档本身只讲到生成 → 过滤 → 入库但仓库中的推理与评估模块完整揭示了这批数据的实际考察方式可补全数据集的完整生命周期。从 inference/prompts.py 可以看到CRUXEval 下设两个任务、各含直接与 CoT 两种模式共四种 prompt 模板任务模式Prompt 模板考察内容output_prediction直接make_direct_output_prompt给定code与输入补全assert f(input) ??的输出output_predictionCoTmake_cot_output_prompt同上但要求先逐步执行代码再给出[ANSWER]input_prediction直接make_direct_input_prompt给定code与输出反推一个可行输入补全assert f(??) outputinput_predictionCoTmake_cot_input_prompt同上但要求先思考推理过程再给出[ANSWER]四种模板均内置少量人工标注的 few-shot 示例并要求模型把答案以[ANSWER]/[/ANSWER]标签包裹、以完整断言形式输出便于后续自动抽取。推理入口为 inference/main.py它基于vLLM加载模型tensor_parallel_size控制张量并行度、gpu_memory_utilization0.9、max_model_len8192逐任务生成答案并落盘。配套的一键脚本 test.sh 展示了完整调用范式python inference/main.py \ --model ${MODEL_DIR} \ --trust_remote_code \ --tasks ${task} \ --batch_size 1 \ --save_generations_path ${SAVE_GENERATIONS_PATH} \ --save_generations \ --tensor_parallel_size ${TP} \ ${cot:--cot} python evaluation/evaluate_generations.py \ --generations_path ${SAVE_GENERATIONS_PATH} \ --scored_results_path ${SCORED_RESULTS_PATH} \ --mode ${mode}评估侧由 evaluation/evaluate_generations.py 完成按sample_i键名对齐 800 个样本对每条生成结果执行assert {output} {generation}式的真值校验utils_general.py 中的evaluate_score并额外做语义清洗——input 模式下丢弃不含f(的生成、output 模式下丢弃直接复读给定输入的生成避免模型抄题得分。最终统计pass1 与 pass5两项指标passk 采用标准无放回估计公式见 utils_general.py结果落盘为completion_scored.json与results.json。Base 模型分支还提供 evaluate_all_predictions_input.sh / evaluate_all_predictions_output.sh 批量评估脚本历史评测结果可参考 qwencoder-eval/outptus/qwen2.5-coder/1.5b-base/cruxeval 与7b-base对应目录。小结一条可复用的可控数据生成管线回顾 data/README.md 所描述的完整流程CRUXEval 的构建体现了三条可复用的工程经验以标准库为锚点69 个标准库方法47str 11dict 11list充当确定性种子让模型在受限语义空间内发挥多样性同时天然保证结果可执行、可验证生成即过滤用 ast 静态校验、sys.settrace字节码追踪、SIGALRM超时等手段把运行期资源占用、操作数规模、确定性、无副作用等质量要求编码为自动化检查最终只保留 800 个短小、快速、可心算的样本样本形态即评测契约(code, input, output, id)的四字段结构与sample_i编号贯穿生成、推理input/output 双向预测与评估pass1/pass5全链路任何接入该基准的模型评测脚本都可直接对齐复用。对于需要自建代码执行类评测集的团队本仓库的 generate_function_prompts.py、analyze_ops.py 与 get_stack.py 提供了可直接参考或改造的完整实现。【免费下载链接】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),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价