BixBench 基准测试分析报告¶
仓库:https://github.com/Future-House/BixBench 数据集:https://huggingface.co/datasets/futurehouse/BixBench 论文:https://arxiv.org/abs/2503.00096
BixBench 是 FutureHouse 与 ScienceMachine 合作发布的计算生物学 Agent 基准。它以真实发表的 Jupyter notebook 研究项目为基础,考察大模型 Agent 在「数据探索 → 多步分析 → 结果解释」链路上的能力。本报告从两个维度解析:任务(Task) 与 工具(Tools)。
一、任务(Tasks)的具体内容¶
1.1 数据集规模¶
- 60 个 capsule(即 60 份真实、已发表的生物信息学研究 notebook + 原始数据包)。
- 每个 capsule 对应一份
.zip,解压后包含Data/目录(任务输入数据)和相关元信息。原始Notebook/与*.ipynb在下发给 Agent 之前会被删除(见bixbench/generate_trajectories.py:155的_extract_and_process_files),避免泄露解法。 - 205 道问题(v1.5,全部位于 HuggingFace 的
trainsplit),每道问题绑定到一个 capsule,由领域专家依据原 notebook 的结论编写。 - 问题在数据集中的字段包括:
question_id、question、ideal(正确答案)、distractors(干扰项,用于 MCQ)、data_folder(指向所属 capsule zip)、capsule_uuid、以及可选的eval_mode(评分方式)。
1.2 三种问答模式¶
由 bixbench/models.py 中的 CapsuleSettings.mode 枚举定义:
| 模式 | 系统提示(data-analysis-crow/src/fhda/prompts.py) | 题目形态 | 答案约束 |
|---|---|---|---|
open |
CAPSULE_SYSTEM_PROMPT_OPEN |
开放式问答 | 纯文本答案,用 <answer>…</answer> 包裹 |
mcq |
CAPSULE_SYSTEM_PROMPT_MCQ |
4 个选项的多项选择题(随机打乱) | 单字母 <answer>A</answer> |
hypothesis |
CAPSULE_SYSTEM_PROMPT_HYPOTHESIS |
给出一个假设,Agent 判断真伪 | <answer>True</answer> 或 False |
MCQ 模式可选择加入 Refusal Option(include_refusal_option)——第 5 个选项固定为 Insufficient information to answer the question。由 bixbench/utils.py:randomize_choices 产生,代码用此机制衡量模型"知道自己不知道"的能力。
1.3 两种评测范式¶
BixBench 同时提供:
- Zero-shot 基线(
generate_zeroshot_evals.py+bixbench/zero_shot.py) 只给 LLM 问题和选项,直接回答。不看数据,用作下限参考。 - Agentic 评测(
bixbench/generate_trajectories.py) 把 Agent 丢进一个含原始数据的 Jupyter notebook 环境里,限制最多max_steps(配置里是 20–40)步工具调用,由 Agent 自己写代码、跑结果、提交答案。
1.4 任务下发的提示链(Chain-of-Thought Scaffold)¶
由 data-analysis-crow/src/fhda/prompts.py 定义,Agent 每次被要求按 4 个阶段思考(都会以 <analysis_planning> 标签预先规划):
- Load Data and Perform Descriptive Statistics(加载数据 + 描述统计)
- Develop Analysis Plan(制定分析方案)
- Execute Analysis Plan(写代码执行)
- Conclude and Submit Answer(归纳并提交)
此外还叠加通用指引 GENERAL_NOTEBOOK_GUIDELINES:
- 单元格要小、通过索引编辑修 bug 而非追加;
- 假设常用包已装好,遇报错才用 pip/mamba 安装;
- 只能新建 代码单元格,不能写 markdown;
- 可通过 %%bash 或 subprocess 执行 shell;
- 默认避免画图:avoid_images=True 时叠加 AVOID_IMAGES 指令,要求用 table/print 代替。
当语言设为 R 时,还会追加 R_SPECIFIC_GUIDELINES(强制使用 tidyverse、显式 pkg::fn() 命名空间、ggplot2 画图等)。
1.5 评分机制¶
bixbench/graders.py 与 bixbench/prompts.py 定义了 3 种评分器(由 evaluation_mode 字段选择):
evaluation_mode |
逻辑 |
|---|---|
str_verifier |
归一化后精确匹配(去除非字母数字、转小写)。MCQ 默认使用。 |
range_verifier |
目标是 (lower, upper) 元组,数值答案落入即正确。 |
llm_verifier |
由另一个 LLM(通常 gpt-4o 或 claude-3-5-sonnet)读取 OPEN_ENDED_GRADING_PROMPT,输出 <grade>correct/incorrect/refused</grade>。开放式问答默认使用。 |
MCQ 的"拒答选项"会被识别为 refused,从而区分"答错"与"主动承认不会"。
统计指标(bixbench/utils.py:compute_metrics)包含 Accuracy、Precision(不算拒答)、Coverage(答题率)。
1.6 后处理与多样性分析¶
bixbench/postprocessing.py + v1.5_paper_results.yaml 提供:
- Majority Vote(k=5):同一模型跑 5 次副本,取多数票,用于复刻论文。
- Image vs. No-image 对比:带图/不带图的两版结果对比。
- Refusal vs. No-refusal 对比:有无 refusal 选项的 MCQ 准确率差异。
- Zero-shot 基线一起画在图里做对照。
配置中列出的对比组包括:
claude_image_mcq_with_refusal、4o_image_mcq_with_refusal、
claude_no_image_mcq_with_refusal、4o_no_image_mcq_with_refusal 等。
二、工具(Tools)的具体内容¶
Agent 接入的工具链完全由依赖库 fhda(data-analysis-crow v1.5.0)的 NBEnvironment / DataAnalysisEnv 暴露,而不是 BixBench 仓内直接写死。实现见 src/fhda/notebook_env.py:159-169:
self.tools = [
Tool.from_function(self.edit_cell),
Tool.from_function(self.list_workdir),
Tool.from_function(self.submit_answer),
]
if self.allow_download_from_gcs:
self.tools.append(Tool.from_function(self.download_from_bucket))
即 Agent 默认只有 3 个工具(开启 GCS 下载后为 4 个)。工具签名如下:
2.1 edit_cell(contents: str, idx: int | None = None) -> str¶
- 向 notebook 追加或覆盖一个代码单元格(不支持 Markdown)。
idx=None时追加新单元格;给定索引则覆写对应单元格。- 每次成功调用后会自动从头到尾执行整个 notebook(Docker 内
jupyter nbconvert --to notebook --execute --inplace --allow-errors,本地模式则用AsyncKernelClient依次 execute),并把新产生的 outputs 写回;错误不中断执行,而是作为 cell output 返回给 Agent。 - 执行超时
EXEC_TIMEOUT = 1200秒;超时即强制结束回合。 - 单 cell 输出长度被截断到
NB_OUTPUT_LIMIT = 3000字符,两端各留 1500,中间以<...output limited...>省略。
2.2 list_workdir() -> str¶
- 递归列出工作目录(capsule 数据 + 当前 notebook + 生成的中间文件),以嵌套 JSON 返回。
- Agent 通过这个工具"看见"可用的原始数据文件名。
2.3 submit_answer(answer) -> str¶
- 结束回合并记录答案。
DataAnalysisEnv.submit_answer(覆盖基类)会把state.answer设好后立刻close()容器/内核,保证一次性提交。 - 不同任务模式下答案格式受 prompt 约束:
open:<answer>短答</answer>mcq:<answer>A/B/C/D/E</answer>hypothesis:<answer>True/False</answer>
2.4 download_from_bucket(bucket_path, path_in_workspace) -> str(可选)¶
默认 关闭(allow_download_from_gcs=False)。当任务的数据放在 GCS 上时才暴露,作用是从桶里把目录拉到本地 /workspace。BixBench 官方任务把数据以 HuggingFace .zip 形式预下发,不依赖此工具。
2.5 底层执行环境(工具之外的"隐性能力")¶
虽然只暴露 3 个显式工具,但因为 edit_cell 运行的是一个完整 Jupyter 内核,Agent 事实上可以:
- 执行任意 Python 代码(默认 kernel),通过
%%bash、subprocess、或以!前缀执行任意 shell 命令; - 切换到 R(通过
%%Rcell magic,或直接用 R kernel,配置NBLanguage.R+USE_R=true); - 按需
pip/mamba安装包(Docker 镜像中预装常见生物信息学/科学计算栈:matplotlib、scikit-learn、seaborn、statsmodels、nbformat、jupyter 等,由 pyproject + kernel_requirements.txt 给出); - 调用专业生物信息学工具。Prompt (
BASH_TOOL_USAGE) 明确提示可用: - BUSCO(通过 udocker +
ezlabgva/busco:v5.8.0_cv1容器镜像) - mafft、clipkit、fastqc、iqtree、metaeuk、perl、phykit 等命令行工具。
容器镜像为 futurehouse/bixbench:aviary-notebook-env(fhda/config.py),工作目录挂载在 /workspace。容器生命周期由 NBEnvironmentState.start_container / close 管理。
2.6 环境返回的观察(Observation)¶
NBEnvironment.get_env_state_msg 把 notebook 当前状态渲染成 Markdown(utils.view_notebook)回传给 Agent:
- 每个 cell 前有 ### Cell i: 标题;
- 代码单元格 + 输出原文;
- 图片输出转成 base64 并以占位符 <n> 引用,真正的 image payload 通过 aviary 的 EnvStateMessage.images 字段传递给支持多模态的模型;
- 表格/HTML 被过滤以避免 token 爆炸(JUPYTER_TABLE_OUTPUT_TYPES_TO_IGNORE)。
配置项 avoid_images=True 会在提示中叫模型"少画图、多用表格",配合关闭图片上下文节省成本。
三、Agent 与 Rollout 配置速查¶
来自 bixbench/run_configuration/*.yaml:
| 项 | 典型值 |
|---|---|
agent.agent_type |
ReActAgent(claude 默认)或 SimpleAgent(4o 默认) |
agent.agent_kwargs.llm_model.name |
gpt-4o、claude-3-5-sonnet-latest、claude-3-7-sonnet-20250219(底层通过 litellm 走,任意 LiteLLM 支持的模型都能接) |
rollout.max_steps |
20 (4o) / 40 (claude) |
rollout.batch_size |
4–24 |
rollout.rollout_type |
aviary(使用 ldp.alg.rollout.RolloutManager)、vanilla、custom |
notebook.language |
python / r |
notebook.use_docker |
true(默认走 Docker) |
capsule.mode |
open / mcq / hypothesis |
capsule.include_refusal_option |
true / false |
capsule.avoid_images |
true / false |
替换 Agent 的入口在 bixbench/generate_trajectories.py:334 的 custom_rollout 函数——重写该方法即可接入自定义 Agent,产物仍通过 postprocessing.py 评测。
四、要点提炼¶
- 任务形态:205 条来自 60 个真实研究的生物信息学问题,支持开放式 / 多选 / 假设验证三种形式;MCQ 可带/不带 refusal 选项。
- 任务难度源:不在"问对哪个选项",而在"能否从原始
.zip数据出发,自主写/跑 Python/R/bash、排查报错、选择合适统计/生信工具链、推导结论"。 - 工具集极简:只有
edit_cell+list_workdir+submit_answer三个显式工具(可选download_from_bucket)。真正的"工具"是一整套 Dockerized Jupyter 环境 + 预装的生信命令行栈,通过edit_cell进入。 - 评分开放:
str_verifier/range_verifier/llm_verifier三种模式并存,MCQ 默认字符串匹配,开放题默认 LLM 评分。 - 复刻友好:所有配置 YAML 化,可直接
python bixbench/generate_trajectories.py --config_file …+python bixbench/postprocessing.py --config_file …产出论文里的柱状图和 majority-vote 曲线。