Как тестировать LLM-цепочку без вызовов модели

Без живого вызова модели можно проверить значительную часть логики приложения: подготовку входа, разбор ответа, маршрутизацию и обработку ошибок. Для этого замените границу модели управляемой заглушкой. Такой тест не измеряет качество генерации, но помогает находить обычные программные дефекты.

Начните с одного контракта

Допустим, цепочка классифицирует обращение как billing или technical. После классификации код выбирает очередь. Для теста маршрутизатора не нужна модель: подайте заранее заданный результат и проверьте выбранную очередь.

def route(result):
    queues = {"billing": "finance", "technical": "support"}
    return queues.get(result.get("category"), "manual")

assert route({"category": "billing"}) == "finance"
assert route({"category": "unknown"}) == "manual"
assert route({}) == "manual"

Этот пример проверяет только маршрутизацию. Он не доказывает, что модель правильно распознаёт финансовые обращения. Для этого понадобится отдельный набор писем с ожидаемыми категориями и прогон реальной конфигурации.

Какие ответы должна уметь выдавать заглушка

Подготовьте правильный результат, отсутствующее поле, неизвестную категорию, таймаут и некорректный формат. Если код поддерживает повтор, задайте последовательность «ошибка, затем успех» и проверьте число попыток. Для отказа после лимита нужна отдельная последовательность.

Стабильные фиктивные ответы позволяют воспроизводить ошибку без сетевых расходов и изменений внешней модели. Важен явный интерфейс: вход и выход заглушки должны соответствовать тому уровню, который подменяется. Нельзя возвращать готовую категорию, если вы утверждаете, что проверили ещё и JSON-парсер.

Соберите два независимых набора

Первый набор проверяет код с контролируемыми ответами. Второй оценивает качество на реальных запросах к модели. Не заменяйте один другим: зелёные unit-тесты могут сосуществовать с плохой классификацией, а удачная демонстрация может скрывать неисправную обработку ошибок.

LangChain предоставляет средства тестирования компонентов. Конкретный способ подмены выбирайте по используемой версии и интеграции. Сохраняйте в отчёте, что именно выполнялось локально и какие проверки требуют внешнего сервиса.

Этот разбор подготовлен Latorn. Если вы уже знаете основы Python и API и хотите практиковать такие решения системно, сравните программу платного курса LangChain 1.0.x со своей задачей. Открытый пример выше можно проверить самостоятельно; он не заменяет полный проект.

Технические источники: LangChain testing. Учебные ситуации и числа в статье придуманы для объяснения механизма.

Следующий шаг: LangChain: практические разборы формата, памяти и потоков. По смежным вопросам: Отсутствующее поле и null в ответе LLM: как не стереть данные, Обрезка истории LangChain: как сохранить договорённости.