Построй регрессионный тест-сет.
Принцип
Каждый найденный баг → один новый test case. Через год у тебя сильная защита от регрессий.
Что туда попадает
✓ Кейсы где модель ошиблась в продакшене ✓ Edge cases которые забыли покрыть ✓ Adversarial prompts которые сломали что-то ✓ Customer-reported bugs
Не туда: ✗ Каждый возможный input (unfocused) ✗ Кейсы которые проходят 99% случаев (нет ценности)
Структура теста
- id: bug-2025-04-15-currency
category: regression
date_added: 2025-04-15
context: "User asked about price; model returned wrong currency"
bug_ticket: SUPPORT-1234
input:
user_message: "How much is the Pro plan?"
user_locale: "ru-RU"
expected:
- currency_in_response: "RUB"
- mentions_amount: true
- language: "Russian"
should_not:
- mentions: ["dollar", "USD", "$"]
notes: |
Bug: модель отвечала в USD игнорируя user_locale.
Fix: добавили locale в системный промт.
Шаги добавления нового теста
1. Зафиксируй баг
Сохрани:
- Точный input что вызвал
- Что модель ответила (плохой output)
- Что должна была ответить
- Когда обнаружено
2. Минимизируй
Уменьши до минимально необходимого input'а который воспроизводит.
3. Добавь assertions
Какие проверки бы поймали этот баг?
contains/does_not_containmatches_patternmax_length/min_length- Custom check (если сложно)
4. Verify failed before fix
Прогон теста до фикса — должен fail. Это доказывает что тест что-то ловит.
5. Apply fix + verify passed
После фикса — должен pass.
6. Add to permanent set
Категоризация
Группируй по типам:
regression/locale— баги с локалямиregression/format— формат выводаregression/safety— небезопасный outputregression/factuality— фактическая ошибкаregression/tool_use— неверное использование инструмента
Запуск
- На каждое изменение промта / модели → весь regression set
- Не обычно убирать тесты — они становятся защитой
- Если тест становится не релевантен — удалить с обоснованием в комменте
Lifecycle теста
new → проверен → permanent
permanent → flaky → fix or remove
permanent → outdated → archive с комментом
Метрики
- Размер set'а растёт со временем
- Pass rate должен быть ~100% (отклонения = регрессия)
- Time to run — оптимизируй (parallel, кеш)
- Coverage по категориям — нет ли gap'ов
Когда тест ложно срабатывает
Тест fail на новом промте, но новый промт правильный?
- Перепроверь expected
- Может быть это новая фича которая legitimately меняет поведение?
- Обнови expected с комментом + переcommit baseline
Не делай это часто — иначе тесты становятся бесполезными.
Анти-паттерны
- ❌ Тест который проверяет точную строку вывода (хрупкий)
- ❌ Удаление теста потому что "стал fail" без анализа
- ❌ Один тест который проверяет 10 вещей (если падает — не ясно почему)
- ❌ Не помечать тесты по типу бага — не видишь паттернов
В конце
- Список 10+ regression тестов (если у тебя уже есть production)
- Категоризация
- Runner config
- Doc как добавлять новые
Матрица функциональной регрессии
Exhaustive матрица: список ВСЕХ интерактивных функций × текущий статус (pass / partial / fail / not tested) × cross-browser/device. Не выборка — система.
Тест-сюита для агента
Набор кейсов и автоматическая прогонка с проверкой ожидаемого поведения.
Eval-фреймворк для LLM
Как мерить качество промтов и агентов: test set, метрики, автоматизация.