Усі уроки · 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 — зародок вашого першого золотого набору даних.
Звичка: коли щось виглядає неправильно, відкрийте трейс, перш ніж міняти промпт. Вгадувати дорожче, ніж дивитися.