Вместо пирамиды из unit/integration/e2e, для LLM мы строим пирамиду из юнит-тестов промптов, интеграционных тестов пайплайна и A/B тестов в продакшене.
УРОВЕНЬ 1: Юнит-тесты промптов (Самый важный)
Вы тестируете не код, а промпт - как инструкцию для модели.
Assert на структуру (JSON mode): Если вы попросили модель вернуть JSON, проверьте, что это валидный JSON. (Самый простой и надёжный тест).
python
import json
def test_response_is_valid_json():
response = model.generate("Верни JSON: {\"name\": \"John\"}")
assert json.loads(response) is not None # Не упадёт, даже если там пробелы.
Assert на наличие (Keyword / Semantic check): Проверьте, что в ответе есть нужное слово или смысл.
python
def test_contains_paris():
response = agent.ask("Найди билеты в Париж")
assert "Париж" in response or "Paris" in response
Схемы и Guardrails (Pydantic)
Обязательно на выходе используйте валидацию. LLM может вернуть {"name": null}, хотя вы просили строку. Библиотеки вроде Outlines или Instructor заставляют модель физически не сгенерировать невалидные токены.
УРОВЕНЬ 2: Интеграционные тесты с эмуляцией (Mocking)
Агент вызывает get_weather(city). Вы не хотите дёргать реальный API погоды в CI/CD (это медленно и платно). Вы подменяете (мокаете) вызов.
python
# Эмуляция внешнего API
def test_agent_handles_api_error():
with mock.patch('weather_api.get', side_effect=TimeoutError):
response = agent.ask("Погода в Москве?")
assert "ошибка" in response or "повторите позже" in response
Этот тест проверит отказоустойчивость агента. Что будет, если API упал? Агент должен не упасть сам, а красиво сказать: «Не могу получить данные».
УРОВЕНЬ 3: Канареечные релизы (Canary) в продакшене
Вы никогда не узнаете правду о модели, пока не пустите её на реальных пользователей.
Shadow Mode (Теневой режим):
Новая модель запускается параллельно со старой. Пользователи видят ответ старой. Ответы новой пишутся в лог.
Вопрос: Новая модель сэкономила бы 10% токенов, но не стала ли она чаще галлюцинировать? Вы узнаете это через неделю логов, а не через жалобу клиента.
Canary (1% -> 10% -> 50%):
Пускаем новую модель на 1% пользователей. Смотрим метрику «Повтор вопроса» (если ответ плохой, пользователь переспросит) и «Отказ от сессии». Если метрики не упали - поднимаем до 10%.
Это золотой стандарт оценки LLM в 2025–2026 годах. Вы не можете нанять 1000 человек для оценки каждого ответа. Вы берёте GPT-4 (или Claude 3.5) и говорите: «Оцени ответ моего агента».
Как это работает
python
judge_prompt = """
Ты - суровый экзаменатор. Оцени ответ ассистента по шкале от 0 до 5.
Критерии:
1. Точность: Нет галлюцинаций.
2. Полнота: Ответ на все части вопроса.
3. Стиль: Вежливо, понятно.
Пользователь спросил: {user_query}
Ассистент ответил: {assistant_answer}
Верни ТОЛЬКО JSON: {"score": int, "reason": "..."}
"""
Почему это работает?
Исследования показывают, что корреляция GPT-4 с человеческой оценкой составляет 80-90% для типовых задач. Это достаточно для того, чтобы автоматически прогонять 500 тестов после каждого изменения промпта.
Риски (чтобы не попасть)

Мало сказать «агент хороший». Нужны цифры, на которых держится бюджет.
Что это
Доля задач, где агент достиг цели, а не просто дал ответ.
Пример:
Пользователь просил «Найди билет в Париж до 300 евро». Агент нашёл билет за 280 евро и предложил его - Success. Агент дал ссылку на Авиасейлс - Fail (цель не достигнута, он просто скинул сайт).
Как считать:
Human-оценка (выборка 100 кейсов) или LLM-as-a-Judge.
Что это: % случаев, когда агент вызвал правильный инструмент с правильными параметрами.
Пример: Задача: «Поставь будильник на 7 утра».
Верно: call_tool("set_alarm", {"time": "07:00"})
Ошибка (инструмент): call_tool("get_weather", ...) -> Fail.
Ошибка (параметры): call_tool("set_alarm", {"time": "19:00"}) -> Fail (перепутал утро/вечер).
Что это: Среднее количество шагов (вызовов LLM) на решение одной задачи.
Зачем: Если TSR = 95%, но агент делает 20 шагов там, где человек сделал бы 3 - вы разоритесь на токенах. SE - это метрика экономики.
Аномалии: Если SE резко вырос (с 4 до 10), агент, вероятно, вошёл в цикл: «думаю -> вызываю API -> думаю -> вызываю API -> ...».
Что это: Доля фактов в ответе, которые можно подтвердить контекстом (RAG) или инструментами.
Пример: RAG дал документ: «Компания заработала 1 млн». Модель говорит: «Компания заработала 1 млн, что на 10% больше, чем в прошлом квартале».
«1 млн» - Grounded (есть в контексте).
«+10%» - Hallucination (нет в контексте). Grounding падает.
Инструменты: BERTScore, ALIGNScore или LLM-as-a-Judge с промптом «Проверь, что все цифры из документа».