Перейти к основному содержимому

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

Пакетная обработка позволяет запускать агента 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"Распределение наборов инструментов для выборки
--modelclaude-sonnet-4.6Используемая модель
--base_urlhttps://openrouter.ai/api/v1Базовый URL API
--api_key(переменная окружения)Ключ API для модели
--max_turns10Максимальное количество итераций вызова инструментов на промпт
--num_workers4Количество параллельных рабочих процессов
--resumefalseВозобновить с контрольной точки
--verbosefalseВключить подробное логирование
--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

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

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

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

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

  • Фильтр отсутствия рассуждений: Образцы, в которых ни один из ответов ассистента не содержит рассуждений (нет <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 перед запуском каждого промпта.