Skip to main content

批量处理

批量处理允许您并行运行 Hermes 代理处理数百甚至数千个提示,生成结构化的轨迹数据。这主要用于 训练数据生成 —— 创建包含工具使用统计信息的 ShareGPT 格式轨迹,可用于微调或评估。

概览

批量运行器(batch_runner.py)会处理一个 JSONL 数据集中的提示,为每个提示执行完整的代理会话并访问工具。每个提示都有其独立的沙箱环境。输出为结构化的轨迹数据,包含完整的对话历史、工具调用统计以及推理覆盖度指标。

快速开始

# Basic batch run
python batch_runner.py \
--dataset_file=data/prompts.jsonl \
--batch_size=10 \
--run_name=my_first_run \
--model=anthropic/claude-sonnet-4.6 \
--num_workers=4

# Resume an interrupted run
python batch_runner.py \
--dataset_file=data/prompts.jsonl \
--batch_size=10 \
--run_name=my_first_run \
--resume

# List available toolset distributions
python batch_runner.py --list_distributions

数据集格式

输入数据集是一个 JSONL 文件(每行一个 JSON 对象)。每个条目必须包含一个 prompt 字段:

{"prompt": "Write a Python function that finds the longest palindromic substring"}
{"prompt": "Create a REST API endpoint for user authentication using Flask"}
{"prompt": "Debug this error: TypeError: cannot unpack non-iterable NoneType object"}

条目可选地包含:

  • imagedocker_image:为该提示的沙箱使用的容器镜像(适用于 Docker、Modal 和 Singularity 后端)
  • cwd:任务终端会话的工作目录覆盖

配置选项

参数默认值描述
--dataset_file(必需)JSONL 数据集路径
--batch_size(必需)每批提示数量
--run_name(必需)此次运行的名称(用于输出目录和断点保存)
--distribution"default"从中采样的工具集分布
--modelclaude-sonnet-4.6使用的模型
--base_url`https://openrouter.ai/api/v1``API 基础地址
--api_key(环境变量)模型的 API 密钥
--max_turns10每个提示的最大工具调用迭代次数
--num_workers4并行工作进程数
--resumefalse从断点恢复
--verbosefalse启用详细日志记录
--max_samplesall仅处理数据集中前 N 个样本
--max_tokens模型默认值每次模型响应的最大 token 数

提供商路由(OpenRouter)

参数描述
--providers_allowed允许的提供商标记列表(例如 "anthropic,openai"
--providers_ignored忽略的提供商标记列表(例如 "together,deepinfra"
--providers_order优先使用的提供商标记顺序列表
--provider_sort"price""throughput""latency" 排序

推理控制

参数描述
--reasoning_effort推理努力程度:noneminimallowmediumhighxhigh
--reasoning_disabled完全禁用推理/思考 token

高级选项

参数描述
--ephemeral_system_prompt执行期间使用的系统提示,但不会保存到轨迹中
--log_prefix_chars日志预览中显示的字符数(默认:100)
--prefill_messages_file包含少量示例预填充消息的 JSON 文件路径,用于少样本引导

工具集分布

每个提示都会从一个 分布 中随机采样一组工具集。这确保了训练数据涵盖多样的工具组合。使用 --list_distributions 可查看所有可用的分布。

在当前实现中,分布为 每个单独的工具集 分配一个概率。采样器会独立决定每个工具集是否启用,然后保证至少有一个工具集被激活。这与手工编写的预设组合表不同。

输出格式

所有输出均写入 data/<run_name>/

data/my_run/
├── trajectories.jsonl # Combined final output (all batches merged)
├── batch_0.jsonl # Individual batch results
├── batch_1.jsonl
├── ...
├── checkpoint.json # Resume checkpoint
└── statistics.json # Aggregate tool usage stats

轨迹格式

trajectories.jsonl 中的每一行都是一个 JSON 对象:

{
"prompt_index": 42,
"conversations": [
{"from": "human", "value": "Write a function..."},
{"from": "gpt", "value": "I'll create that function...",
"tool_calls": [...]},
{"from": "tool", "value": "..."},
{"from": "gpt", "value": "Here's the completed function..."}
],
"metadata": {
"batch_num": 2,
"timestamp": "2026-01-15T10:30:00",
"model": "anthropic/claude-sonnet-4.6"
},
"completed": true,
"partial": false,
"api_calls": 3,
"toolsets_used": ["terminal", "file"],
"tool_stats": {
"terminal": {"count": 2, "success": 2, "failure": 0},
"read_file": {"count": 1, "success": 1, "failure": 0}
},
"tool_error_counts": {
"terminal": 0,
"read_file": 0
}
}

conversations 字段采用类似 ShareGPT 的格式,包含 fromvalue 字段。工具统计数据经过归一化处理,包含所有可能的工具并以零作为默认值,确保所有条目具有统一的模式,兼容 HuggingFace 数据集格式。

断点保存

批量运行器具备强大的断点保存机制,以实现容错:

  • 断点文件:每批完成后保存,记录已完成的提示索引
  • 内容驱动恢复:在 --resume 时,运行器扫描现有的批次文件,并通过实际文本内容匹配已完成的提示(而非仅依赖索引),即使数据集顺序改变也能恢复
  • 失败提示:只有成功完成的提示才会被标记为已处理 —— 失败的提示将在恢复时重试
  • 批次合并:完成时,所有批次文件(包括之前运行的)将合并成一个单一的 trajectories.jsonl

恢复机制说明

  1. 扫描所有 batch_*.jsonl 文件,识别已完成的提示(通过内容匹配)
  2. 从数据集中过滤掉已完成的提示
  3. 对剩余提示重新分批
  4. 仅处理剩余提示
  5. 将所有批次文件(旧 + 新)合并为最终输出

质量过滤

批量运行器应用自动质量过滤:

  • 无推理过滤:若某个样本中助手回复轮次中没有推理内容(未出现 <REASONING_SCRATCHPAD> 或原生思考 token),则该样本会被丢弃
  • 损坏条目过滤:在最终合并阶段,会过滤掉包含虚构工具名称(不在有效工具列表中)的条目
  • 推理统计:跟踪整个运行过程中有无推理的回复轮次占比

统计信息

运行完成后,运行器会打印全面的统计信息:

  • 工具使用情况:各工具的调用次数、成功率与失败率
  • 推理覆盖率:包含推理的助手回复轮次百分比
  • 被丢弃样本数:因缺乏推理而被过滤的样本数量
  • 耗时:总处理时间

统计信息也会保存至 statistics.json,便于程序化分析。

使用场景

训练数据生成

生成多样化的工具使用轨迹,用于模型微调:

python batch_runner.py \
--dataset_file=data/coding_prompts.jsonl \
--batch_size=20 \
--run_name=coding_v1 \
--model=anthropic/claude-sonnet-4.6 \
--num_workers=8 \
--distribution=default \
--max_turns=15

模型评估

评估模型在标准化提示下使用工具的能力:

python batch_runner.py \
--dataset_file=data/eval_suite.jsonl \
--batch_size=10 \
--run_name=eval_gpt4 \
--model=openai/gpt-4o \
--num_workers=4 \
--max_turns=10

每个提示独立的容器镜像

对于需要特定环境的基准测试,每个提示可以指定自己的容器镜像:

{"prompt": "Install numpy and compute eigenvalues of a 3x3 matrix", "image": "python:3.11-slim"}
{"prompt": "Compile this Rust program and run it", "image": "rust:1.75"}
{"prompt": "Set up a Node.js Express server", "image": "node:20-alpine", "cwd": "/app"}

批量运行器会在运行每个提示前验证 Docker 镜像是否可访问。