Как тестировать AI-агентов: TestThread и подход «pytest для агентов»
AI-агент ломается молча — неправильный ответ, утечка данных, провал вызова инструмента. TestThread решает эту проблему: фреймворк позволяет писать тесты для многоходовых диалогов с агентами, как pytest для обычного кода.
Проблема, которую все игнорируют
В продакшене работает больше десятка AI-агентов. Они пишут контент, обрабатывают данные, взаимодействуют с пользователями. И вот что точно известно: каждый из них ломался. Не с грохотом и красным стектрейсом — а тихо. Агент возвращал не тот ответ, галлюцинировал, вызывал не тот инструмент. Узнаёшь об этом, когда что-то дальше по цепочке шло не так.
Классическое ПО мы тестируем десятилетиями. Unit-тесты, интеграционные тесты, e2e — всё работает, потому что код детерминирован. Вызвал функцию с одними аргументами — получил один результат. Всегда.
С AI-агентами так не работает. Один и тот же промпт может дать разный ответ. Агент может решить пойти другим путём. Температура, контекстное окно, даже порядок сообщений — всё влияет. И возникает фундаментальный вопрос: как тестировать то, что по определению недетерминировано?
TestThread: что это и зачем
TestThread — открытый фреймворк, который подходит к этой проблеме прагматично. Вместо того чтобы требовать от агента идентичных ответов, он проверяет поведение: сделал ли агент то, что должен был, в правильном порядке, с правильным результатом.
Аналогия с pytest точная: вы описываете сценарий, определяете ожидания, запускаете — получаете pass/fail. Но вместо assert result == 42 вы пишете ассерты на семантику, траекторию действий и отсутствие утечек данных.
Доступны Python и JavaScript SDK — фреймворк не привязан к одному стеку.
Четыре типа проверок
TestThread предлагает четыре способа матчинга ответов — ключевое отличие от попытки тестировать агентов через assertEqual:
- Exact match — классическое точное совпадение. Работает для структурированных ответов: JSON, коды ошибок, фиксированные фразы.
- Contains match — проверка наличия подстроки. Полезно, когда важно, что агент упомянул конкретный факт, но формулировка может варьироваться.
- Regex match — регулярные выражения для проверки формата. Дата в нужном формате, номер заказа, структура URL.
- Semantic match — AI-судья оценивает, совпадает ли смысл ответа с ожидаемым. Агент может ответить «Заказ будет доставлен во вторник» или «Доставка запланирована на вторник, 25 марта» — семантически одно и то же, тест проходит.
Семантический матчинг — это то, что делает тестирование недетерминированных систем реальным. Вы проверяете не букву, а дух ответа.
Тестирование траекторий, а не только выходов
Отдельно стоит остановиться на trajectory assertions — проверке пути, которым агент пришёл к ответу.
Представьте: агент должен найти информацию в базе знаний, а затем сформулировать ответ. Он может дать правильный ответ, но не обратившись к базе — просто галлюцинировав. Выход совпадает, но процесс неправильный. Trajectory assertions позволяют проверить, что агент:
- Вызвал нужные инструменты
- Вызвал их в правильном порядке
- Не вызывал запрещённые инструменты
- Прошёл все обязательные шаги
Это принципиально отличает TestThread от простого сравнения выходов. Вы тестируете не что агент сказал, а что он сделал.
AI-диагностика сбоев
Когда тест падает, TestThread не просто говорит «fail». Он запускает AI-диагностику: объясняет, почему ответ агента не прошёл проверку, и предлагает возможное исправление.
Это экономит часы отладки. Вместо того чтобы вручную разбирать логи диалога, вы получаете конкретный диагноз: «Агент не вызвал инструмент поиска и сгенерировал ответ из общих знаний, хотя вопрос требовал актуальных данных. Рекомендация: усилить системный промпт инструкцией всегда обращаться к поиску для вопросов о текущих событиях».
PII-детекция
Функция, о которой мало кто думает до первого инцидента: автоматическая проверка на утечку персональных данных. TestThread сканирует ответы агента на наличие PII — номеров телефонов, email-адресов, номеров документов — и автоматически проваливает тест при обнаружении.
Для любого агента, работающего с пользовательскими данными, это не опция, а необходимость. Один случай утечки PII в ответе — и у вас проблемы с GDPR, ФЗ-152 или репутацией.
Регрессионное тестирование
TestThread отслеживает pass rate по каждому тесту во времени. Если после обновления модели или промпта процент прохождения тестов падает — фреймворк явно сигнализирует о регрессии.
Это критически важно при обновлениях моделей. Перешли с GPT-4o на GPT-4.1? Обновили Claude? Поменяли системный промпт? Запустите тестовый набор и увидите, что сломалось, до того как это увидят пользователи.
Интеграция в CI/CD
TestThread поставляется с готовым GitHub Action. Тесты агента запускаются на каждый push, как обычные unit-тесты. Плюс поддержка расписания — hourly, daily, weekly прогоны.
Пайплайн выглядит просто:
- Push изменений в промпты или конфигурацию агента
- CI запускает TestThread
- Тесты проходят → деплой
- Тесты падают → PR блокируется, разработчик получает AI-диагностику
Это превращает разработку агентов из «поменял промпт, помолился и задеплоил» в нормальный инженерный процесс.
Оценка стоимости
Каждый прогон тестов — это вызовы LLM, а значит, деньги. TestThread показывает оценку стоимости каждого прогона. Можно контролировать бюджет на тестирование и оптимизировать: какие тесты запускать на каждый push, какие — раз в день.
Практические рекомендации
Начните с критических путей. Не пытайтесь покрыть тестами каждый сценарий сразу. Определите 5-10 ключевых сценариев, где ошибка агента стоит дороже всего, и напишите тесты для них.
Используйте semantic match как основной тип. Exact match для агентов — это ловушка. Вы будете вечно чинить тесты, которые падают из-за изменения формулировки, а не смысла.
Добавьте trajectory assertions для агентов с инструментами. Если агент умеет вызывать API, ходить в базу данных, выполнять код — проверяйте не только ответ, но и путь к нему.
Запускайте тесты при каждом изменении промптов. Промпт — это код вашего агента. Изменение промпта без тестирования — как push в main без CI.
Мониторьте регрессии при обновлении моделей. Новая версия модели — это новый рантайм. Всегда прогоняйте полный набор тестов.
Итог
Индустрия AI-агентов дозревает до того же осознания, через которое прошла обычная разработка 20 лет назад: без тестов нельзя. Код без тестов — это не код, это прототип. Агент без тестов — это не продукт, это демо.
TestThread не решает все проблемы тестирования AI, но даёт рабочий инструмент: написал тест, запустил, получил результат. Как pytest. Только для агентов.