Все уроки · 44
Путь 3 · Дорожная карта AI-инженера·Урок 29 из 33

Наблюдаемость LLM

Почему функциям ИИ нужен мониторинг сверх обычных логов: трассировка каждого запроса — промпт, модель, инструменты, токены, стоимость, задержка, — а также мониторинг в реальной эксплуатации и инструменты для этого.

УровеньСреднийВремя~15 мин

Одних логов недостаточно

Обычное веб-приложение ломается громко: ошибка 500, трассировка стека, оповещение. Приложение на LLM ломается тихо. Запрос возвращает 200, пользователь получает ответ — неверный, выдуманный или в десять раз дороже, чем нужно. Ничего не падает; просто качество проседает. Поэтому функциям ИИ нужна наблюдаемость сверх обычных логов.

По каждому запросу нужно уметь ответить на три вопроса:

  • Что именно видела модель? Полный промпт, системное сообщение, найденные фрагменты, результаты инструментов. Когда результат плох, причину обычно объясняет вход.
  • Сколько это стоило и сколько времени заняло? Токены на входе, токены на выходе, какая модель, общая задержка — сколько ждал пользователь. Затраты прячутся в повторных попытках и длинных контекстах.
  • Сработало ли это? «Палец вниз» от пользователя, повторная попытка, брошенная сессия — всё это тревожные звоночки: что-то пошло не так.

Почему это важно

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

Слова, которые вы встретите

Слово Что оно значит здесь
Лог Одна строка с датой, которую программа пишет о случившемся.
Спан (span) Один шаг внутри запроса: поиск, вызов модели, вызов инструмента.
Трейс (trace) Все спаны одного запроса по порядку под одним идентификатором.
Trace ID Номер, связывающий все спаны одного запроса, — req_8f3a.
Метрика Число, которое вы считаете во времени: доля ошибок, стоимость запроса, доля «пальцев вниз».
Перцентиль (p95) «95% запросов были быстрее этого значения». Лучше среднего, которое портит один медленный выброс.
Дашборд Один экран с вашими метриками в виде графиков. Ваша пожарная сигнализация.
Дрейф (drift) Качество медленно ухудшается, пока ничего не падает: «гниёт» поиск, провайдер тихо меняет модель.
RAG Генерация, дополненная поиском: сначала поиск по вашим документам, затем ответ с ними «в руках».

Один запрос шаг за шагом

Пройдитесь по запросу к ассистенту поддержки, где есть RAG-поиск и вызов инструмента, и посмотрите, что логировать на каждом шаге:

Жизненный цикл запроса — что логировать на каждом шаге
→→→→→
1. Запрос пришёл

Вопрос пользователя приходит в ваш API.

Логируем: ID запроса, ID пользователя, время, исходный вопрос. Этот ID — нить, по которой вы пройдёте через каждую последующую строку лога.

out› trace_id: req_8f3a
1/6

У каждого шага своя строка лога, или спан, и каждый спан несёт один и тот же trace ID. Собранные вместе, эти спаны образуют трейс.

Простыми словами: трейс — это дневник одного запроса. Каждый шаг записан по порядку и подшит под одним номером — как на странице отслеживания посылки. Только вместо «прибыла на склад» вы видите «найдено 3 документа», «отправлено 1 240 токенов в gpt-4o-mini», «вызван API возвратов», «ответ за 2,4 с, стоимость $0,0031». Когда пользователь жалуется, достаточно открыть трейс: весь запрос перед глазами — что нашли, что подали в промпт, что вернулось и сколько это стоило.

Конкретный случай

Клиент пишет: «ваш бот сказал, что возврат занимает 30 дней, а на странице с правилами возврата написано 14». Без трейса вы спорите с незнакомцем. С трейсом вы открываете запрос req_8f3a и за десять секунд видите, что шаг поиска вытащил фрагмент со старой страницы цен 2023 года, а модель добросовестно его повторила. А ещё этот запрос дважды повторялся, поэтому стоил втрое больше, чем должен был. Один взгляд — три ответа: что сломалось, почему и что чинить.

Трассировка, мониторинг, контроль затрат

Трассировка — это подробная запись, описанная выше: каждый запрос разложен на шаги — промпт, модель, инструменты, токены, стоимость, задержка — и сшит воедино trace ID. Это ваш инструмент отладки: один запрос за раз, во всех подробностях. Когда качество падает, вы смотрите трейсы плохих сессий и находите закономерность: поиск начал возвращать нерелевантные фрагменты или правка промпта удвоила число токенов.

Мониторинг в реальной эксплуатации — это сводный взгляд: все ваши трейсы сразу, превращённые в графики — доля ошибок, перцентили задержки, доля «пальцев вниз», аномалии длины вывода. Это ваша пожарная сигнализация: на графике вы заметите, что «бот стал хуже», на три дня раньше, чем вам об этом напишет пользователь.

Мониторинг стоимости и задержки заслуживает отдельной строки на дашборде, потому что экономика LLM беспощадна: промпт, который незаметно вырос с 800 до 8 000 токенов, умножает ваш счёт, а смена модели может удвоить задержку. Следите за стоимостью запроса, функции и когорты пользователей.

Инструменты

LangSmith — от команды LangChain. Глубокая трассировка со встроенными прогонами по наборам данных и функциями оценки. Самый полный вариант, если вы в экосистеме LangChain; работает и отдельно, но устроен «по лекалам» LangChain.

Langfuse — с открытым кодом, можно развернуть у себя, не привязан к модели. Трассировка, учёт стоимости, управление промптами, оценки. Выбор по умолчанию, если вы хотите, чтобы ваши данные телеметрии оставались вашими, и не хотите привязки к LangChain.

Helicone — работает как прокси между вашим приложением и API модели. Логирование добавляется почти даром: достаточно поменять один URL. Отлично подходит для аналитики затрат и кэширования; трассировка на уровне приложения у него менее глубокая, чем у Langfuse.

Arize AI — тяжеловес, выросший из наблюдаемости ML: обнаружение дрейфа, анализ эмбеддингов, онлайн-оценки на больших объёмах. Окупается в больших командах, для которых LLM — часть более широкой ML-платформы; для первой функции ИИ избыточен.

Выберите один инструмент

Все они делают трассировку; различаются хостингом, ценой и глубиной. Практическое правило: нужен собственный хостинг и открытый код — Langfuse. Нужно вообще не менять код — Helicone. Уже глубоко в LangChain — LangSmith. Выберите один, подключите его к каждому запросу с первого дня и двигайтесь дальше. Инструментирование, добавленное после инцидента, всегда опаздывает.

Что инструментировать в первый день

Всё сразу не нужно. По убыванию пользы на минуту работы:

  1. Один trace ID на запрос, проведённый через каждый шаг. Без него у вас логи, а не трейс.
  2. Полный промпт и полный вывод. Две вещи, которые вы будете искать в каждом инциденте.
  3. Имя и версия модели, число токенов, стоимость, задержка. Четыре числа, которые превращают «кажется, медленно и дорого» в аргумент с графиком.
  4. Детали поиска — какие документы использованы и с какими оценками. Большинство ошибок качества — это ошибки поиска в маскарадном костюме.
  5. Обратная связь — «палец вверх», «палец вниз», эскалации. Именно она превращает трейсы в оценки качества.

Логируйте слова, защищайте людей

Трейсы содержат настоящий текст, который набрали пользователи, — а это порой имена, адреса и пароли. Вычищайте секреты и персональные данные до сохранения, решите, как долго живут трейсы, и никогда не вставляйте «сырые» рабочие трейсы в публичный чат-бот при отладке.

Попробуйте: инструментируйте один запрос

Обвязку не обязательно писать вручную. Отдайте этот промпт вашему агенту для кода — он подключит трассировку к одному эндпоинту и покажет, куда смотреть:

Скопируйте этот промпт: добавьте трассировку к одному запросу
Добавь трассировку к вызову LLM в этом проекте, только для одного эндпоинта.

ЧТО НУЖНО ЛОГИРОВАТЬ для каждого запроса без исключения:
1. Trace ID, который создаётся в начале и прикрепляется к каждому шагу.
2. Итоговый промпт, который мы отправили (полным текстом), и полный полученный вывод.
3. Имя и версия модели.
4. Токены на входе, токены на выходе, стоимость в центах, задержка в миллисекундах.
5. Все вызовы инструментов: имя, аргументы, сырой ответ.

ПРАВИЛА:
- Не логируй ключи API, пароли и всё, что похоже на персональные данные.
Вычищай их перед записью.
- Объясни простым языком, где я смогу увидеть трейсы при локальном запуске, и дай
одну команду, чтобы их открыть.
- Делай изменение как можно меньше: один эндпоинт, по возможности один файл.
- Когда закончишь, расскажи мне в двух предложениях, что логируется, а что нет.

Проверьте себя

Проверьте себя

Почему обычных логов и оповещений об ошибках недостаточно для функции на LLM?

Что такое «трейс» (trace)?

Вы открываете трейс и видите, что шаг поиска вернул три фрагмента — все со страницы цен 2023 года. О чём это говорит?

Трассировка и мониторинг в реальной эксплуатации — в чём разница?

Что унести с собой

Четыре хода — в таком порядке:

  1. Выберите один инструмент и инструментируйте один запрос сегодня. Не всё приложение — один эндпоинт. Вы хотите увидеть один трейс на экране до обеда.
  2. Убедитесь, что trace ID проходит через каждый шаг. Нет ID — нет трейса, нет отладки.
  3. Выведите стоимость и задержку на дашборд с первого дня. Это два числа, которые незаметно удваиваются.
  4. Свяжите обратную связь с трейсами. «Палец вниз» с trace ID — зародыш вашего первого золотого набора данных.

Привычка: когда что-то выглядит неправильно, откройте трейс, прежде чем менять промпт. Гадать дороже, чем смотреть.