Пакетная обработка

Пакетная обработка позволяет запускать агента Hermes на сотнях или тысячах промптов параллельно, генерируя структурированные траектории данных. В основном это используется для генерации обучающих данных — создания траекторий в формате ShareGPT с инструментами статистического использования, которые можно использовать для тонкой настройки или оценки.

Обзор

Пакетный раннер (batch_runner.py) обрабатывает набор данных в формате JSONL, образуя из приглашений запуск каждого через полный сеанс агента с доступом к инструментам. Каждый запрос имеет соответствующее изолированное окружение. В результате получаются структурированные данные траекторий с полным традиционным диалогом, статистикой вызовов инструментов и метриками покрытий рассуждений.

Быстрый старт

# Базовый пакетный запуск
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

# Возобновление прерванного запуска
python batch_runner.py \
    --dataset_file=data/prompts.jsonl \
    --batch_size=10 \
    --run_name=my_first_run \
    --resume

# Список доступных распределений наборов инструментов
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"}

Запись может опционально включать: - image или docker_image: Образ контейнера для использования в песочнице этого промпта (работает с бэкендами Docker, Modal и Singularity) - cwd: Переопределение рабочего каталога для задачи терминального сеанса.

Параметры конфигурации

Параметр По умолчанию Описание
--dataset_file (обязательно) Путь к набору данных JSONL
--batch_size (обязательно) Промптов в пакете
--run_name (обязательно) Имя запуска (используется для выходного каталога и контрольных точек)
--распределение "по умолчанию" Распределение наборов инструментов для выборки
--модель Клод-сонет-4.6 используемая модель
--base_url https://openrouter.ai/api/v1 Базовый URL-API
--api_key (переменная окружения) API-ключ для моделей
--max_turns 10 Максимальное количество итераций вызова инструментов на подсказке
--num_workers 4 Количество параллельных рабочих процессов
--резюме ложь Возобновить с контрольной точки
--verbose ложь Включить подробную регистрацию
--max_samples все Обработать только первые N образцов из набора данных
--max_tokens по умолчанию модели Максимальное количество токенов на ответ модели

Маршрутизация провайдеров (OpenRouter)

Параметр Описание
--providers_allowed Разделенный запятыми список разрешенных провайдеров (например, "anthropic,openai")
--providers_ignored Разделенный запятыми список исключенных провайдеров (например, "вместе,deepinfra")
--providers_order Разделенный запятыми гарантированный порядок провайдеров
--provider_sort Сортировка по «цене», «пропускной способности» или «задержке»

Управление рассуждениями

Параметр Описание
--reasoning_effort Уровень эволюции: none, minimal, low, medium, high, xhigh
--reasoning_disabled Полностью отключить токены рассуждений/мышлений

Расширенные опции

Параметр Описание
--ephemeral_system_prompt Системный прогноз, прогноз во время выполнения, но НЕ сохраняющийся в траектории
--log_prefix_chars Символы для отображения в предпросмотре лога (по умолчанию: 100)
--prefill_messages_file Путь к JSON-файлу с заранее заполненными сообщениями для краткого прайминга

Распределения наборов инструментов

Каждый запрос получает случайно выбранный набор инструментов из распределения. Это гарантирует, что обучающие данные содержат различные оригинальные инструменты. Используйте --list_distributions, чтобы увидеть все доступные распределения.

В настоящее время распределение распределяется по каждому отдельному набору инструментов. Сэмплер самостоятельно переворачивает каждый набор инструментов, а затем проверяет, включен ли хотя бы один набор. Это отличается от таблиц заранее созданных комбинаций.

Формат

Данные всех выходных отображаются в data/<run_name>/:

data/my_run/
├── trajectories.jsonl    # Объединенный финальный вывод (все пакеты объединены)
├── batch_0.jsonl         # Результаты отдельных пакетов
├── batch_1.jsonl
├──...
├── checkpoint.json       # Контрольная точка для возобновления
└── statistics.json       # Агрегированная статистика использования инструментов

Формат траектории

каждая строка в 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, с полями from и value. Инструменты статистики нормализованы, чтобы включать все возможные инструменты с нулевыми значениями по умолчанию, создавать схему согласования для всех записей для совместимости с наборами данных HuggingFace.

Контрольные точки

Пакетный раннер имеет надежные контрольные точки для отказоустойчивости:

Как работает восстановление

  1. Сканировать все файлы batch_*.jsonl для объекта завершенных промптов (по совпадению результатов).
  2. Отфильтровать набор данных, создав уже готовые предложения.
  3. Переупаковать функции
  4. Обработайте только функции
  5. Объединить все файлы пакетов (старые + новые) в итоговом выводе.

Фильтрация качества

Пакетный раннер применяет автоматическую фильтрацию качества:

Статистика

После завершения раннера выводит подробную статистику:

Статистика также сохраняется в 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-образам перед запуском каждого из них.