Пакетная обработка
Пакетная обработка позволяет запускать агента 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.
Контрольные точки
Пакетный раннер имеет надежные контрольные точки для отказоустойчивости:
- Файл контрольной точки: Сохраняется после завершения каждого пакета, отслеживается, какие индексы выполняются.
- Возобновление базы значений: При
--resumeраннер сканирует пакеты исходящих файлов и сопоставляет завершенные подсказки по их фактическому содержимому текстов (а не только по индексам), что позволяет восстанавливаться даже при упорядочении набора данных - Неудачные промпты: Только успешно завершенные промпты отмечаются как выполненные — неудачные промпты будут повторяться при включении.
- Объединение пакета: По завершении все пакеты (включая предыдущие запуски) объединяются в один
trajectories.jsonl
Как работает восстановление
- Сканировать все файлы
batch_*.jsonlдля объекта завершенных промптов (по совпадению результатов). - Отфильтровать набор данных, создав уже готовые предложения.
- Переупаковать функции
- Обработайте только функции
- Объединить все файлы пакетов (старые + новые) в итоговом выводе.
Фильтрация качества
Пакетный раннер применяет автоматическую фильтрацию качества:
- Фильтр событий рассуждений: Образцы, в которых ни один шаг ассистента не содержит рассуждений (нет
<REASONING_SCRATCHPAD>или собственных токенов мышления), выбрасываются - Фильтр поврежденных записей: Записи с вымышленными именами инструментов (не входящих в допустимый список инструментов) отфильтровываются во время окончательного объединения.
- Статистика рассуждений: Отслеживает процент шагов с/без рассуждений во всем запуске.
Статистика
После завершения раннера выводит подробную статистику:
- Использование инструментов: Количество вызовов, процент успехов/неудач для каждого инструмента.
- Покрытие рассуждений: Процент шагов ассистента с рассуждениями
- Отброшенные фрагменты: Количество образцов, отфильтрованных из-за особенностей рассуждений.
- Длительность: Общее время обработки.
Статистика также сохраняется в 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-образам перед запуском каждого из них.