ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

OpenCompass 接入 TACO 算法代码生成评测:数据集解析、配置与 pass@k 评估原理

OpenCompass 接入 TACO 算法代码生成评测:数据集解析、配置与 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点击查看免费下载TACOTopics in Algorithmic COde generation dataset是一个聚焦算法代码生成的评测基准覆盖训练集 25,443 道题、测试集 1,000 道题全部来自真实编程竞赛场景。本文以 OpenCompass 仓库中的 TACO 配套文档 README.md 为核心结合其数据集实现 taco.py 与配置文件 taco_gen_c7893a.py、taco_levels_gen_411572.py 展开带你掌握 TACO 在 OpenCompass 中的接入方式、难度/技能筛选机制以及基于真实测试用例执行的 pass1/passk 评估原理可直接用于搭建算法代码生成模型评测流程。TACO 数据集概述与核心特点TACO 面向算法代码生成领域其设计初衷是提供更具挑战性的训练数据与评估基准。与仅要求实现预定义函数功能的常规代码生成数据集不同TACO 的题目来源于编程竞赛难度更高、更贴近真实编程场景重点考察模型在实战场景中的理解与推理能力。据数据集文档描述TACO 具备以下三个突出特点更大规模包含训练集25,443 道题与测试集1,000 道题是当时规模最大的代码生成数据集之一。更高质量每道题都配有多种解法答案答案集合规模最高达 1.55M可有效避免模型在训练时过拟合并保证评测结果的有效性。细粒度标签每道题带有任务主题task topics、算法algorithms、技能skills与难度difficulty等细粒度标签为代码生成模型的训练与评测提供更精确的参考。TACO 对应的学术引用见 README.mdarticle{li2023taco, title{TACO: Topics in Algorithmic COde generation dataset}, author{Rongao Li and Jie Fu and Bo-Wen Zhang and Tao Huang and Zhihong Sun and Chen Lyu and Guang Liu and Zhi Jin and Ge Li}, journal{arXiv preprint arXiv:2312.14852}, year{2023} }数据结构逐字段解析TACO 数据集在 Hugging Face 上以BAAI/TACO发布其结构为标准的DatasetDict包含train与test两个 split每个样本的字段如下DatasetDict({ train: Dataset({ features: [question, solutions, starter_code, input_output, difficulty, raw_tags, name, source, tags, skill_types, url, Expected Auxiliary Space, time_limit, date, picture_num, memory_limit, Expected Time Complexity], num_rows: 25443 }) test: Dataset({ features: [question, solutions, starter_code, input_output, difficulty, raw_tags, name, source, tags, skill_types, url, Expected Auxiliary Space, time_limit, date, picture_num, memory_limit, Expected Time Complexity], num_rows: 1000 }) })其中对评测流程最关键的几个字段是字段含义question题目文本含输入输出格式说明等solutions参考答案多解集合starter_code题目的起始代码片段可能是空字符串input_outputJSON 字符串内含inputs/outputs测试用例对以及可选的fn_name函数名difficulty难度标签取值为EASY/MEDIUM/MEDIUM_HARD/HARD/VERY_HARDskill_types技能标签如Sorting、Range queries、Dynamic programming等tags/raw_tags题目主题与算法标签name/source/url/date题目来源信息time_limit/memory_limit竞赛题目的时间与内存限制Expected Time Complexity/Expected Auxiliary Space期望时间复杂度和辅助空间使用方式按难度与技能筛选数据集的官方使用方式是直接通过datasets库加载并可按难度或技能过滤子集按难度筛选难度可选列表[EASY, MEDIUM, MEDIUM_HARD, HARD, VERY_HARD]默认[ALL]from datasets import load_dataset taco_difficulties load_dataset(BAAI/TACO, difficulties[EASY], tokenYOUR_HF_TOKEN)按技能筛选技能可选列表[Data structures, Sorting, Range queries, Complete search, Amortized analysis, Dynamic programming, Bit manipulation, Greedy algorithms]默认[ALL]from datasets import load_dataset taco_skills load_dataset(BAAI/TACO, skills[Sorting, Range queries], tokenYOUR_HF_TOKEN)值得注意的是官方datasets接口在加载时即进行难度/技能过滤而 OpenCompass 的实现只针对难度做本地过滤技能字段则保留在样本中供提示词构建使用详见下文源码解析。OpenCompass 接入配置文件逐层拆解OpenCompass 为 TACO 提供了三个配置文件位于 opencompass/configs/datasets/taco/taco_gen.py入口配置仅做一次read_base导入复用taco_gen_c7893a.py中定义的TACO_datasets适合整体评测。taco_gen_c7893a.py定义完整评测配置全量测试集。taco_levels_gen_411572.py按 5 档难度拆分成 5 个子配置TACO-EASY、TACO-MEDIUM等用于分难度报告成绩。全量评测配置taco_gen_c7893a.pyfrom 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 TACODataset, TACOEvaluator TACO_reader_cfg dict(input_columns[question, starter], output_columnproblem_id, train_splittest) TACO_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), ) TACO_eval_cfg dict(evaluatordict(typeTACOEvaluator), pred_roleBOT) TACO_datasets [ dict( typeTACODataset, abbrTACO, pathBAAI/TACO, num_repeats 1, reader_cfgTACO_reader_cfg, infer_cfgTACO_infer_cfg, eval_cfgTACO_eval_cfg, ) ]要点解读reader_cfg模型输入取question与starter两列output_column设为problem_id即样本去重与结果聚合的主键train_splittest表明评测使用的是测试集 split。infer_cfg采用ZeroRetriever零样本无检索增强GenInferencer生成式推理max_out_len512限制单次生成最大 token 数提示词要求模型把答案放在python ...代码块中输出这对后续post_process抽取代码块至关重要。eval_cfg评估器为TACOEvaluatorpred_roleBOT指定对话中模型角色的预测字段。num_repeats 1控制每个样本重复生成次数在计算 passk 时增大num_repeats可为同一题目采样多个答案从而支撑 pass10、pass100 的估计原理见后文。分难度评测配置taco_levels_gen_411572.py该配置把 5 档难度各自展开为一个独立 dataset 项便于按难度分别统计成绩TACO_difficulties_list [EASY, MEDIUM, MEDIUM_HARD, HARD, VERY_HARD] # ... reader_cfg / infer_cfgmax_out_len1024与全量配置基本一致 ... TACO_datasets [] for difficulty in TACO_difficulties_list: TACO_datasets.append( dict( typeTACODataset, abbrTACO- difficulty, pathBAAI/TACO, difficultydifficulty, reader_cfgTACO_reader_cfg, infer_cfgTACO_infer_cfg, eval_cfgTACO_eval_cfg, ) )与全量配置的差异点abbr变为TACO-EASY、TACO-MEDIUM等分别对应一个难度子集每个 dataset 项新增difficulty参数TACODataset.load会根据该参数在加载时过滤样本见下文源码此处max_out_len1024比全量配置更宽松适配更复杂的生成任务。入口配置taco_gen.pyfrom mmengine.config import read_base with read_base(): from .taco_gen_c7893a import TACO_datasets # noqa: F401, F403它本身不含任何新逻辑只是通过read_base把TACO_datasets导入到运行时配置命名空间中方便python run.py --datasets TACO一类命令直接引用。底层实现解析TACODataset 数据加载TACODataset实现在 opencompass/datasets/taco.py继承自BaseDataset注册于LOAD_DATASET。其load静态方法完成三项工作1. 仅支持 Hugging Face 官方路径def _load_taco_dataset(path: str): assert path HF_TACO_PATH, \ fTACODataset only supports the Hugging Face dataset {HF_TACO_PATH}. data_file hf_hub_download( repo_idHF_TACO_PATH, repo_typedataset, filenametest/data-00000-of-00001.arrow, ) return DatasetDict({test: Dataset.from_file(data_file)})从源码可见OpenCompass 只加载 TACO 的test splittest/data-00000-of-00001.arrow训练集不参与评测。这一行为有测试用例佐证test_taco.py 验证了hf_hub_download的调用参数并断言传入本地路径./data/BAAI-TACO时会抛出only supports the Hugging Face dataset的 AssertionError。2. 按难度过滤if ALL not in difficulty: if not sample[difficulty] difficulty: continuedifficulty默认值为ALL不过滤当传入EASY等具体档位时仅保留difficulty字段完全匹配的样本。3. 构造 starter 提示后缀列starter_code None if len(sample[starter_code]) 0 else sample[starter_code] try: input_output json.loads(sample[input_output]) fn_name (None if not input_output.get(fn_name) else input_output[fn_name]) except ValueError: fn_name None starter if starter_code: starter starter_code if (not fn_name) and (not starter_code): call_format \\nUse Standard Input format starter call_format else: call_format \\nUse Call-Based format starter call_format sample[starter] starter sample[problem_id] f{split}{idx}逻辑含义若题目带starter_code则拼入否则根据是否存在fn_name决定提示模型使用标准输入Standard Input格式还是函数调用Call-Based格式。problem_id形如test0、test1…作为每道题的唯一标识用于后续评测结果按题聚合。加载完成后还会按num_repeats对 test 样本做重复扩展从而为 passk 采样做准备。评估器深度剖析TACOEvaluator 与真实执行评测TACOEvaluatoropencompass/datasets/taco.py注册于ICL_EVALUATORS与 HumanEval 的静态匹配思路不同它采用真实运行生成的代码来判定正确性。整体流水线为score() ├─ post_process() 抽取模型输出中的第一个 python 代码块 ├─ evaluate_generations() 对每题每个生成样本执行 check_correctness() │ └─ check_correctness() 在子进程中运行 run_test()带全局超时 │ └─ run_test() 编译并执行代码逐用例比对输入输出 └─ compute_metrics() 按 passk 公式汇总为指标1. 输出后处理post_processdef 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 前缀从而剥离自然语言说明只保留可执行代码。这与 taco_gen_c7893a.py 提示词中答案放在代码块中的要求形成闭环。2. 全局超时保护check_correctnessmanager multiprocessing.Manager() result manager.list() p multiprocessing.Process(target_temp_run, args(sample, generation, debug, result)) p.start() p.join(timeouttimeout 1) if p.is_alive(): p.kill()评测在独立子进程中执行生成代码TIMEOUT 10秒为全局上限一旦子进程超时未返回直接杀死进程并按全部用例失败处理result [[-1 ...]]。这能兜住run_test内部各层超时未覆盖的极端情况如死循环、资源耗尽。3. 代码执行引擎run_testrun_test是核心执行器关键机制包括按函数名区分执行模式解析input_output中的fn_name。存在则走Call-Based模式通过RuntimeModule.from_string动态加载模块并直接调用函数否则走Standard Input模式把用户代码整体缩进包进def code():并用sys.stdin/mock_open等 mock 注入输入。逐用例比对输出对每个inputs调用method(*inputs)捕获 stdout 后与 ground truth 比对。比对并非简单的字符串相等而是依次尝试多种宽容策略去空白比较、逐行 strip 比较、按行拆分后比较、数值浮点近似比较np.allclose、集合set比较、排序无关的frozenset比较等以兼容竞赛题常见的输出格式差异。可靠性防护执行前调用reliability_guard()屏蔽os.kill、os.system、subprocess.Popen、文件删除等危险能力并禁用faulthandler、限制线程数避免模型生成的恶意或异常代码干扰评测环境。其 docstring 明确说明这不是安全沙箱因此 TACO 评测建议在受控环境中运行。类型感知比对Call-Based 模式下结果比对使用 code_execution.py 中的type_aware_equal它要求实际值与期望值类型一致且对 list/tuple、Mapping、set 做递归比较防止返回对象通过伪造__eq__蒙混过关。每道题每个生成样本的判定结果True全过、False有用例失败、-1运行超时/异常、-2编译失败。4. passk 指标计算compute_metrics把每个生成样本的逐用例结果压缩为是否全对np.all(gen 0)再用无偏估计器计算 passkdef estimator(n: int, c: int, k: int) - float: Calculates 1 - comb(n - c, k) / comb(n, k). if n - c k: return 1.0 return 1.0 - np.prod(1.0 - k / np.arange(n - c 1, n 1))其中n为该题生成的样本总数受num_repeats控制c为通过用例数。该公式来自 HumanEval 论文的 passk 无偏估计避免小样本下高估。默认计算k_list[1, 10, 100]输出形如{ pass1: 0.7, pass10: 12.3, pass100: 45.6, detail: {pass1: {task_id: score, ...}, ...} }detail中还包含逐题的 passk 明细便于定位具体难题。评测结果参考README 中给出的官方评测结果如下pass1单位 %datasetmetricCodeLlama-7b-Pythoninternlm2-chat-1.8b-sft-hfinternlm2-chat-7b-sft-hfinternlm2-chat-20b-sft-hfTACOpass10.70.71.72.7可见 TACO 题目难度显著高于常规代码生成基准——即使是 20B 量级的 chat 模型 pass1 也仅为个位数百分比适合作为区分中高阶代码生成能力的压轴评测集。如何在 OpenCompass 中运行 TACO 评测在完成 OpenCompass 安装后最简单的方式是直接用命令行选择数据集与模型python run.py --datasets TACO --models 你的模型配置名 --debug若需分难度评测可将--datasets TACO替换为TACO-EASY、TACO-MEDIUM、TACO-MEDIUM_HARD、TACO-HARD、TACO-VERY_HARD中的若干项多个数据集用空格分隔。--debug会在单个样本上小规模验证配置适合首次跑通流程。更灵活的做法是编写自定义评测脚本在配置中组合TACO_datasets与模型from mmengine.config import read_base with read_base(): from opencompass.configs.datasets.taco.taco_gen import TACO_datasets # 或者引入你的模型配置例如 # from opencompass.configs.models.hf_internlm2.hf_internlm2_chat_1_8b import models datasets TACO_datasets models [...] # 替换为实际模型配置需要注意的前提条件评测过程需要访问 Hugging Face 下载BAAI/TACO的 test arrow 文件运行环境需具备网络访问能力建议在受控的 Python 环境中执行评测生成的代码会被真实运行并注意reliability_guard并非安全沙箱模型侧应选用具备代码生成能力的 base/chat 模型max_out_len建议保持 512 以上分难度配置使用 1024避免长解法被截断若希望在报告中看到 pass10、pass100需将配置中的num_repeats提高到对应采样数如 10 或 100这会成倍增加推理开销。总结TACO 作为算法代码生成领域的挑战性基准在 OpenCompass 中得到了完整支持从 taco_gen_c7893a.py 的全量评测配置到 taco_levels_gen_411572.py 的分难度拆分再到 taco.py 中基于真实执行的TACOEvaluator形成了一条提示词构建 → 代码生成 → 沙箱化执行 → passk 统计的完整链路。理解这套链路不仅可以直接复现 TACO 评测也能为接入其他算法代码生成基准提供可参考的实现范式。赞分享模型评测人工智能大模型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 代码能力评估实战HumanEval 与 MBPP 的 pass1 / passk 配置与底层原理OpenCompass 代码能力评估实战HumanEval 与 MBPP 的 pass1 / passk 配置与底层原理 OpenCompass 提供了从模型评测人工智能大模型AI 评测OpenCompass 数据集配置实战指南目录结构、数据集选择与 G-Passk 多轮评估OpenCompass 数据集配置实战指南目录结构、数据集选择与 G Passk 多轮评估 OpenCompass 是面向大语言模型LLM的开源评测平台模型评测人工智能大模型AI 评测OpenCompass 代码评测实战基于 HumanEval 与 MBPP 的 pass1 / passk 完整配置指南OpenCompass 代码评测实战基于 HumanEval 与 MBPP 的 pass1 / passk 完整配置指南 导读 本文以 humaneval模型评测人工智能大模型AI 评测上一篇raylib IDE配置VSCode/VS2019/CodeBlocks集成下一篇OCRmyPDF性能优化终极指南10个技巧提升处理速度3倍 创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表