尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

OpenCompass 中 APPS 代码生成基准的接入与评测实践:数据集结构、难度过滤与 pass@k 评测原理

发布时间:2026/9/29 5:36:11

资讯中心
01
ARTICLE

OpenCompass 中 APPS 代码生成基准的接入与评测实践:数据集结构、难度过滤与 pass@k 评测原理

OpenCompass 中 APPS 代码生成基准的接入与评测实践:数据集结构、难度过滤与 pass@k 评测原理
模型评测人工智能大模型AI 评测【免费下载链接】opencompassOpenCompass is an LLM evaluation platform, supporting a wide range of models from OpenAI, Anthropic, Gemini, Qwen, GLM, DeepSeek, etc, across 100 datasets covering knowledge, reasoning, coding, science, language, long-context, and safety.项目地址https://gitcode.com/gh_mirrors/op/opencompass点击查看免费下载导读本文围绕 OpenCompass 仓库中 APPS 数据集文档 展开系统讲解 APPSAutomated Programming Progress Standard代码生成基准在 OpenCompass 中的数据集结构、难度过滤用法、完整评测配置生成式推理 代码执行验证 passk 指标以及底层执行沙箱原理。读者学完后将能够在 OpenCompass 中直接运行 APPS 与 apps_mini 的评测任务并能读懂APPSEvaluator的代码执行与评分逻辑为自己的代码模型做能力评估。APPS 基准简介APPS 是 Hendrycks 等人于 2021 年提出的代码生成基准共包含10000 道编程问题用于评估语言模型从自然语言规格说明生成代码的能力。题目来自竞赛编程社区覆盖从入门到竞赛的不同难度级别是目前代码生成评测体系中与 HumanEval、MBPP 并列的经典基准之一。在 OpenCompass 中APPS 的接入点主要有三处评测配置opencompass/configs/datasets/apps/含完整数据集apps与精简子集apps_mini的生成式评测配置数据集与评测器实现opencompass/datasets/apps.py包含APPSDataset、APPS_miniDataset、APPSEvaluator三个核心类通用代码比较工具opencompass/utils/code_execution.py提供类型感知的相等比较函数type_aware_equal。数据集结构完整数据集codeparrot/apps根据 README 中的描述codeparrot/apps的 HuggingFace 数据集结构如下DatasetDict({ train: Dataset({ features: [problem_id, question, solutions, input_output, difficulty, url, starter_code], num_rows: 5000 }) test: Dataset({ features: [problem_id, question, solutions, input_output, difficulty, url, starter_code], num_rows: 5000 }) })各字段含义字段含义problem_id题目唯一标识评测配置中作为output_column用于对齐预测与参考答案question自然语言题目描述solutions官方参考答案代码input_outputJSON 字符串包含测试用例的输入输出对可选fn_name指明函数名决定调用式/标准输入式评测difficulty难度标签introductory/interview/competitionurl题目来源链接starter_code提供给解题者的起始代码片段可为空精简子集apps_miniREADME 同时提供了apps_mini子集包含1500 道题按introductory、interview、competition三个难度1:1:1各 500 题比例划分适合做快速的模型能力抽检或迭代过程中的回归验证。难度过滤用法README 给出的官方用法支持按难度过滤直接向load_dataset传入difficulties参数即可。例如要获取最高难度的竞赛题ds load_dataset(codeparrot/apps, splittrain, difficulties[competition]) print(next(iter(ds))[question])如果希望组合多个难度如入门 面试可以传入难度列表difficulties[introductory, interview]。这一特性让研究者可以针对性地评估模型在不同难度层级上的代码生成能力例如单独考察竞赛级题目上的表现避免入门题的稀释效应。OpenCompass 中的数据集加载实现APPSDataset 与 APPS_miniDataset在 opencompass/datasets/apps.py 中两个数据集类均通过LOAD_DATASET.register_module()注册APPSDataset.load通过load_dataset(path)加载 HuggingFace 数据集APPS_miniDataset.load通过load_from_disk(path)从本地磁盘加载./data/apps_mini。两者的加载逻辑一致核心是对每条样本做starter 提示预处理读取starter_code为空则置None解析input_output的 JSON提取fn_name若input_output解析失败则fn_nameNone根据是否存在fn_name或starter_code拼装starter提示列两者都为空 → 追加\nUse Standard Input format标准输入式否则 → 追加\nUse Call-Based format调用式由于评测配置只使用test分割加载器最终只保留test分割并支持num_repeats参数对测试样本重复采样默认num_repeats1。这一步非常关键starter列会作为提示词的一部分注入到 prompt 中见下文APPS_infer_cfg让模型明确知道题目要求的是标准输入程序还是函数调用程序。评测配置详解当前生效配置apps_gen / apps_mini_genapps_gen.py 与 apps_mini_gen.py 通过read_base()分别继承 apps_gen_c7893a.py 与 apps_mini_gen_c7893a.py核心配置如下from opencompass.openicl.icl_prompt_template import PromptTemplate from opencompass.openicl.icl_retriever import ZeroRetriever from opencompass.openicl.icl_inferencer import GenInferencer from opencompass.datasets import APPSDataset, APPSEvaluator APPS_reader_cfg dict( input_columns[question, starter], output_columnproblem_id, train_splittest, ) APPS_infer_cfg dict( prompt_templatedict( typePromptTemplate, templatePlease write a python program to address the following QUESTION. Your ANSWER should be in a code block format like this: python # Write your code here . \nQUESTION:\n{question} {starter}\nANSWER:\n, ), retrieverdict(typeZeroRetriever), inferencerdict(typeGenInferencer, max_out_len512), ) APPS_eval_cfg dict( evaluatordict(typeAPPSEvaluator), pred_roleBOT, ) APPS_datasets [ dict( typeAPPSDataset, abbrapps, pathcodeparrot/apps, num_repeats1, reader_cfgAPPS_reader_cfg, infer_cfgAPPS_infer_cfg, eval_cfgAPPS_eval_cfg, ) ]配置中几个关键点配置项取值说明input_columns[question, starter]提示词模板中注入题目描述与预处理后的格式提示output_columnproblem_id评测阶段按题目 ID 聚合生成结果train_splittest直接使用测试分割进行评测retrieverZeroRetriever不做样例检索零样本生成inferencerGenInferencer, max_out_len512生成式推理输出上限 512 tokenevaluatorAPPSEvaluator代码执行式评测器pred_roleBOT模型扮演 BOT 角色配合对话模板提取生成内容apps_mini 的配置与 apps 完全一致区别仅在于typeAPPS_miniDataset、abbrapps_mini、path./data/apps_mini本地路径见 apps_mini_gen_c7893a.py。历史配置对比deprecated 版本配置目录中还保留了三个deprecated_apps_gen_*.py文件它们是早期版本可以看到评测方案的演进deprecated_apps_gen_5b4254.py仅注入question使用HumanEvalEvaluatorhumaneval_postprocess并把k[1, 10, 100]写在eval_cfg中——即早期复用 HumanEval 评测器deprecated_apps_gen_7fbb95.py引入 SYSTEM/HUMAN 双角色 prompt 模板deprecated_apps_gen_b4dee3.py使用最简模板{question}同样限定max_out_len512。当前生效配置相比旧版的关键改进是将评测器替换为专用的APPSEvaluator并新增starter列注入 Call-Based / Standard Input 格式提示评测流程更加贴合 APPS 原基准的执行逻辑。评测原理APPSEvaluator 的完整执行链路评测总流程APPSEvaluator见 opencompass/datasets/apps.py继承自BaseEvaluator评测链路为score() ├── post_process(pred) # 提取模型输出中的首个代码块 ├── 按 problem_id 聚合生成结果 ├── evaluate_generations() # 对每道题逐条执行生成代码 │ └── check_correctness() # 多进程 全局超时保护 │ └── run_test() # 真正的沙箱执行与用例比对 └── compute_metrics() # 计算 pass1 / pass10 / pass100生成结果后处理def post_process(self, text): if in text: blocks re.findall(r(.*?), text, re.DOTALL) if len(blocks) 0: text text.split()[1] # fall back to default strategy else: text blocks[0] # fetch the first code block if not text.startswith(\n): # starting with python text text[max(text.find(\n) 1, 0):] return text后处理规则若模型输出包含代码围栏优先提取第一个...代码块兼容python起始行若无完整围栏则退化为取第一个之后的文本。这与 prompt 模板中以代码块格式作答的要求一一对应。代码执行与沙箱保护check_correctness使用multiprocessing.Manager 独立Process执行单条生成超时timeout10s加上 1 秒缓冲后p.join(timeouttimeout1)仍存活则p.kill()并把该题所有用例标记为失败-1。这是全局超时用于兜底run_test内部signal.SIGALRM未覆盖到的极端情况。run_test内部则针对 APPS 的两种题型分别处理Call-Based调用式将生成代码与预置的常用库导入sys、itertools、collections、math、fractions、numpy等拼接后通过RuntimeModule.from_string动态编译若含class Solution则实例化否则直接用模块随后对每组输入调用method(*inputs)并比对输出Standard Input标准输入式将生成代码包装进def code():函数用call_method配合mock_open、sys.stdin补丁注入输入通过Capturing上下文捕获 stdout再做多轮输出比对。此外run_test在开头调用reliability_guard()禁用危险能力os.kill、os.system、os.remove、subprocess.Popen、shutil.rmtree等均被置为Nonebuiltins.exit/quit也被禁用faulthandler.disable()生效OMP_NUM_THREADS设为 1防止生成代码干扰宿主进程。需要强调的是其 docstring 明确指出这不是安全沙箱不可盲目执行不可信代码生产环境应放入独立隔离容器。输出比对策略标准输入式的比对非常宽容run_test依次尝试精确字符串相等含首尾空白剥离、按行拆分比对、转浮点后用np.allclose近似比较、以及集合set层面的无序比较等多达 6 轮策略以兼容模型输出与参考答案在空格、换行、数字精度、顺序上的细微差异。Call-Based 式比对则调用 code_execution.py 中的type_aware_equal该函数先做类型严格相等检查type(actual) is not type(expected)直接判 False避免模型返回对象伪造__eq__方法骗过比对对 list/tuple、Mapping、set/frozenset 递归做结构比较规避 Python 默认相等运算符可能带来的误判。passk 指标计算def estimate_pass_at_k(self, num_samples, num_correct, k): def estimator(n: int, c: int, k: int) - float: if n - c k: return 1.0 return 1.0 - np.prod(1.0 - k / np.arange(n - c 1, n 1)) ...compute_metrics默认计算k_list[1, 10, 100]采用标准无偏估计公式1 - C(n-c, k) / C(n, k)每道题只要有任一生成全部用例通过即计为正确最终以100 * mean(passk)形式输出同时通过detail字段返回每个problem_id的逐题 passk。这一公式与代码生成领域通行口径一致结果可直接与其他基准报告横向对比。评测结果参考README 中给出的 apps_mini 参考评测结果pass1OpenCompass 环境实测datasetmetricCodeLlama-7b-Pythoninternlm2-chat-1.8b-sft-hfinternlm2-chat-7b-sft-hfinternlm2-chat-20b-sft-hfapps_minipass11.30.77.19.3从表中可以直观看到模型参数规模1.8b → 7b → 20b与代码能力提升对 apps_mini pass1 的显著影响20B 规模 InternLM2 的 SFT 版本达到 9.3。如需与论文原始结果对照可参考 Code Llama 论文的 Table 3README 中给出了原始出处链接此处不再重复。如何在 OpenCompass 中运行准备数据apps 直接使用 HuggingFace 数据集codeparrot/apps配置中pathcodeparrot/appsapps_mini 需将数据放在本地./data/apps_mini见 apps_mini_gen_c7893a.py 中path./data/apps_mini。组合评测配置将APPS_datasets或APPS_mini_datasets与目标模型配置如 examples/ 下各eval_*.py所示合并构成完整datasets与models。启动评测在仓库根目录执行类似python run.py --models 模型配置 --datasets opencompass.configs.datasets.apps.apps_gen的命令OpenCompass 会按APPS_reader_cfg → APPS_infer_cfg → APPS_eval_cfg依次完成数据读取、零样本生成与代码执行评分最终在汇总报告中输出 pass1 / pass10 / pass100。引用按 README 提供的 BibTeXarticle{hendrycksapps2021, title{Measuring Coding Challenge Competence With APPS}, author{Dan Hendrycks and Steven Basart and Saurav Kadavath and Mantas Mazeika and Akul Arora and Ethan Guo and Collin Burns and Samir Puranik and Horace He and Dawn Song and Jacob Steinhardt}, journal{NeurIPS}, year{2021} }小结APPS 是评测代码生成模型的重要基准OpenCompass 为其提供了从数据集预处理starter 格式提示、生成式推理GenInferencer ZeroRetriever、代码执行验证Call-Based / Standard Input 双模式 多轮宽容比对 全局超时保护到 passk 指标计算的完整闭环。本文所涉配置与实现均可在 opencompass/configs/datasets/apps/ 与 opencompass/datasets/apps.py 中直接查阅读者可基于 apps_mini 快速验证评测链路再扩展到完整 apps 基准开展系统评估。赞分享模型评测人工智能大模型AI 评测【免费下载链接】opencompassOpenCompass is an LLM evaluation platform, supporting a wide range of models from OpenAI, Anthropic, Gemini, Qwen, GLM, DeepSeek, etc, across 100 datasets covering knowledge, reasoning, coding, science, language, long-context, and safety.项目地址https://gitcode.com/gh_mirrors/op/opencompass点击查看免费下载相关推荐OpenCompass 接入 TACO 算法代码生成评测数据集解析、配置与 passk 评估原理OpenCompass 接入 TACO 算法代码生成评测数据集解析、配置与 passk 评估原理 TACOTopics in Algorithmic CO模型评测人工智能大模型AI 评测OpenCompass 中 HumanEval 代码生成评估全指南配置、passk 原理与模型基准OpenCompass 中 HumanEval 代码生成评估全指南配置、passk 原理与模型基准 OpenCompass 内置了代码生成评测基准 Huma模型评测人工智能大模型AI 评测OpenCompass 中 LCBench2023 代码生成评测指南LeetCode 周赛题目的中英双语评测与 Passk 实现OpenCompass 中 LCBench2023 代码生成评测指南LeetCode 周赛题目的中英双语评测与 Passk 实现 LCBench2023 是模型评测人工智能大模型AI 评测上一篇Home Assistant 中 input_boolean.turn_off 动作详解在自动化里关闭开关辅助实体下一篇Repomix贡献者指南代码提交与PR流程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。