Все уроки · 44
Наблюдаемость LLM
Почему функциям ИИ нужен мониторинг сверх обычных логов: трассировка каждого запроса — промпт, модель, инструменты, токены, стоимость, задержка, — а также мониторинг в реальной эксплуатации и инструменты для этого.
Одних логов недостаточно
Обычное веб-приложение ломается громко: ошибка 500, трассировка стека, оповещение. Приложение на LLM ломается тихо. Запрос возвращает 200, пользователь получает ответ — неверный, выдуманный или в десять раз дороже, чем нужно. Ничего не падает; просто качество проседает. Поэтому функциям ИИ нужна наблюдаемость сверх обычных логов.
По каждому запросу нужно уметь ответить на три вопроса:
- Что именно видела модель? Полный промпт, системное сообщение, найденные фрагменты, результаты инструментов. Когда результат плох, причину обычно объясняет вход.
- Сколько это стоило и сколько времени заняло? Токены на входе, токены на выходе, какая модель, общая задержка — сколько ждал пользователь. Затраты прячутся в повторных попытках и длинных контекстах.
- Сработало ли это? «Палец вниз» от пользователя, повторная попытка, брошенная сессия — всё это тревожные звоночки: что-то пошло не так.
Почему это важно
Без этого каждая жалоба звучит одинаково: «бот сказал какую-то глупость». Невозможно отлаживать фразу, которую вы никогда не видели. С трейсами та же жалоба превращается в заявку со ссылкой: вот вопрос, вот что мы нашли, вот точный промпт, вот почему он ответил именно так. Десять секунд вместо трёх дней гаданий.
Слова, которые вы встретите
| Слово | Что оно значит здесь |
|---|---|
| Лог | Одна строка с датой, которую программа пишет о случившемся. |
| Спан (span) | Один шаг внутри запроса: поиск, вызов модели, вызов инструмента. |
| Трейс (trace) | Все спаны одного запроса по порядку под одним идентификатором. |
| Trace ID | Номер, связывающий все спаны одного запроса, — req_8f3a. |
| Метрика | Число, которое вы считаете во времени: доля ошибок, стоимость запроса, доля «пальцев вниз». |
| Перцентиль (p95) | «95% запросов были быстрее этого значения». Лучше среднего, которое портит один медленный выброс. |
| Дашборд | Один экран с вашими метриками в виде графиков. Ваша пожарная сигнализация. |
| Дрейф (drift) | Качество медленно ухудшается, пока ничего не падает: «гниёт» поиск, провайдер тихо меняет модель. |
| RAG | Генерация, дополненная поиском: сначала поиск по вашим документам, затем ответ с ними «в руках». |
Один запрос шаг за шагом
Пройдитесь по запросу к ассистенту поддержки, где есть RAG-поиск и вызов инструмента, и посмотрите, что логировать на каждом шаге:
Вопрос пользователя приходит в ваш API.
Логируем: ID запроса, ID пользователя, время, исходный вопрос. Этот ID — нить, по которой вы пройдёте через каждую последующую строку лога.
У каждого шага своя строка лога, или спан, и каждый спан несёт один и тот же 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. Выберите один, подключите его к каждому запросу с первого дня и двигайтесь дальше. Инструментирование, добавленное после инцидента, всегда опаздывает.
Что инструментировать в первый день
Всё сразу не нужно. По убыванию пользы на минуту работы:
- Один trace ID на запрос, проведённый через каждый шаг. Без него у вас логи, а не трейс.
- Полный промпт и полный вывод. Две вещи, которые вы будете искать в каждом инциденте.
- Имя и версия модели, число токенов, стоимость, задержка. Четыре числа, которые превращают «кажется, медленно и дорого» в аргумент с графиком.
- Детали поиска — какие документы использованы и с какими оценками. Большинство ошибок качества — это ошибки поиска в маскарадном костюме.
- Обратная связь — «палец вверх», «палец вниз», эскалации. Именно она превращает трейсы в оценки качества.
Логируйте слова, защищайте людей
Трейсы содержат настоящий текст, который набрали пользователи, — а это порой имена, адреса и пароли. Вычищайте секреты и персональные данные до сохранения, решите, как долго живут трейсы, и никогда не вставляйте «сырые» рабочие трейсы в публичный чат-бот при отладке.
Попробуйте: инструментируйте один запрос
Обвязку не обязательно писать вручную. Отдайте этот промпт вашему агенту для кода — он подключит трассировку к одному эндпоинту и покажет, куда смотреть:
Добавь трассировку к вызову LLM в этом проекте, только для одного эндпоинта.
ЧТО НУЖНО ЛОГИРОВАТЬ для каждого запроса без исключения:
1. Trace ID, который создаётся в начале и прикрепляется к каждому шагу.
2. Итоговый промпт, который мы отправили (полным текстом), и полный полученный вывод.
3. Имя и версия модели.
4. Токены на входе, токены на выходе, стоимость в центах, задержка в миллисекундах.
5. Все вызовы инструментов: имя, аргументы, сырой ответ.
ПРАВИЛА:
- Не логируй ключи API, пароли и всё, что похоже на персональные данные.
Вычищай их перед записью.
- Объясни простым языком, где я смогу увидеть трейсы при локальном запуске, и дай
одну команду, чтобы их открыть.
- Делай изменение как можно меньше: один эндпоинт, по возможности один файл.
- Когда закончишь, расскажи мне в двух предложениях, что логируется, а что нет.Проверьте себя
Почему обычных логов и оповещений об ошибках недостаточно для функции на LLM?
Что такое «трейс» (trace)?
Вы открываете трейс и видите, что шаг поиска вернул три фрагмента — все со страницы цен 2023 года. О чём это говорит?
Трассировка и мониторинг в реальной эксплуатации — в чём разница?
Что унести с собой
Четыре хода — в таком порядке:
- Выберите один инструмент и инструментируйте один запрос сегодня. Не всё приложение — один эндпоинт. Вы хотите увидеть один трейс на экране до обеда.
- Убедитесь, что trace ID проходит через каждый шаг. Нет ID — нет трейса, нет отладки.
- Выведите стоимость и задержку на дашборд с первого дня. Это два числа, которые незаметно удваиваются.
- Свяжите обратную связь с трейсами. «Палец вниз» с trace ID — зародыш вашего первого золотого набора данных.
Привычка: когда что-то выглядит неправильно, откройте трейс, прежде чем менять промпт. Гадать дороже, чем смотреть.