拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Qwen3-Coder 实战:使用 CodeArena 基准评估与对齐代码大模型的人类偏好表现

Qwen3-Coder 实战使用 CodeArena 基准评估与对齐代码大模型的人类偏好表现【免费下载链接】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导读CodeArena 是一个人工精选的代码生成评测基准用于弥合模型生成结果与人类偏好之间的差距。本文以 Qwen3-Coder 项目仓库内的 CodeArena 评测模块 为主线完整讲解数据集结构、获取方式、端到端评估流水线vLLM 推理 LLM-as-a-Judge 双人博弈评分并结合仓库源码逐层剖析每个参数与脚本的作用。读完本文你将能够独立下载 CodeArena 数据集用 vLLM 对任意开源代码模型做批量推理并用 GPT-4 系列裁判模型得到可与基线模型对比的胜率/平局率报告。CodeArena 基准以人类偏好为核心的代码评测传统代码评测如 HumanEval、MBPP通常以通过率作为唯一指标难以反映真实开发场景中用户对代码质量的主观感受。CodeArena 的出发点正是填补这一空缺它是一个人工精选human-curated的基准用于模拟真实世界编程任务的复杂性与多样性。根据 CodeArena README 的描述该数据集包含397 个高质量样本覆盖 40 个类别与 40 种编程语言样本均从真实用户查询中精心筛选而来。这意味着每个样本都携带真实用户的提问意图而不是人工构造的算法题因此能更贴近实际编码助手的应用场景也常被用于后续的偏好对齐alignment工作。在 Qwen3-Coder 仓库中该基准的完整评估工具链位于 qwencoder-eval/instruct/CodeArena/包含推理脚本、裁判脚本、配置文件与分类映射表可直接复用于 Qwen3-Coder 系列模型及其他开源模型的横向对比。数据格式详解一条 CodeArena 样本长什么样原文档给出了一个validation集合的示例样本其结构如下为便于讲解做了截断展示{ id: 60670a8d9b1e39dd845fb1639d0d8b86, messages: [{role: user, content: move gradient chart to the right side\\n\\n CardContent...}], gpt-4-turbo-2024-04-09_response: CardContent..., difficulty: easy, programming_language: [JavaScript] }各字段含义如下字段含义id样本唯一标识messages多轮对话消息role/content结构通常包含一段真实用户查询其中可能内嵌代码片段示例中是一段 React/JSX 的CardContent组件代码gpt-4-turbo-2024-04-09_response由 GPT-4-Turbo2024-04-09 版本生成的参考答案作为评测时的基线baseline响应difficulty难度等级示例为easyprogramming_language样本涉及的编程语言列表示例为[JavaScript]需要注意的是从 judge_models.py 的load_data实现可以看到评测阶段会将每条样本的messages[0][content]提取为question将gpt-4-turbo-2024-04-09_response作为默认的基线答案字段--baseline_name的默认值正是gpt-4-turbo-2024-04-09。换句话说每个样本都天然具备问题 参考回答对为后续的成对pairwise评判提供了基础。获取数据集原文档推荐通过 Git LFS 克隆数据集仓库git lfs install git clone codearena-dataset-repo-url克隆完成后进入数据集目录cd codearena-clone-dir数据集以 JSONL 格式提供评测脚本默认读取./data/CodeArena_v1.jsonl路径可在运行时通过INPUT_PATH覆盖。克隆后的数据集目录中应包含data/子目录评测工具链脚本默认在该目录下执行见 eval_arena.sh 中的cd ./code_arena;指令执行前请将该路径替换为你实际的数据集目录。端到端评估流水线一条命令完成推理与打分原文档给出了一键评估的命令cd ./code_arena; MODEL_DIRQwen2.5-Coder-32B INPUT_PATH./data/CodeArena_v1.jsonl OUTPUT_PATH./Qwen2.5-Coder-32B/results.jsonl TP1 MAX_LEN16384 CHAT_TEMPLATEauto bash eval_arena.sh ${INPUT_PATH} ${OUTPUT_PATH} ${MODEL_DIR} ${TP} ${MAX_LEN} ${CHAT_TEMPLATE}该命令的本质是调用仓库内的 eval_arena.sh其内部是一条三段式流水线每段都带有断点续跑保护若输出文件已存在则自动跳过第一阶段模型推理infer_vllm.pypython infer_vllm.py -model ${MODEL_DIR} -input_path ${INPUT_PATH} \ -output_path ${OUTPUT_PATH} -tensor_parallel_size ${TP} \ -model_max_len ${MAX_LEN} -chat_template ${CHAT_TEMPLATE}仅当${OUTPUT_PATH}不存在时执行输出问题 模型回答的 JSONL 文件。第二阶段LLM 裁判评判judgement_onlypython judge_models.py -input_path ${OUTPUT_PATH} -output_path ${EVAL_PATH} \ -workers 64 -judgement_only -setting_file ${CONFIG_FILE}其中EVAL_PATH${OUTPUT_PATH}.judge。此阶段调用 GPT-4 系列模型对模型回答 vs 基线回答进行成对打分结果写入${OUTPUT_PATH}.judge。第三阶段结果聚合evaluation_onlypython judge_models.py -input_path ${OUTPUT_PATH} -output_path ${EVAL_PATH} \ -evaluation_only -setting_file ${CONFIG_FILE}读取评判结果输出${OUTPUT_PATH}.judge.metric其中包含总体得分、胜率、平局率以及按任务类型细分的报告。参数一览eval_arena.sh共接收 7 个位置参数前 6 个有默认值回退见 eval_arena.sh参数位置默认值说明INPUT_PATH1空字符串输入数据集 JSONL 路径OUTPUT_PATH2空字符串推理结果输出路径MODEL_DIR3空字符串待评估模型路径本地目录或 HF 模型名TP41vLLM 张量并行大小MAX_LEN516384脚本中注释示例为 8192模型最大生成长度CHAT_TEMPLATE6auto对话模板策略取值auto或codellamaCONFIG_FILE7./utils/judge_config.yaml裁判模型配置文件仓库中另附 eval_arena_models.sh 作为批量评估的示例模板可直接修改其中变量后复用。推理阶段源码剖析infer_vllm.pyinfer_vllm.py 负责把数据集中的messages转换成模型输入并批量生成回答其关键实现细节如下命令行参数parse_args参数默认值说明-model空模型路径-input_path./CodeArena_v1.jsonl输入数据-output_path./results/yi-lightning/results.jsonl输出数据-model_max_len8192 * 2 16384最大生成长度-chat_templateauto可选codellama对话模板-tensor_parallel_size1张量并行大小推理流程数据加载通过utils.read_jsonl_file读取全部样本。API 模型分支若模型名为yi-lightning则走 OpenAI 兼容的 HTTP API 查询api_query函数逐条调用并填充response字段。本地模型分支默认用transformers.AutoTokenizer.from_pretrained(model, trust_remote_codeTrue)加载分词器若 tokenizer 自带model_max_length会取参数值与 tokenizer 值中的较小者作为实际最大长度避免生成越界对话模板处理chat_templateauto时调用tokenizer.apply_chat_template(messages, add_generation_promptTrue, tokenizeFalse)chat_templatecodellama时则手动拼接s[INST] SYS.../SYS\n\n{instruction} [/INST]形式的 CodeLlama 模板构造vllm.SamplingParams(temperature0.0, top_p0.95, max_tokensmodel_max_len)默认采用贪心解码temperature0保证评估可复现初始化vllm.LLM(model..., tensor_parallel_size..., worker_use_rayTrue, trust_remote_codeTrue, max_model_len...)进行批量生成每个样本补充model与response字段后写入输出 JSONL。从实现看模型回答默认以 temperature0 贪心生成这与公平对比模型能力的评测诉求一致如需调整采样参数可修改infer_vllm.py中的SamplingParams。LLM-as-a-Judge评判阶段源码剖析裁判配置judge_config.yaml原文档未展开配置文件但 utils/judge_config.yaml 是评判阶段的核心配置其设计明显继承自 Arena Hard 的评判范式name: judgment config file for Arena Hard bench_name: arena-hard-v0.1 judge_model: gpt-4-1106-preview reference: False ref_model: null baseline: True baseline_model: gpt-4-0314 pairwise: True temperature: 0 max_tokens: 4096 regex_pattern: \[\[([AB])\]\] number_of_judgment_attempts: 2 system_prompt: Please act as an impartial judge and evaluate the quality of the responses... prompt_template: [|User Prompt|\n{question_1}\n\n|The Start of Assistant As Answer|\n{answer_1}\n|The End of Assistant As Answer|\n\n|The Start of Assistant Bs Answer|\n{answer_2}\n|The End of Assistant Bs Answer|] model_list: - gpt-3.5-turbo-0125关键配置项含义配置项值作用judge_modelgpt-4-1106-preview裁判模型实际调用时由utils.call_gpt4o指定模型见下文baseline/baseline_modelTrue/gpt-4-0314是否引入基线模型参与成对对比pairwiseTrue采用成对两两对比评判而非单点打分regex_pattern\[\[([AB])\]\]从裁判输出中解析最终结论的正则表达式number_of_judgment_attempts2裁判回答不满足格式要求时的重试次数上限system_prompt见文件裁判的系统提示词要求裁判先给出自己的答案再对比两个回答的 helpful/relevant/concise 等维度最后输出形如[[AB]]的结论prompt_template单元素列表组装用户问题 A 回答 B 回答的提示词模板评判流程judge_models.pyjudge_models.py 是整个评测的计分大脑核心逻辑如下1. 双人博弈start_judgement每个样本进行num_games 2局评判两局中 A/B 的位置会互换一次if game % 2 1: answer, baseline baseline, answer以消除位置偏差。每局按prompt_template组装提示词将question、baseline与answer填入占位符然后调用 OpenAI 接口让裁判模型打分。裁判调用参数见源码openai_args { model: gpt-4o, # 实际裁判模型 temperature: 0.2, max_tokens: 16384, messages: conv, }2. 结论解析get_score使用配置中的regex_pattern\[\[([AB])\]\]从裁判文本中提取形如AB、AB、AB、BA、BA的标签。若未匹配到任何标签会进入重试循环上限为number_of_judgment_attempts并把请继续评判并输出最终结论作为追加指令再问一次。3. 多进程加速通过utils.multi_tasks_from_objs以-workers 64并行发起评判请求每个 worker 将结果写入独立的${output_path}.worker-{id}文件随后合并。4. 缓存与断点续跑load_dataload_cached_objs会扫描输出目录下所有以结果文件名为前缀的 JSONL按样本id建立缓存已评判过的样本在重跑时直接跳过避免重复消耗 API 额度。同时问题长度超过 1024 词的样本会被过滤if len(obj[question][0].split()) 1024这是数据集本身的格式保护措施。计分规则get_scores打分采用宽松计分loose_score机制对同一样本的两局评判结果求和win 0记为胜、win 0记为平、win 0记为负最终输出score综合得分胜 2 分、平 1 分除以样本数归一化win_rate/tie_rate胜率与平局率main_classified_win_rate/sub_classified_win_rate按主/子分类统计的胜率见下一节。源码中还保留了score()AB 计 1 分与strict_score()仅AB计 1 分两种口径供研究对比使用。最终结果写入${OUTPUT_PATH}.judge.metric并同时输出 LaTeX 格式的分类胜率表*_latex字段方便直接粘贴进论文。按任务类型分类的报告tasktype_to_levels.jsonutils/tasktype_to_levels.json 是一份任务类型 → 主/子分类的映射表共 7478 行覆盖数百种任务标签例如software design patterns→ 主分类Development and Programming子分类Best Practices and Patternsdebugging→ 主分类Development and Programming子分类Code Debuggingapi integration→ 涉及Web, Mobile Development、File and Data Operations、API and Library Management等多个分类组合。在 judge_models.py 的calculate_classified_score中会先把数据样本meta.parsed.task_type字段中的连字符替换为空格并小写化wash_tag再查表取第一组(main_class, sub_class)最后按主分类与子分类分别聚合胜率与平局率格式为胜率/平局率均乘以 100 保留一位小数。这使得最终报告不仅能回答模型整体强不强还能回答模型在哪些任务类别上强/弱。在 Qwen3-Coder 仓库中运行 CodeArena 评估Qwen3-Coder 仓库已将整套工具链收纳在 qwencoder-eval/instruct/CodeArena/ 目录qwencoder-eval/instruct/CodeArena/ ├── README.md # 数据集说明与评估命令 ├── eval_arena.sh # 一键流水线脚本 ├── eval_arena_models.sh # 批量评估示例 ├── infer_vllm.py # vLLM 推理脚本 ├── judge_models.py # LLM 裁判与计分脚本 └── utils/ ├── judge_config.yaml # 裁判配置 ├── tasktype_to_levels.json # 任务类型分类映射 └── utils.py # 通用工具JSONL 读写、多进程等运行前需要准备Python 环境安装vllm、transformers、openai、jsonlines、numpy、pyyaml等依赖参照 qwencoder-eval/instruct/README.md 的 conda 环境创建方式。数据集按上文方式克隆 CodeArena 数据集或准备一个字段格式完全一致的 JSONL 文件messages、id、gpt-4-turbo-2024-04-09_response为必需字段。OpenAI API 密钥评判阶段依赖 OpenAI 兼容接口utils.call_gpt4o中设置openai.api_key请确保网络与密钥可用。修改路径将eval_arena.sh/eval_arena_models.sh中的cd ./code_arena;与MODEL_DIR等变量替换为你的实际路径然后执行bash eval_arena.sh ./data/CodeArena_v1.jsonl ./results/your-model.jsonl /path/to/your-model 1 16384 auto全部跑完后在./results/your-model.jsonl.judge.metric中即可看到该模型在 CodeArena 上的总体得分、胜率/平局率以及按主/子分类细分的胜率报告——这套指标可以直接用于对比 Qwen3-Coder 系列模型与其他开源模型在人类偏好维度上的表现差距。引用规范若在学术工作中使用 CodeArena 数据集请按原文档给出的 BibTeX 引用其原始论文《Evaluating and Aligning CodeLLMs on Human Preference》arXiv 2412.05210article{yang2024evaluating, title{Evaluating and Aligning CodeLLMs on Human Preference}, author{Yang, Jian and Yang, Jiaxi and Jin, Ke and Miao, Yibo and Zhang, Lei and Yang, Liqun and Cui, Zeyu and Zhang, Yichang and Hui, Binyuan and Lin, Junyang}, journal{arXiv preprint arXiv:2412.05210}, year{2024} }小结CodeArena 为代码大模型评测提供了一条以人类偏好为准绳的补充路径397 个覆盖 40 类别、40 语言的真实用户样本 GPT-4-Turbo 参考回答构成数据基础eval_arena.sh串联起 vLLM 推理、LLM-as-a-Judge 双人博弈评判与分类统计三个阶段。通过本文对 eval_arena.sh、infer_vllm.py、judge_models.py 与 judge_config.yaml 的源码级解读你可以完全掌握该基准的机制与调参方法并将其直接应用到 Qwen3-Coder 或任何开源代码模型的横向评测与偏好对齐研究中。【免费下载链接】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),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门