ML-эксперименты и работа с пайплайнами
ML-цикл принципиально отличается от обычной разработки: здесь нет «готово» — есть метрика, гипотеза, эксперимент и снова гипотеза. Переключение между чтением данных, написанием трансформаций, настройкой трекинга и отладкой пайплайна занимает непропорционально много времени — и именно здесь Claude Code вставляет агентный слой. Но у этого инструмента есть чёткая граница: он умеет писать код, читать файлы и запускать команды, но не видит числа в реальном времени и не интерпретирует метрики за вас.
Где агент действительно ускоряет ML-цикл
Practitioners обычно теряют время не на самом обучении, а вокруг него: скаффолдинг конфигов, подготовка данных, написание повторяющегося boilerplate, отладка упавшего шага пайплайна. Это именно то, на что Claude Code тратит секунды вместо часов.
Подготовка данных. Агент хорошо читает структуру датасета и пишет чистую трансформацию:
Посмотри на @data/raw/train.parquet и @src/features/config.yaml.
Напиши скрипт src/features/build_features.py, который:
- нормализует числовые колонки по списку из конфига
- энкодит категориальные через target encoding (используй category_encoders)
- разбивает на train/val по стратифицированному сплиту (stratify по label)
- сохраняет в data/processed/ в формате parquet
В начале скрипта — assert-проверки на ожидаемые колонки и типы.Агент пишет такой скрипт в стиле уже существующего кода рядом — если дать ему примеры из проекта через @. Это тот же принцип «схема первая», что работал с SQL, только теперь вместо схемы БД — структура датасета и конфиг фич.
Скаффолдинг эксперимента. Создание нового эксперимента с MLflow — рутина, которая занимает 20–30 минут вручную (конфиги, логирование, сохранение артефактов). Агент делает это по образцу:
В проекте уже есть experiments/baseline/ с MLflow-трекингом.
Создай experiments/attention_pooling/ по той же структуре:
- train.py с логированием гиперпараметров, метрик per epoch и финального val_f1
- config.yaml с параметрами модели
- README.md с описанием гипотезы
Гипотеза: замена mean pooling на attention pooling в классификаторе улучшит F1 на несмотря на +15% параметров.Важно: гипотезу и интерпретацию результатов пишете вы. Агент создаёт инфраструктуру для её проверки.
Jupyter vs. marimo: что работает с агентом
Предыдущая статья о Данных, SQL и аналитике описала два пути для Jupyter: встроенный NotebookEdit (без доступа к ядру) и Jupyter MCP Server (с полным циклом «написал → запустил → прочитал вывод»). В ML-контексте к этому добавляется ещё одна рекомендация.
marimo — реактивная замена Jupyter, которая хранит ноутбуки как обычный .py-файл. Claude Code работает с ним как с любым Python-файлом: читает, редактирует, запускает через bash. Никакого JSON, никаких спрятанных состояний ячеек — и никакого специального MCP-сервера для базового цикла. Команда marimo run notebook.py запускает воспроизводимый ноутбук без «грязи» от порядка исполнения ячеек.
# Установка
pip install marimo
# Запуск существующего ноутбука в Claude Code
claude
# затем в диалоге:
# > запусти marimo run experiments/eda.py и покажи выводДля тяжёлого EDA, где нужно видеть графики в реальном времени — всё же лучше Jupyter MCP Server. Для ML-скриптов, где важна воспроизводимость — marimo или чистые .py-файлы.
flowchart TD
A[Данные / raw] --> B[Подготовка фичей<br/>агент пишет скрипт]
B --> C[data/processed/]
C --> D[Скаффолдинг эксперимента<br/>агент создаёт структуру]
D --> E[train.py + config.yaml<br/>+ MLflow/W&B логирование]
E --> F[Запуск обучения<br/>вы / CI]
F --> G[Артефакты и метрики<br/>MLflow / W&B]
G --> H{Анализ результатов<br/>агент или вы?}
H -->|Структурированный анализ| I[claude -p на mlruns/]
H -->|Интерпретация| J[Вы: выбор гипотезы]
J --> D
E --> K[Воспроизводимость<br/>агент проверяет seeds,<br/>конфиги, версии]
style H fill:#f5a623,color:#000
style J fill:#d0021b,color:#fffТрекинг экспериментов: настройка через агента
Настроить MLflow или Weights & Biases в новом проекте — задача с множеством мелких шагов, которые легко делегировать:
Проект на PyTorch, используем MLflow для трекинга.
Сейчас в train.py нет никакого логирования.
1. Добавь mlflow.start_run() с автоматическим именем run из конфига
2. Логируй все поля из config.yaml как params
3. Логируй train_loss и val_loss каждую эпоху
4. В конце — log_metric("best_val_f1", ...) и mlflow.pytorch.log_model()
5. Добавь в requirements.txt mlflow>=2.10
Образец структуры конфига: @configs/baseline.yaml
Образец train.py: @experiments/baseline/train.pyАгент напишет боilerplate, сохранит стиль существующего кода и не забудет mlflow.end_run() в finally-блоке — что часто забывает человек. После — проверяете код глазами и запускаете.
W&B — аналогично, только синтаксис другой. Если в проекте уже есть один интегрированный скрипт, дайте его агенту как образец и попросите портировать трекинг на новый эксперимент.
Пайплайны: отладка и расширение
ML-пайплайны на Airflow, Prefect или Metaflow обычно падают в самый неожиданный момент. Claude Code хорошо справляется с двумя сценариями.
Дебаг упавшего пайплайна. Дайте агенту лог и код:
Vот лог упавшего DAG в Airflow:
<paste traceback>
Файл DAG: @dags/training_pipeline.py
Файл задачи: @src/pipeline/train_task.py
Найди причину, предложи фикс и добавь обработку этой ошибки.Агент видит контекст обоих файлов, читает трейсбэк и часто сразу указывает на корень проблемы — неправильный путь к артефакту, несовпадение типов, пропущенная зависимость между тасками.
Добавление нового шага. Если пайплайн нужно расширить — дайте агенту существующий DAG как образец:
Посмотри на структуру @dags/training_pipeline.py.
Добавь новый шаг evaluate_on_holdout после задачи train_model:
- загружает лучший checkpoint из MLflow по run_id
- прогоняет инференс на @data/holdout.parquet
- сохраняет отчёт в reports/holdout_metrics.json
- при метрике f1 < 0.75 помечает таск как failed
Сохрани стиль: те же паттерны retry, те же переменные Airflow, тот же формат логирования.Символ @ для подгрузки файлов в контекст — это всё тот же механизм из CLAUDE.md и система памяти. Здесь он работает как «передать образец стиля».
Воспроизводимость: агент как контролёр гигиены
Воспроизводимость ML-эксперимента зависит от множества мелочей, которые легко упустить: random seed, версии библиотек, фиксированный порядок данных. Claude Code можно попросить пройтись по коду и найти проблемы:
Проверь experiments/attention_pooling/train.py на воспроизводимость:
- Все random seed зафиксированы? (torch, numpy, random, cuda)
- Версии зависимостей пришпилены в requirements.txt?
- Путь к данным не хардкодится в коде?
- Результаты сохраняются с run_id, а не перезаписывают предыдущие?
Внеси необходимые правки.Типичный результат: агент добавляет torch.backends.cudnn.deterministic = True, заменяет хардкодированный путь на Path(config.data_dir) и дополняет requirements.txt точными версиями.
Конфиги вместо аргументов командной строки. Если в проекте параметры передаются через десятки argparse-аргументов — это сигнал перейти на YAML-конфиги (Hydra, OmegaConf). Агент умеет делать этот рефакторинг:
Портируй @experiments/baseline/train.py с argparse на Hydra.
Конфиги должны лежать в configs/, базовый конфиг — configs/default.yaml.
Групповые конфиги: configs/model/, configs/data/.
Сохрани все существующие параметры.После рефакторинга каждый запуск эксперимента имеет зафиксированный конфиг-файл — воспроизвести прогон с теми же параметрами становится тривиальной задачей.
Headless-режим для запуска серий экспериментов
Когда нужно прогнать серию конфигов — например, grid search по learning rate и batch size — можно использовать headless-режим Claude Code в связке с shell-скриптом. Подробнее о headless-режиме — в Headless-режим и скриптинг через CLI, здесь только ML-паттерн:
# Прогнать анализ результатов после серии экспериментов
claude -p "
Посмотри на mlruns/ и найди все run-ы с тегом experiment=attention_pooling.
Сравни val_f1 по learning_rate и batch_size.
Выведи таблицу: lr | batch | best_val_f1 | best_epoch
Выдели конфиг с наилучшим val_f1.
" --output-format json > results/sweep_analysis.jsonАгент читает артефакты MLflow напрямую из файловой системы и возвращает структурированный результат. Не нужно открывать UI или писать pandas-скрипт для анализа.
Где нужен надзор человека
МL — область, где неправильная интерпретация стоит дорого. Вот где агент требует явного контроля:
Выбор метрики. Claude Code сгенерирует код для любой метрики, которую попросите, — но выбор правильной (precision vs. recall при несбалансированных классах, NDCG vs. MAP для ранжирования) остаётся за вами. Агент не знает, что важнее для вашего продукта.
Интерпретация результатов. «val_loss перестала падать на эпохе 8» — это ранняя остановка или переобучение? Агент видит числа, но не понимает контекста: сколько данных, насколько сложная задача, приемлем ли такой val_f1 для деплоя.
Data leakage. Агент пишет сплиты и трансформации честно в рамках того, что вы описали — но не всегда обнаруживает утечку фичей из будущего. Сложный leakage (e.g., target encoding сделан до сплита) требует ревью человека.
Производственные данные. Правило из предыдущей статьи работает здесь вдвойне: агент с доступом к S3 или удалённой БД может изменить данные, если попросить неосторожно. Отдельный read-only IAM-пользователь для агента — не паранойя, а стандарт.
See also
- Данные, SQL и аналитика — подключение БД через MCP, Jupyter MCP Server и паттерны EDA, на которых строится этот раздел
- Субагенты и контекстная изоляция — вынести параллельные прогоны экспериментов в изолированные субагенты
- Headless-режим и скриптинг через CLI —
claude -pдля автоматизации анализа результатов и интеграции с CI - CLAUDE.md и система памяти — зафиксировать соглашения по именованию экспериментов, структуру проекта и стиль конфигов
- Типовые рабочие процессы: исследование, план, реализация — паттерн explore → plan → code, который хорошо ложится на ML-цикл
- Управление контекстным окном — большие логи обучения и MLflow-артефакты быстро заполняют контекст; стратегии управления
- Практика: GitHub, базы данных и веб-API через MCP — готовые конфигурации MCP для доступа к данным в ML-пайплайнах
Источники
- Building Data Pipelines with Claude Code: Engineering Reliable, Reproducible LLM Systems
- Using Claude Code with marimo
- Can Claude Code Analyze Jupyter Notebooks for Data Science? What It Actually Does – Kanaries
- Getting Started with Claude Code for Data Scientists – Dataquest
- ML Experiment Tracker: Claude Code Skill
- Best practices for Claude Code