Усі уроки · 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 — зародок вашого першого золотого набору даних.

Звичка: коли щось виглядає неправильно, відкрийте трейс, перш ніж міняти промпт. Вгадувати дорожче, ніж дивитися.