Пакетная обработка
Пакетная обработка позволяет запускать агента VibeOS на сотнях или тысячах промптов параллельно, генерируя структурированные данные траекторий. В первую очередь это используется для генерации обучающих данных — создания траекторий в формате 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
Пакетные запуски создают множество параллельных сессий агента, каждая из которых совершает вызовы моделей и инструментов. Подписка Nous Portal объединяет доступ к моделям, веб-поиску, генерации изображений, TTS и облачным браузерам в единый счёт — это удобно, когда нужна стабильная стоимость за траекторию без необходимости балансировать лимиты запросов между пятью поставщиками. Настройте с помощью vibeos setup --portal, затем укажите --model на модель Nous.
Формат набора данных
Входной набор данных — это файл JSONL (по одному JSON-объекту на строку). Каждая запись должна содержать поле prompt:
{"prompt": "Напишите функцию на Python, которая находит самую длинную палиндромную подстроку"}
{"prompt": "Создайте конечную точку REST API для аутентификации пользователей с помощью Flask"}
{"prompt": "Отладьте эту ошибку: TypeError: cannot unpack non-iterable NoneType object"}
Записи могут опционально включать:
imageилиdocker_image: образ контейнера для песочницы этого промпта (работает с бэкендами Docker, Modal и Singularity)cwd: переопределение рабочей директории для терминальной сессии задачи
Параметры конфигурации
| Параметр | По умолчанию | Описание |
|---|---|---|
--dataset_file | (обязательный) | Путь к набору данных JSONL |
--batch_size | (обязательный) | Промптов на пакет |
--run_name | (обязательный) | Имя запуска (используется для выходной директории и контрольных точек) |
--distribution | "default" | Распределение наборов инструментов для выборки |
--model | claude-sonnet-4.6 | Используемая модель |
--base_url | https://openrouter.ai/api/v1 | Базовый URL API |
--api_key | (переменная окружения) | Ключ API для модели |
--max_turns | 10 | Максимальное количество итераций вызова инструментов на промпт |
--num_workers | 4 | Количество параллельных рабочих процессов |
--resume | false | Возобновить с контрольной точки |
--verbose | false | Включить подробное логирование |
--max_samples | все | Обработать только первые N образцов из набора данных |
--max_tokens | по умолчанию модели | Максимальное количество токенов на ответ модели |
Маршрутизация провайдеров (OpenRouter)
| Параметр | Описание |
|---|---|
--providers_allowed | Разрешённые провайдеры через запятую (например, "anthropic,openai") |
--providers_ignored | Игнорируемые провайдеры через запятую (например, "together,deepinfra") |
--providers_order | Предпочтительный порядок провайдеров через запятую |
--provider_sort | Сортировка по "price", "throughput" или "latency" |
Управление рассуждениями
| Параметр | Описание |
|---|---|
--reasoning_effort | Уровень усилий: none, minimal, low, medium, high, xhigh |
--reasoning_disabled | Полное отключение токенов рассуждений/мышления |
Расширенные параметры
| Параметр | Описание |
|---|---|
--ephemeral_system_prompt | Системный промпт, используемый во время выполнения, но НЕ сохраняемый в траектории |
--log_prefix_chars | Символы для отображения в предпросмотре логов (по умолчанию: 100) |
--prefill_messages_file | Путь к JSON-файлу с предзаполненными сообщениями для few-shot прайминга |
Распределения наборов инструментов
Для каждого промпта случайным образом выбирается набор инструментов из распределения. Это гарантирует, что обучающие данные охватывают разнообразные комбинации инструментов. Используйте --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": "Напишите функцию..."},
{"from": "gpt", "value": "Я создам эту функцию...",
"tool_calls": [...]},
{"from": "tool", "value": "..."},
{"from": "gpt", "value": "Вот готовая функция..."}
],
"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": "Установите numpy и вычислите собственные значения матрицы 3x3", "image": "python:3.11-slim"}
{"prompt": "Скомпилируйте эту программу на Rust и запустите её", "image": "rust:1.75"}
{"prompt": "Настройте сервер Node.js Express", "image": "node:20-alpine", "cwd": "/app"}
Пакетный раннер проверяет доступность образов Docker перед запуском каждого промпта.