Applied ML path
Результат главы
После главы вы сможете:
- решить, где достаточно prompt/tool/eval, а где уже нужна обучаемая модель;
- записать experiment contract до обучения;
- разделить train, calibration и test без entity leakage;
- выбрать короткий T-shaped маршрут для backend-разработчика;
- связать offline metric с runtime decision и production outcome.
Зачем agent engineer нужен Applied ML
Agentic-система создаёт данные: intents, tool trajectories, retrieval judgments, approval outcomes, escalation reasons, latency и ошибки. Но данные сами по себе не улучшают систему. Нужен контролируемый цикл:
Applied ML здесь — не обязанность обучать foundation model. Чаще первый полезный шаг намного меньше:
- intent classifier перед дорогим LLM route;
- retrieval reranker;
- anomaly/escalation score;
- keyword spotter или VAD для voice channel;
- calibration layer и abstention policy.
Когда не нужна новая модель
Сначала проверьте более дешёвые причины ошибки:
- неверный task contract;
- отсутствующий или слишком широкий tool;
- stale/неполный context;
- плохой retrieval corpus;
- policy блокирует корректное действие;
- eval измеряет текст вместо outcome.
Обучение модели не исправит невалидный API, cross-tenant retrieval или crash между эффектом и checkpoint. Оно имеет смысл, когда повторяемая ошибка локализована в статистическом decision boundary и есть данные для её проверки.
T-shaped маршрут
Для вашего профиля практичный порядок такой:
- Горизонталь: dataset schema, leakage, metrics, calibration, experiment tracking, serving.
- Вертикаль: TF-IDF/logistic-regression classifier до сложной NLP-модели.
- Вторая вертикаль при необходимости: VAD/KWS/endpointing для telehealth или support voice.
- Только затем: fine-tuning, neural retrieval или тяжёлый inference stack, если baseline доказуемо упёрся в потолок.
Минимум Python, который действительно нужен
| Навык | Для чего в лабораториях |
|---|---|
| dataclass/type hints | Явный dataset и report contract |
| NumPy arrays | Features, probabilities, audio windows |
| pandas | Анализ табличных public datasets |
| scikit-learn pipeline | Воспроизводимый baseline |
| pytest | Hand-computable contracts и regression tests |
| uv lockfile | Одинаковая среда локально и в CI |
Нужны также основы вероятности: conditional probability, class prior, precision/recall, threshold и calibration. Градиенты полезны позже; начинать с реализации transformer не требуется.
Experiment contract
До запуска обучения зафиксируйте:
| Поле | Пример Helios |
|---|---|
| Product decision | route to delivery/wallet/rental или fallback |
| Unit of prediction | одно новое user message |
| Label owner | support taxonomy v3 |
| Positive/negative cost | неверный wallet route дороже abstain |
| Dataset version/provenance | synthetic v1 или CFPB snapshot + hash |
| Grouping key | conversation/customer/case, выбранный до split |
| Splits | train / calibration / untouched test |
| Baseline | majority и TF-IDF/logistic regression |
| Metrics | macro F1, per-class recall, coverage, calibration |
| Threshold | min_confidence=0.55 |
| Stop condition | не лучше baseline или нарушен safety slice |
| Deployment | shadow → limited canary → rollback |
Без этого «accuracy стала 91%» почти ничего не говорит: неизвестны population, class balance, leakage, цена ошибок и действие после предсказания.
Split — часть product semantics
Наивный random row split часто размещает сообщения одного клиента или одного инцидента и в train, и в test. Модель узнаёт entity-specific слова, а отчёт притворяется generalization.
В Helios group_train_calibration_test_split один раз детерминированно раскладывает весь entity_id по трём попарно непересекающимся subsets. Classifier fit использует только train, temperature/threshold выбираются только на calibration, а test остаётся untouched до финального отчёта. Если grouping entity содержит несколько labels, функция требует выбрать более подходящий homogeneous key вместо молчаливого компромисса.
В production возможны другие оси leakage:
- время: будущие кейсы попали в прошлое;
- template: почти одинаковые auto-generated тексты в разных splits;
- actor: один speaker/merchant/patient присутствует везде;
- teacher: test labels созданы тем же teacher prompt и не проверены независимо;
- retrieval corpus: answer text оказался прямо внутри query fixture.
Три варианта начала
| Подход | Получаем | Платим | Плохой выбор, когда |
|---|---|---|---|
| Rules/keywords | Быстро, объяснимо | Хрупкие границы | Язык и intents быстро меняются |
| Classical baseline | Дёшево, CPU, probabilities | Ограниченная семантика | Нужен сложный compositional meaning |
| Fine-tuned neural model | Больше capacity | Data/GPU/serving complexity | Нет сильного baseline и dataset contract |
Правильный baseline — не формальность. Он задаёт минимальную ценность, которую сложная модель обязана превзойти на тех же splits и product metrics.
Public data — только явный opt-in
CI курса использует синтетические fixtures и никогда не выходит в сеть. Скрипт загрузки поддерживает три внешних источника и рядом сохраняет URL, timestamp, вычисленный SHA-256, license note и caveat. Если у source задан доверенный expected_sha256, файл атомарно публикуется со статусом verified; mismatch удаляет .part до появления final path. Если эталона нет, статус — recorded_only: provenance помогает воспроизвести байты, но сам по себе не аутентифицирует источник.
- CFPB Consumer Complaint Database — реальные complaint categories/narratives, но не репрезентативная выборка всех потребителей;
- CFPB Terms of Credit Card Plans — product/price comparison snapshot, который устаревает;
- Google Speech Commands — CC BY 4.0 English keyword data, не покрывающие все языки, акценты и каналы.
Лаборатория
Из корня репозитория:
npm run test:ml
Затем:
cd examples/helios_ml
uv run --frozen python scripts/train_intent_classifier.py
uv run --frozen python scripts/evaluate_retrieval.py
uv run --frozen python scripts/profile_serving.py
Сверьте dataset_size, split, seed, threshold, metrics и artifact path. Измените seed; затем специально сделайте row split и объясните, почему изменение метрики ещё не доказывает улучшение.
Self-check
- Какое runtime decision использует prediction?
- Что является grouping entity и почему?
- Calibration set отделён от test?
- Какая цена false accept и false reject?
- Что произойдёт при низкой confidence?
- Какой artifact и dataset hash можно воспроизвести?
- Какая production metric подтверждает offline improvement?
Источники
Проверено 2026-08-30: