Короткое объяснение
Observability - это наблюдаемость ИИ-системы: способность понять, что произошло внутри запроса, почему агент дал такой ответ, какие шаги выполнил, какие документы нашел, какие tools вызвал, сколько это стоило и где возникла ошибка.
Если совсем просто:
- пользователь задает вопрос;
- агент получает run_id;
- система записывает каждый шаг;
- trace показывает путь одного запуска;
- logs фиксируют события и ошибки;
- metrics показывают цифры по многим запускам;
- dashboard помогает увидеть тенденции;
- alerts сообщают, если качество, стоимость или ошибки вышли за пределы нормы.
Без observability ИИ-продукт выглядит как черный ящик: пользователь жалуется на плохой ответ, а команда не понимает, модель ошиблась, RAG не нашел документ, tool упал или guardrail заблокировал действие.
Зачем observability нужна ИИ-системам
Обычный backend можно проверить по HTTP-статусу, логам и ошибкам. С ИИ сложнее: запрос может завершиться успешно с точки зрения сервера, но ответ будет неверным, неполным, дорогим или небезопасным.
Observability помогает:
- расследовать плохие ответы;
- видеть путь агентного запуска;
- находить ошибки RAG;
- понимать, какой tool был вызван;
- считать стоимость model calls;
- измерять latency;
- видеть повторы и ретраи;
- ловить prompt injection;
- анализировать human approval;
- пополнять eval dataset реальными ошибками;
- сравнивать версии промпта;
- принимать решения по качеству продукта.
Главная задача observability - не просто хранить логи, а быстро отвечать на вопрос: что именно пошло не так и что чинить.
Чем observability отличается от мониторинга
Мониторинг отвечает на вопрос "система здорова или нет". Observability помогает понять "почему она ведет себя именно так".
Мониторинг показывает:
- сколько ошибок;
- какая задержка;
- сколько запросов;
- сколько стоит работа модели;
- есть ли алерты;
- растет ли очередь;
- падают ли tools;
- доступен ли сервис.
Observability добавляет контекст:
- какой prompt ушел модели;
- какие документы попали в RAG-контекст;
- какие tools выбрал агент;
- какой результат вернул tool;
- почему сработал guardrail;
- почему потребовался handoff;
- какие шаги заняли время;
- какая версия промпта использовалась.
Мониторинг говорит "у нас выросли ошибки". Observability показывает, что ошибки выросли после новой версии промпта и падают на сценариях с поиском по базе знаний.
Три опоры: traces, logs, metrics
Для ИИ-приложений обычно нужны три типа данных.
Traces:
- показывают путь одного запуска;
- связывают шаги по run_id;
- помогают расследовать конкретный плохой ответ;
- показывают model calls, RAG, tools и ошибки.
Logs:
- фиксируют события;
- помогают искать ошибки;
- сохраняют важные решения;
- дают материал для audit log.
Metrics:
- показывают агрегированную картину;
- помогают строить dashboards;
- нужны для alerts;
- показывают динамику качества, стоимости и задержки.
Если оставить только metrics, непонятно, почему произошла ошибка. Если оставить только logs, трудно увидеть тенденции. Если есть traces, logs и metrics вместе, система становится управляемой.
Что такое trace
Trace - это запись полного пути одного запроса или одного запуска агента.
Хороший trace показывает:
- входной запрос;
- id пользователя или сессии;
- версию промпта;
- модель;
- параметры модели;
- найденные документы;
- chunks, переданные в контекст;
- вызовы tools;
- аргументы tools;
- результаты tools;
- ошибки;
- retries;
- latency каждого шага;
- стоимость model calls;
- финальный ответ;
- оценку пользователя или оператора.
Trace нужен, когда надо понять не только что ответил агент, но и как он к этому пришел.
Что такое run_id
Run_id - это уникальный идентификатор одного запуска. Он связывает все события внутри запроса.
Например, один run_id может объединять:
- HTTP request;
- входной текст;
- retrieval request;
- найденные chunks;
- model call;
- tool call;
- approval request;
- финальный ответ;
- user feedback;
- ошибку или retry.
Без run_id логи превращаются в россыпь строк. С run_id можно открыть один запуск и увидеть всю цепочку.
Что писать в trace
В trace нужно писать достаточно данных для диагностики, но не превращать его в свалку.
Полезно сохранять:
- run_id;
- user_id или account_id;
- scenario;
- prompt version;
- model name;
- input length;
- output length;
- token usage;
- cost;
- retrieved document ids;
- tool name;
- tool arguments без секретов;
- tool status;
- guardrail verdict;
- approval status;
- latency;
- error code;
- final status.
Полный текст входа и ответа можно хранить не всегда. Для production часто нужны маскирование, sampling и отдельные правила хранения.
Что не стоит писать в trace
Observability не должна создавать новую дыру в безопасности.
Осторожно с такими данными:
- пароли;
- API keys;
- access tokens;
- персональные данные;
- платежные данные;
- медицинская информация;
- коммерческая тайна;
- приватные документы;
- внутренние ключи доступа;
- полный system prompt без контроля доступа.
Если такие данные нужны для расследования, используйте redaction, маскирование, ограничения доступа и короткий срок хранения.
Structured logs
Structured logs - это логи в структурированном формате, чаще всего JSON. Они лучше обычного текста, потому что по ним можно фильтровать и строить метрики.
Плохой лог:
Ошибка при вызове модели.
Хороший structured log содержит:
- timestamp;
- run_id;
- user_id;
- scenario;
- component;
- event_type;
- model;
- latency_ms;
- status;
- error_code;
- cost_usd;
- prompt_version.
По таким логам можно быстро найти все ошибки конкретной версии промпта или все дорогие запросы в одном сценарии.
Metrics для ИИ-продукта
Метрики показывают здоровье системы в целом.
Базовый набор:
- количество запросов;
- error rate;
- average latency;
- p95 latency;
- cost per request;
- total model cost;
- token usage;
- tool error rate;
- retrieval success rate;
- no-answer rate;
- hallucination reports;
- approval rate;
- handoff rate;
- user rating;
- eval pass rate.
Метрики нужно смотреть по сценариям. Средняя оценка по всему продукту может быть хорошей, а один важный сценарий будет регулярно ломаться.
Model calls
Model call - это отдельный вызов языковой модели. В одном агентном запуске их может быть несколько: классификация, поиск плана, генерация ответа, проверка формата, финальная редактура.
Для model call полезно хранить:
- provider;
- model;
- prompt version;
- input tokens;
- output tokens;
- temperature;
- latency;
- cost;
- finish reason;
- error status.
Если стоимость резко выросла, часто причина в лишнем model call, слишком длинном контексте или повторных retries.
RAG diagnostics
Для RAG важно видеть не только ответ, но и поиск.
RAG diagnostics должны показывать:
- запрос к поиску;
- embedding model;
- top-k;
- найденные document ids;
- score каждого chunk;
- примененные filters;
- версию индекса;
- длину контекста;
- пропущенные документы;
- использованные цитаты.
Если агент ответил плохо, trace должен помочь понять: документ не найден, найден не тот фрагмент или модель проигнорировала правильный фрагмент.
Tool call logs
Для AI-агента tool calls - самая важная часть observability. Текст можно переписать, а действие в CRM, почте или базе данных может иметь последствия.
Для каждого tool call полезно хранить:
- tool name;
- tool version;
- arguments schema;
- очищенные arguments;
- caller;
- policy verdict;
- approval status;
- idempotency key;
- execution status;
- duration;
- result summary;
- error code;
- rollback status.
Если агент сделал неправильное действие, без tool log будет трудно понять, это ошибка модели, policy gate, executor или внешнего API.
Guardrails events
Guardrails тоже должны оставлять события. Иначе команда не увидит, что именно блокируется.
Полезно логировать:
- какой guardrail сработал;
- на каком шаге;
- входное действие;
- решение: allow, block, rewrite, approval, handoff;
- причину решения;
- уровень риска;
- ссылку на run_id;
- итоговый результат.
Если guardrails часто блокируют нормальные запросы, их надо смягчить. Если почти никогда не срабатывают, стоит проверить, не слишком ли они слабые.
Human approval и handoff
Observability должна показывать, где агент передает управление человеку.
Для approval полезно видеть:
- какое действие требовало подтверждения;
- почему оно рискованное;
- кто подтвердил;
- кто отклонил;
- сколько ждали решения;
- что изменил человек;
- был ли повторный запуск;
- чем завершился кейс.
Для handoff полезно видеть:
- почему агент передал случай;
- как часто это происходит;
- какие темы уходят людям;
- сколько времени занимает обработка;
- что оператор исправил.
Эти данные помогают постепенно автоматизировать безопасные сценарии и не трогать рискованные.
Связь observability и evals
Production traces - один из лучших материалов для evals.
Рабочий цикл:
- пользователь получает плохой ответ;
- команда открывает trace;
- находит причину;
- добавляет случай в eval dataset;
- исправляет prompt, RAG, tool или guardrail;
- прогоняет regression evals;
- выкатывает изменение;
- следит за production metrics.
Так ошибки не просто чинятся вручную, а превращаются в постоянную защиту от повторения.
Связь observability и audit log
Observability и audit log похожи, но решают разные задачи.
Observability нужна, чтобы отлаживать и улучшать систему:
- latency;
- errors;
- traces;
- стоимость;
- качество;
- диагностика RAG;
- tool failures.
Audit log нужен, чтобы доказать, что произошло:
- кто запустил действие;
- что изменилось;
- кто подтвердил;
- какие данные затронуты;
- когда это случилось;
- можно ли откатить.
Для рискованных actions audit log должен быть надежнее обычного debug trace и храниться по правилам бизнеса.
Dashboard качества
Dashboard должен помогать принимать решения, а не просто красиво показывать графики.
Для AI-продукта полезны блоки:
- качество ответов;
- eval pass rate;
- user feedback;
- no-answer rate;
- handoff rate;
- hallucination reports;
- tool failures;
- RAG misses;
- cost per successful task;
- latency by scenario;
- approval queue;
- top failure categories.
Хороший dashboard показывает не только среднее, но и разбивку по сценариям, версиям промпта, моделям и типам пользователей.
Alerts
Alerts нужны, чтобы команда узнала о проблеме до того, как она станет большой.
Примеры alerts:
- error rate выше нормы;
- p95 latency выросла;
- стоимость за час выросла;
- tool часто падает;
- handoff rate резко вырос;
- no-answer rate вырос;
- eval pass rate упал;
- guardrail начал блокировать слишком много запросов;
- approval queue зависла;
- появилась серия одинаковых ошибок.
Alert должен вести к действию. Если после уведомления непонятно, что открыть и кого звать, алерт слишком общий.
Privacy и хранение данных
Observability почти всегда касается чувствительных данных, поэтому правила хранения надо продумать заранее.
Что стоит определить:
- какие поля маскируются;
- какие поля не пишутся вообще;
- кто имеет доступ к traces;
- сколько хранятся production traces;
- как удаляются данные пользователя;
- где хранятся логи;
- можно ли отправлять traces во внешний сервис;
- как отличать dev, staging и production;
- как работать с персональными данными;
- как проводить расследование без раскрытия лишнего.
Иначе observability может помочь разработке, но создать риск для безопасности и соответствия требованиям.
Минимальная observability для старта
Для первой версии AI-продукта не обязательно строить сложную платформу.
Минимально нужно:
- run_id для каждого запуска;
- trace основных шагов;
- structured logs;
- model name и prompt version;
- token usage;
- latency;
- cost;
- retrieved document ids;
- tool calls;
- errors;
- user feedback;
- связка с eval dataset.
Этого уже достаточно, чтобы расследовать большинство плохих ответов и не гадать вслепую.
Когда observability особенно важна
Без наблюдаемости можно жить только в маленьком прототипе. Как только ИИ начинает влиять на реальные процессы, traces становятся обязательными.
Observability особенно нужна, если агент:
- отвечает клиентам;
- работает с CRM;
- вызывает внешние tools;
- использует RAG;
- имеет память;
- работает с персональными данными;
- требует approval;
- стоит заметных денег;
- меняет документы;
- работает в production.
Чем выше автономность агента, тем важнее видеть его внутренний путь.
Типичные ошибки
Observability часто внедряют слишком поздно.
Частые ошибки:
- нет run_id;
- логи только текстовые;
- не хранится версия промпта;
- не видны retrieved chunks;
- не логируются tool calls;
- не считается стоимость;
- нет связи с evals;
- traces содержат секреты;
- доступ к логам слишком широкий;
- dashboard показывает среднее без сценариев;
- alerts слишком шумные;
- production-ошибки не превращаются в тесты.
Главное правило: если плохой ответ нельзя объяснить по trace, observability пока недостаточна.
Мини-чеклист
Перед production-запуском проверьте:
- у каждого запуска есть run_id;
- trace показывает все важные шаги;
- model calls логируются;
- RAG diagnostics доступны;
- tool calls логируются;
- guardrails events видны;
- human approval и handoff записываются;
- стоимость считается;
- latency измеряется по шагам;
- production traces защищены;
- есть dashboard по сценариям;
- есть alerts;
- ошибки попадают в eval dataset;
- есть владелец качества и мониторинга.
Этот чеклист помогает не запускать агента как черный ящик.
Что изучать дальше
После observability полезно разобраться с соседними темами:
- evals;
- monitoring;
- LLMOps;
- audit log;
- guardrails;
- RAG diagnostics;
- tool calling;
- human-in-the-loop;
- incident response;
- prompt versioning.
Observability - это основа спокойного развития AI-продукта. Без нее каждое изменение промпта, модели или RAG превращается в риск.
Частые вопросы
Observability нужна только разработчикам?
Нет. Разработчику нужен trace, чтобы найти ошибку. Владельцу продукта нужны метрики качества, стоимости и пользовательских оценок. Руководителю поддержки нужны темы handoff и скорость обработки. Без observability все эти люди видят только жалобы и общие ощущения.
Нужно ли хранить полный текст всех запросов?
Не всегда. Полные traces полезны для отладки, но в production нужно учитывать персональные данные, коммерческую тайну и правила хранения. Часто используют redaction, sampling и разные уровни детализации для dev, staging и production.
Чем trace отличается от обычного лога?
Лог фиксирует отдельное событие. Trace связывает события одного запуска в цепочку: вход, RAG, model calls, tool calls, guardrails, approval, ошибки и финальный ответ. Для ИИ-агента trace обычно полезнее отдельной строки лога.
Можно ли начать без LangSmith или Langfuse?
Да. Можно начать с run_id, structured logs, таблицы ошибок и простого dashboard. Специализированные инструменты становятся полезны, когда появляется много traces, версий промптов, evals, tool calls и production-сценариев.
Что важнее: evals или observability?
Нужны оба слоя. Evals показывают, проходит ли система контрольные проверки. Observability объясняет, что произошло в реальном запуске. Вместе они помогают не только ловить ошибки, но и понимать их причину.