使用 AutoGenBench(agbench) 复现并扩展 HumanEval 基准测试:让多智能体在 pass/fail 反馈中反复求解代码任务
2026/9/8 21:31:58 网站建设 项目流程

使用 AutoGenBench(agbench) 复现并扩展 HumanEval 基准测试:让多智能体在 pass/fail 反馈中反复求解代码任务

【免费下载链接】autogenA programming framework for agentic AI项目地址: https://gitcode.com/GitHub_Trending/au/autogen

导读

本文讲解如何基于当前仓库中 AutoGenBench(agbench) 提供的 HumanEval 基准场景,对一个由"编码智能体 + 代码执行智能体"组成的 AutoGen AgentChat 团队进行自动化评估。与原始 HumanEval(面向补全模型、一次生成即判定)不同,本场景使用对话式模型驱动智能体,并通过执行器给出pass/fail 反馈让智能体持续重试,直至通过或耗尽轮次/Token。读完本文你将掌握:场景目录结构与原理、模型与环境的配置方法、任务文件的生成逻辑、agbench run/agbench tabulate两条核心命令的完整用法,以及底层测试注入与终止判定机制的源码级实现。

HumanEval 场景的两个关键改动

仓库中的 HumanEval 场景 README 明确指出:该场景是原始 HumanEval(论文Evaluating Large Language Models Trained on Code)的修改版本,与原始基准相比存在两点本质差异:

  1. 使用对话模型(chat model)而非补全模型(completion model)。这要求智能体能理解多轮对话上下文,而不是一次性的续写。
  2. 智能体收到 pass/fail 反馈并可反复尝试。当生成代码测试失败时,执行智能体把失败信息回传给编码智能体,编码智能体据此修正实现,循环往复,直到成功通过、耗尽最大轮次或耗尽 Token

因此该场景衡量的是"具备执行–反馈–修订闭环能力的智能体团队"的编程能力,而非单次采样生成能力。这种评测目标对应真实工程中"智能体自主写代码并自我修正"的应用形态。

场景目录结构

HumanEval 基准位于仓库的 python/packages/agbench/benchmarks/HumanEval 目录,主要组成如下:

HumanEval/ ├── ENV.yaml # 传给任务环境(Docker)的临时环境变量,如 OPENAI_API_KEY ├── config.yaml # 被测模型配置,会被复制进每个扩展后的 Task ├── README.md # 场景说明(本文主体依据) ├── Scripts/ │ ├── init_tasks.py # 下载 HumanEval 原始数据集并生成 Tasks/*.jsonl │ └── custom_tabulate.py # 面向本场景的聚合汇总入口 ├── Templates/ │ └── AgentChat/ # 智能体模板:一套"编码器 + 执行器"的组队方案 │ ├── custom_code_executor.py # 定制执行器:把候选代码包进单测骨架 │ ├── reasoning_model_context.py # 针对 R1 等推理模型的上下文(剥离 thought) │ ├── prompt.txt # 题目占位模板,__PROMPT__ 将被替换 │ ├── requirements.txt # 场景运行依赖(pyyaml + autogen 各包) │ ├── scenario.py # 场景主脚本:构建团队并运行 │ └── test.txt # 单测占位模板,__TEST__ 将被替换

一句话概括运行模型:Scripts/init_tasks.py把原始 HumanEval 题目按 Templates/AgentChat 的占位模板"展开"为可独立运行的 Task(JSONL 记录);agbench run在受控环境(默认 Docker)中逐一执行这些 Task;agbench tabulate汇总运行结果。

环境准备

安装 agbench 与 Docker

agbench 是 Autogen 仓库内自带的评测工具。根据 python/packages/agbench/README.md 与 benchmarks 总 README,推荐从源码以可编辑模式安装:

git clone <autogen 仓库地址> pip install -e autogen/python/packages/agbench

同时在仓库根目录执行git clone后,把AUTOGEN_REPO_BASE导出为指向 autogen 仓库的路径,使 Docker 容器使用正确版本的 agent 代码:

export AUTOGEN_REPO_BASE=<path_to_autogen>

benchmark 强烈依赖 Docker:默认每个 Task 都在全新初始化的 Docker 容器中运行(镜像默认名为agbench:default,不存在时自动创建),以保证起始状态一致并隔离不安全代码。在 WSL 环境需要先安装 Docker Desktop,并在 Settings → Resources → WSL Integration 中开启对目标发行版(如 Ubuntu)的集成。

API Key 注入

HumanEval 场景通过 ENV.yaml 声明传入任务环境的环境变量:

OPENAI_API_KEY: ${OPENAI_API_KEY}

即把宿主机上的OPENAI_API_KEY环境变量拷贝到任务环境中。这些变量是临时的:Task 结束后即被丢弃,不会写入日志或输出文件,从而避免 API Key 泄露。复杂值会被序列化为 JSON 字符串后传入(如MODEL_CONFIG之类的字典结构会自动转成 JSON 文本)。

配置被测模型:config.yaml

进入场景目录后,首先更新 config.yaml,使其指向你的模型服务。默认配置指向gpt-4o

model_config: provider: autogen_ext.models.openai.OpenAIChatCompletionClient config: model: gpt-4o

该文件中的model_config会在每个 Task 展开时被复制进该 Task 的config.yaml,随后由 scenario.py 在运行前加载(见下文源码解析)。

若使用本地推理模型(如通过 Ollama 托管 deepseek-r1:7b),config.yaml 中给出了注释示例:

#model_config: # provider: autogen_ext.models.openai.OpenAIChatCompletionClient # config: # model: deepseek-r1:7b # base_url: http://localhost:11434/v1/ # api_key: ollama # model_info: # function_calling: false # json_output: false # vision: false # family: r1

注意这里通过model_info.family: r1声明模型属于 DeepSeek R1 推理系列。该字段不是摆设:它直接决定场景运行时选用哪种对话上下文管理策略(详见下文 reasoning_model_context.py 的解析)。由于通过 OpenAI 兼容端点访问,需要同时给出base_urlapi_key(Ollama 下通常填ollama),并用model_info明确声明该后端不支持函数调用与 JSON 输出,避免框架侧做错误的请求假设。

初始化任务:生成 Tasks/*.jsonl

配置好模型后执行任务初始化脚本(脚本位于 Scripts/init_tasks.py):

cd python/packages/agbench/benchmarks/HumanEval python Scripts/init_tasks.py

从 init_tasks.py 源码可以看到,它会联网下载原始 HumanEval 数据集HumanEval.jsonl.gz),解压后逐行解析为 JSON 任务对象。因此该步骤需要可访问数据集托管源的网络环境;若因网络原因首次下载失败或中断,再次运行python Scripts/init_tasks.py即可补齐。

随后脚本扫描 Templates 下的每个子目录作为"模板",并为"模板 × 全量题目"的每个组合生成一个 JSONL 文件,写入场景根目录下新创建的Tasks/文件夹(init_tasks.py)。当前 HumanEval 场景只有一个模板AgentChat,故只会生成Tasks/human_eval_AgentChat.jsonl。每条 JSONL 记录的结构如下:

{ "id": "HumanEval_2", "template": ".../Templates/AgentChat", "substitutions": { "prompt.txt": {"__PROMPT__": "……题目与函数签名……"}, "test.txt": {"__TEST__": "……单元测试代码……"}, "custom_code_executor.py": {"__ENTRY_POINT__": "……被测函数名……"} } }

其中idtask_id中的/替换为_生成(如HumanEval/2HumanEval_2);substitutions把三道占位符注入模板文件:prompt.txt中的__PROMPT__test.txt中的__TEST__、以及custom_code_executor.py中的__ENTRY_POINT__。整个基准全部 164 道题都将被展开为独立 Task。

运行基准:agbench run

运行 HumanEval 的全部任务:

agbench run Tasks/human_eval_AgentChat.jsonl

运行期间命令行会实时打印原始日志,可以看到"编码智能体 → 执行智能体"之间的完整对话与代码执行过程。

agbench run是 AutoGenBench 的核心执行命令(详见 agbench README 的命令帮助),常用参数如下:

参数含义与取值
scenario(位置参数)要运行的 JSONL 场景文件;若传目录则运行目录内全部 JSONL(默认./scenarios
-r/--repeat N每个任务重复运行 N 次以获得统计稳定性(默认 1),如--repeat 10
-s/--subsample X任务子采样:传小数按比例采样(0.7= 70%),传整数则每个文件随机选取该数量个任务(默认1.0
-m/--model MODEL过滤 config 列表,只运行匹配指定模型名的任务
-c/--config CONFIG指定 OAI_CONFIG_LIST 的环境变量名或文件路径(默认OAI_CONFIG_LIST
--requirements FILE运行场景前额外 pip install 的依赖文件
-d/--docker-image IMAGE使用的 Docker 镜像(默认agbench:default,不存在则创建;与--native互斥)
--native在宿主机本地运行而非 Docker(强烈不推荐,需自行承担安全与一致性风险)

requirements.txt模板(Templates/AgentChat/requirements.txt)声明了场景运行依赖:pyyaml以及 autogen 的autogen-coreautogen-ext[openai]autogen-agentchat三个包(按容器内路径引用),其中[openai]表示安装 openai 模型的扩展组件。子采样功能尤其适合开发期调试:先用--subsample 3快速验证链路,再全量跑正式评测。

每个命令都可用内联帮助查看完整选项:agbench --helpagbench run --helpagbench tabulate --helpagbench remove_missing --help

查看结果:agbench tabulate 与结果目录

另一个终端中汇总刚才的运行结果:

agbench tabulate Results/human_eval_AgentChat

该命令输出任务完成率等摘要指标。若需要为场景定制指标口径,HumanEval 还提供了 Scripts/custom_tabulate.py,其内部委托 agbench 的default_tabulate完成统计,可作为自定义聚合的接入点。

按 agbench README 的说明,运行结果默认按以下层级存放:

./results/[场景名]/[task_id]/[instance_id]

例如./results/human_eval_AgentChat/HumanEval_2/0/1…… 每个instance_id对应一次运行尝试(--repeat 10会产生 10 个子目录)。每个实例目录内包含:

  • timestamp.txt:运行时间戳及所用 autogen-agentchat 库版本;
  • console_log.txt:任务运行的全部控制台输出;
  • [agent]_messages.json:每个智能体的消息字典日志;
  • ./coding/:智能体编写出的全部代码及这些代码产生的产物。

深入内部:场景是如何运行的

展开后的每个 Task 会执行 Templates/AgentChat/scenario.py 主脚本。其运行逻辑可归纳为四步:

第一步,按配置创建模型客户端(scenario.py):读取 Task 目录下的config.yaml,通过ChatCompletionClient.load_component依据provider+config实例化模型客户端。

第二步,依据模型家族选择对话上下文(scenario.py):若model_client.model_info["family"] == ModelFamily.R1,使用ReasoningModelContext;否则使用UnboundedChatCompletionContext,并覆盖到 coder 智能体上。之所以要区分,是因为 DeepSeek R1 等推理模型可能把thought(思考字段)写进 AssistantMessage。查看 reasoning_model_context.py 源码可知:该类在get_messages()返回前会把每条AssistantMessagethought置为None,防止推理内容污染上下文、消耗 Token。

第三步,组建"编码 + 执行"智能体团队(scenario.py):

  • coder:基于MagenticOneCoderAgent的编码智能体;
  • executor:基于定制的 CustomCodeExecutorAgent,把本地代码执行器LocalCommandLineCodeExecutor()包在其上,并声明只接收来自coder的代码;
  • 两者组成RoundRobinGroupChat最大轮次max_turns=12——这正是 README 所说"耗尽轮次即停止"的落地位置;
  • 终止条件TextMentionTermination(text="TERMINATE", sources=["executor"]):只有执行智能体明确说出TERMINATE才会结束对话。

第四步,构造任务提示并流式运行(scenario.py):读取替换了__PROMPT__prompt.txt,把函数签名包装进 Markdown Python 代码块的任务描述中,然后通过agent_team.run_stream(task=task)+Console(stream)驱动对话并实时输出。

测试注入机制:CustomCodeExecutorAgent 的改造

场景最关键的自定义逻辑在 custom_code_executor.py 中。其构造函数会把替换了__TEST__test.txt读入内存作为测试代码(custom_code_executor.py)。

随后它重写_extract_markdown_code_blocks:每当解析出 Python 代码块,就把测试代码 + 一段run_tests驱动 + 候选实现拼接成一个带单测骨架的完整可运行脚本(custom_code_executor.py):

def run_tests(candidate): try: check(candidate) # 可以在输出中搜索该字符串 print("ALL TESTS PASSED !#!#") print("TERMINATE") except AssertionError: print("SOME TESTS FAILED - TRY AGAIN !#!#")

拼接末尾会调用run_tests(__ENTRY_POINT__),其中__ENTRY_POINT__已被替换为被测函数名。这一设计实现了 HumanEval 场景的两个关键目标:

  • 机器可读的 pass/fail 反馈:输出中的ALL TESTS PASSED !#!#SOME TESTS FAILED - TRY AGAIN !#!#标记让外部评估脚本能精确判断每次尝试的结果;
  • 自我修正闭环TERMINATE作为终止词触发TextMentionTermination,仅当全部断言通过时执行器才输出它——通过即结束对话,失败则编码智能体带着失败信息继续修改重试,直至max_turns=12轮次耗尽。

文件中还保留了一段注释掉的<think>块剥离逻辑,用于处理可能输出思考块包裹代码的模型,说明该场景对推理模型的输出格式做了兼容性考量。整体而言,这套"把官方单测作为不可变裁判、把执行器输出作为结构化反馈"的模式,是 HumanEval 基准区别于一次性采样的核心设计,也是 Templates/AgentChat 中最值得迁移复用的部分。

运行要点与注意事项

  • 任务初始化会联网下载原始 HumanEval 数据;若下载中断可重跑python Scripts/init_tasks.py
  • 每个 Task 默认在全新 Docker 容器中执行,起始环境完全一致;本地/原生执行需显式--native并自负风险。
  • 重复运行多次以获得可靠结论,例如agbench run --repeat 5 Tasks/human_eval_AgentChat.jsonl;开发调试阶段优先用--subsample
  • 若模型来自 Azure 或第三方服务,除修改 config.yaml 外,可能还需在 ENV.yaml(或 ENV.json)中补充相应配置与密钥;agbench 的总体密钥读取规则(OAI_CONFIG_LIST 文件/环境变量、回退到OPENAI_API_KEY)见 agbench README。
  • 复用该场景编写新基准时,可参照 "Templates/{模板名}/ + Scripts/init_tasks.py + agbench run" 三段式组织,把题目、测试与执行脚本作为占位模板分离,详见 benchmarks 目录 与 GAIA 场景(后者包含 MagenticOne、ParallelAgents、SelectorGroupChat 等多模板示例)。

参考出处

场景与运行方法的核心依据为 HumanEval 场景 README;完整命令参数与结果目录约定见 agbench README;团队组建、测试注入与模型上下文逻辑的源码依据见 Templates/AgentChat 下对应文件。HumanEval 基准本身源自 OpenAI 的论文Evaluating Large Language Models Trained on Code,该文献引用信息已记录于场景 README.md 的 References 一节中,可供查证。

【免费下载链接】autogenA programming framework for agentic AI项目地址: https://gitcode.com/GitHub_Trending/au/autogen

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询