Книга: Инжиниринг искусственного интеллекта
Назад: Е.1 Проблема: нейросеть не возвращает 2+2
Дальше: Е.5 Регрессионное тестирование: библиотека nightmare

Е.2 Три слоя тестирования (Пирамида для LLM)

Вместо пирамиды из 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%.



Е.3 LLM-as-a-Judge: когда модель проверяет модель

Это золотой стандарт оценки 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 тестов после каждого изменения промпта.



Риски (чтобы не попасть)





Е.4 Метрики надежности: как измерить «качество агента»



Мало сказать «агент хороший». Нужны цифры, на которых держится бюджет.





E.4.1 Task Success Rate (TSR) - Самая важная метрика





Что это

Доля задач, где агент достиг цели, а не просто дал ответ.





Пример:

Пользователь просил «Найди билет в Париж до 300 евро». Агент нашёл билет за 280 евро и предложил его - Success. Агент дал ссылку на Авиасейлс - Fail (цель не достигнута, он просто скинул сайт).





Как считать:

Human-оценка (выборка 100 кейсов) или LLM-as-a-Judge.





E.4.2 Tool Call Accuracy (TCA)





Что это: % случаев, когда агент вызвал правильный инструмент с правильными параметрами.

Пример: Задача: «Поставь будильник на 7 утра».

Верно: call_tool("set_alarm", {"time": "07:00"})

Ошибка (инструмент): call_tool("get_weather", ...) -> Fail.

Ошибка (параметры): call_tool("set_alarm", {"time": "19:00"}) -> Fail (перепутал утро/вечер).





E.4.3 Step Efficiency (SE)





Что это: Среднее количество шагов (вызовов LLM) на решение одной задачи.

Зачем: Если TSR = 95%, но агент делает 20 шагов там, где человек сделал бы 3 - вы разоритесь на токенах. SE - это метрика экономики.

Аномалии: Если SE резко вырос (с 4 до 10), агент, вероятно, вошёл в цикл: «думаю -> вызываю API -> думаю -> вызываю API -> ...».





E.4.4 Grounding (Приземлённость / Отсутствие галлюцинаций)





Что это: Доля фактов в ответе, которые можно подтвердить контекстом (RAG) или инструментами.

Пример: RAG дал документ: «Компания заработала 1 млн». Модель говорит: «Компания заработала 1 млн, что на 10% больше, чем в прошлом квартале».

«1 млн» - Grounded (есть в контексте).

«+10%» - Hallucination (нет в контексте). Grounding падает.

Инструменты: BERTScore, ALIGNScore или LLM-as-a-Judge с промптом «Проверь, что все цифры из документа».





Назад: Е.1 Проблема: нейросеть не возвращает 2+2
Дальше: Е.5 Регрессионное тестирование: библиотека nightmare