Что получится в результате
Соберем мониторинг ИИ-агента, который показывает не только "сервер жив" и "ошибка 500", а весь путь задачи: пользовательский запрос, выбранная модель, prompt, RAG-поиск, tool calls, approvals, retries, fallback, стоимость, задержку, safety flags, финальный ответ и оценку качества. Такой мониторинг нужен, чтобы понять, где агент ломается: в prompt, retrieval, модели, инструменте, данных, лимитах, правах или пользовательском сценарии.
В результате будет рабочий MVP:
- каждый запуск агента получает `run_id`;
- сессии пользователя пишутся в `agent_sessions`;
- запуски задач лежат в `agent_runs`;
- шаги агента пишутся в `agent_steps`;
- model calls сохраняются в `model_call_log`;
- tool calls сохраняются в `tool_call_log`;
- RAG-поиск фиксируется в `retrieval_log`;
- prompts и версии prompts лежат в `prompt_log`;
- structured output проверяется в `schema_validation_log`;
- задержки пишутся в `latency_log`;
- стоимость пишется в `cost_log`;
- ошибки и retries пишутся в `error_log`;
- fallback-события пишутся в `fallback_log`;
- safety-события пишутся в `safety_event_log`;
- handoff человеку пишется в `handoff_log`;
- оценки качества пишутся в `quality_score_log`;
- пользовательская обратная связь лежит в `feedback_log`;
- алерты лежат в `alert_rules`;
- срабатывания алертов пишутся в `alert_events`;
- все важные действия фиксируются в `audit_log`.
Первая версия должна отвечать на пять вопросов: что пользователь попросил, какие данные агент использовал, какие tools вызвал, сколько это стоило, почему ответ получился именно таким и где он сломался, если сломался.
Что понадобится
Минимальный набор:
- работающий ИИ-агент или тестовый workflow;
- backend, где можно добавить `run_id`;
- база данных для логов: PostgreSQL, MySQL или ClickHouse;
- LLM observability инструмент: Langfuse, LangSmith или свой trace viewer;
- OpenTelemetry для связки с backend traces;
- Prometheus или аналог для метрик;
- Grafana или аналог для dashboards;
- Sentry или аналог для exceptions;
- список критичных сценариев агента;
- лимиты стоимости и задержки;
- человек, который будет разбирать алерты.
Для первого запуска достаточно одной таблицы логов `agent_runs`, одной таблицы `model_call_log`, одной `tool_call_log` и простого dashboard по latency, cost, errors и fallback rate.
Шаг 1. Определите, что именно мониторим
Обычный backend monitoring не видит агентную логику. Нужно мониторить весь цикл.
События:
- пользователь начал задачу;
- агент выбрал сценарий;
- агент выбрал модель;
- prompt собран;
- retrieval выполнен;
- tool вызван;
- tool вернул ошибку;
- модель вернула structured output;
- JSON прошел или не прошел validation;
- действие ушло на approval;
- сработал fallback;
- задача передана человеку;
- ответ отправлен пользователю;
- пользователь поставил оценку;
- задача завершилась ошибкой.
Проверка: по одному `run_id` можно увидеть все события цепочки.
Шаг 2. Создайте `agent_sessions`
Сессия связывает несколько запусков одного пользователя.
Колонки:
id
session_id
user_id
channel
started_at
last_seen_at
status
metadata_json
`channel`:
- `web`;
- `telegram`;
- `whatsapp`;
- `email`;
- `slack`;
- `api`;
- `admin`.
Проверка: несколько вопросов пользователя в одном чате связаны одной `session_id`.
Шаг 3. Создайте `agent_runs`
`agent_runs` - главная таблица мониторинга.
Колонки:
id
run_id
session_id
user_id
agent_name
task_type
input_hash
status
started_at
finished_at
total_latency_ms
total_cost
model_route
fallback_used
human_handoff
quality_score
Статусы:
- `started`;
- `running`;
- `waiting_tool`;
- `waiting_approval`;
- `completed`;
- `failed`;
- `cancelled`;
- `handoff`.
Проверка: каждый запрос пользователя создает ровно один `agent_runs.run_id`.
Шаг 4. Добавьте `run_id` во все логи
Без общего id расследование превращается в ручной поиск.
Передавайте `run_id` в:
- model calls;
- tool calls;
- retrieval;
- structured logs;
- queue jobs;
- HTTP requests;
- approval records;
- error logs;
- audit events;
- alerts.
Проверка: если tool упал, в ошибке есть тот же `run_id`, что и в пользовательском запросе.
Шаг 5. Создайте `agent_steps`
Шаги показывают внутренний план агента.
Колонки:
id
run_id
step_index
step_type
step_name
status
started_at
finished_at
latency_ms
summary
`step_type`:
- `intent_detection`;
- `retrieval`;
- `model_call`;
- `tool_call`;
- `validation`;
- `approval`;
- `fallback`;
- `final_answer`;
- `handoff`.
Проверка: в trace видно, что агент сначала сделал retrieval, потом вызвал tool, потом сформировал ответ.
Шаг 6. Логируйте model calls
Создайте `model_call_log`.
Колонки:
id
run_id
step_id
provider
model_id
prompt_version
input_tokens
output_tokens
cached_tokens
temperature
status
latency_ms
estimated_cost
finish_reason
created_at
Не храните полный prompt с персональными данными в открытом виде. Для sensitive-полей храните hash, summary и ссылку на безопасное хранилище.
Проверка: по каждому run видно, какая модель отвечала, сколько токенов потрачено и сколько это стоило.
Шаг 7. Логируйте prompts
Создайте `prompt_log`.
Колонки:
id
run_id
prompt_version
prompt_role
prompt_hash
prompt_summary
contains_pii
storage_ref
created_at
Логируйте отдельно:
- system prompt;
- developer prompt;
- user input summary;
- retrieved context summary;
- tool result summary;
- final answer prompt.
Проверка: можно сравнить, какой prompt version дал плохой ответ.
Шаг 8. Логируйте retrieval
Создайте `retrieval_log`.
Колонки:
id
run_id
query
collection_name
top_k
filters_json
chunk_id
score
document_id
source_ref
used_in_answer
created_at
Проверяйте:
- был ли retrieval;
- какой запрос ушел в поиск;
- какие фильтры применились;
- какие chunks пришли;
- какой score;
- использовались ли chunks в ответе;
- были ли документы недоступны пользователю.
Проверка: плохой ответ можно объяснить: retrieval не нашел нужный chunk или модель проигнорировала найденный chunk.
Шаг 9. Логируйте tool calls
Создайте `tool_call_log`.
Колонки:
id
run_id
step_id
tool_name
tool_action
arguments_hash
arguments_summary
status
latency_ms
external_request_id
error_code
error_message
requires_approval
created_at
Логируйте:
- какой tool выбран;
- какие аргументы переданы;
- прошла ли schema validation;
- был ли approval;
- что вернул внешний API;
- была ли повторная попытка;
- было ли опасное действие заблокировано.
Проверка: если агент создал дубль в CRM, видно, какой tool и с какими аргументами это сделал.
Шаг 10. Логируйте structured output
Создайте `schema_validation_log`.
Колонки:
id
run_id
model_call_id
schema_name
is_valid
errors_json
raw_output_hash
created_at
Проверяйте:
- валидный JSON;
- обязательные поля;
- enum values;
- типы данных;
- лишние поля;
- пустые значения;
- risk level;
- action name.
Проверка: invalid JSON не идет в tool call, а создает retry или handoff.
Шаг 11. Считайте latency
Создайте `latency_log`.
Колонки:
id
run_id
component
operation
latency_ms
status
created_at
Компоненты:
- `frontend`;
- `backend`;
- `queue`;
- `model`;
- `retrieval`;
- `tool`;
- `approval`;
- `fallback`;
- `final_answer`.
Считайте p50, p90, p95 и p99. Среднее значение почти всегда прячет проблемы.
Проверка: dashboard показывает, где агент тормозит: модель, база, tool или очередь.
Шаг 12. Считайте стоимость
Создайте `cost_log`.
Колонки:
id
run_id
provider
model_id
cost_type
input_tokens
output_tokens
cached_tokens
estimated_cost
created_at
`cost_type`:
- `model_input`;
- `model_output`;
- `embeddings`;
- `reranking`;
- `speech`;
- `vision`;
- `tool_api`;
- `storage`.
Проверка: можно увидеть стоимость одного run, одного пользователя, одного агента и одного сценария.
Шаг 13. Логируйте ошибки
Создайте `error_log`.
Колонки:
id
run_id
component
operation
error_code
error_message
retryable
attempt
payload_hash
created_at
Типовые ошибки:
- timeout модели;
- rate limit;
- invalid JSON;
- context overflow;
- tool API 500;
- tool API 403;
- retrieval empty;
- approval rejected;
- missing credentials;
- safety block.
Проверка: ошибка не теряется в логах сервера, а связана с конкретным run.
Шаг 14. Логируйте fallback
Создайте `fallback_log`.
Колонки:
id
run_id
from_model
to_model
reason
attempt
success
created_at
Причины:
- `timeout`;
- `rate_limit`;
- `invalid_json`;
- `low_confidence`;
- `safety_uncertain`;
- `provider_error`;
- `context_overflow`;
- `tool_loop`.
Проверка: если fallback rate растет, видно, какая модель или какой сценарий деградирует.
Шаг 15. Логируйте safety events
Создайте `safety_event_log`.
Колонки:
id
run_id
event_type
severity
source
message
action_taken
created_at
События:
- prompt injection;
- попытка раскрыть system prompt;
- запрещенный tool call;
- PII leak risk;
- dangerous action;
- answer without evidence;
- policy violation;
- jailbreak attempt;
- suspicious file content;
- approval bypass attempt.
Проверка: опасный пользовательский ввод виден отдельно от обычных ошибок.
Шаг 16. Логируйте handoff человеку
Создайте `handoff_log`.
Колонки:
id
run_id
handoff_reason
assigned_to
priority
context_summary
status
created_at
resolved_at
Причины handoff:
- низкая confidence;
- высокорисковое действие;
- нет данных;
- конфликт источников;
- tool error;
- пользователь недоволен;
- safety flag;
- approval нужен;
- модель не прошла schema validation;
- требуется эксперт.
Проверка: оператор получает не просто "помоги", а summary, run_id и причину передачи.
Шаг 17. Добавьте feedback
Создайте `feedback_log`.
Колонки:
id
run_id
user_id
rating
feedback_type
comment
correct_answer
created_at
`feedback_type`:
- `helpful`;
- `wrong_answer`;
- `too_slow`;
- `unsafe`;
- `missing_context`;
- `bad_tone`;
- `tool_error`;
- `needs_human`.
Проверка: плохие оценки попадают в список кандидатов для eval cases.
Шаг 18. Считайте quality score
Создайте `quality_score_log`.
Колонки:
id
run_id
score_name
score_value
evaluator
reason
created_at
Оценивайте:
- answer helpfulness;
- factuality;
- citation coverage;
- tool correctness;
- schema validity;
- safety;
- tone;
- task completion;
- human correction needed;
- user satisfaction.
Проверка: качество агента можно сравнивать по неделям и после изменений prompt.
Шаг 19. Свяжите monitoring с evals
Мониторинг должен превращаться в тесты.
Workflow:
- плохой run попадает в `feedback_log`;
- run отмечается как candidate для eval;
- из input и expected behavior создается eval case;
- eval прогоняется на новой версии prompt или модели;
- если регрессии нет, изменение выкатывается;
- после выката мониторинг проверяет те же метрики.
Проверка: повторяющаяся ошибка становится тестом, а не вечной ручной правкой.
Шаг 20. Создайте `alert_rules`
Алерты должны быть по делу, иначе их перестанут читать.
Колонки:
id
rule_code
metric_name
condition
threshold
window_minutes
severity
channel
is_active
Первые правила:
agent_error_rate_high | error_rate | > | 5% | 15 | high | telegram
fallback_rate_high | fallback_rate | > | 15% | 30 | medium | telegram
cost_spike | cost_per_hour | > | budget*1.5 | 60 | high | email
latency_p95_high | latency_p95 | > | 12000 | 15 | medium | telegram
invalid_json_high | invalid_json_rate | > | 3% | 30 | medium | telegram
safety_events_high | safety_event_count | > | 10 | 15 | high | telegram
Проверка: тестовое превышение threshold создает запись в `alert_events`.
Шаг 21. Создайте `alert_events`
Колонки:
id
rule_id
metric_value
threshold
severity
status
message
created_at
acknowledged_by
resolved_at
Статусы:
- `open`;
- `acknowledged`;
- `resolved`;
- `muted`;
- `false_positive`.
Проверка: алерт можно подтвердить, закрыть и связать с incident или задачей.
Шаг 22. Соберите dashboard для владельца продукта
Первый dashboard должен быть понятен не только разработчику.
Блоки:
- количество runs;
- completion rate;
- error rate;
- handoff rate;
- fallback rate;
- средняя оценка пользователей;
- стоимость за день;
- стоимость на 1000 задач;
- p95 latency;
- топ-5 плохих сценариев.
Проверка: владелец продукта видит, улучшился агент или ухудшился.
Шаг 23. Соберите dashboard для инженера
Инженерный dashboard должен быстро вести к причине.
Блоки:
- model error rate;
- tool error rate;
- invalid JSON rate;
- retrieval empty rate;
- rate limit;
- timeout;
- queue delay;
- provider latency;
- fallback reasons;
- trace explorer по `run_id`.
Проверка: по алерту можно за 2-3 клика открыть конкретные traces.
Шаг 24. Соберите dashboard для безопасности
Для агентных систем safety dashboard обязателен.
Блоки:
- prompt injection attempts;
- blocked tool calls;
- approval bypass attempts;
- PII leak risks;
- external send attempts;
- policy violations;
- suspicious files;
- high-risk actions;
- human review queue;
- repeated offenders by user or source.
Проверка: safety events не смешаны с обычными backend errors.
Шаг 25. Настройте trace viewer
Trace должен показывать дерево выполнения.
Минимальная структура:
run
intent_detection
retrieval
vector_search
rerank
model_call
tool_call
external_api
validation
final_answer
В каждом span храните:
- start time;
- end time;
- status;
- input summary;
- output summary;
- latency;
- cost;
- errors;
- links to logs.
Проверка: trace одного плохого ответа показывает, какой шаг дал сбой.
Шаг 26. Подключите OpenTelemetry
OpenTelemetry связывает AI traces с обычным backend.
Добавьте span attributes:
ai.run_id
ai.agent_name
ai.task_type
ai.model_id
ai.provider
ai.tool_name
ai.cost
ai.input_tokens
ai.output_tokens
ai.safety_flag
Проверка: в общем trace видно HTTP request, queue job, model call и tool call.
Шаг 27. Подключите LLM observability платформу
Для MVP можно выбрать Langfuse или LangSmith.
Что отправлять:
- trace id;
- run id;
- prompt version;
- model id;
- input/output summary;
- token usage;
- tool calls;
- retrieval context;
- scores;
- user feedback.
Проверка: из платформы можно открыть конкретный run и увидеть prompt, retrieval и tool sequence.
Шаг 28. Настройте хранение персональных данных
Мониторинг не должен становиться утечкой.
Правила:
- маскируйте email, телефон, паспорт, токены;
- храните полный prompt только в защищенном storage;
- в dashboard показывайте summary;
- ограничьте доступ к traces;
- задайте TTL для raw logs;
- не пишите API keys;
- не логируйте полные документы без причины;
- разделите dev и production.
Проверка: в обычном dashboard нет сырых персональных данных.
Шаг 29. Настройте retention
Не храните все вечно.
Стартовые сроки:
- raw prompts: 7-30 дней;
- prompt hashes: 180 дней;
- cost logs: 365 дней;
- latency metrics: 365 дней;
- audit log: по требованиям бизнеса;
- safety events: 365 дней;
- feedback: 365 дней;
- traces with PII: минимально возможный срок.
Проверка: cron или job удаляет старые raw logs, но оставляет агрегаты.
Шаг 30. Проверьте мониторинг на тестовом сбое
Сымитируйте проблемы:
- модель вернула invalid JSON;
- tool API вернул 500;
- retrieval ничего не нашел;
- пользователь сделал prompt injection;
- провайдер дал rate limit;
- cost вырос в 2 раза;
- p95 latency превысил лимит;
- approval отклонили.
Проверка: каждая проблема видна в логах, dashboard и alert events.
Шаг 31. Настройте incident workflow
Если мониторинг нашел проблему, нужен порядок действий.
Workflow:
- alert создает incident;
- ответственный открывает trace;
- определяет компонент;
- ставит статус;
- применяет mitigation;
- добавляет run в eval dataset;
- закрывает incident;
- пишет короткий вывод.
Проверка: после инцидента остается не только закрытый alert, но и тест против повторения.
Шаг 32. Минимальный результат для запуска
MVP мониторинга готов, если выполнены условия:
- у каждого запроса есть `run_id`;
- есть `agent_runs`;
- есть `model_call_log`;
- есть `tool_call_log`;
- есть `retrieval_log`;
- есть `latency_log`;
- есть `cost_log`;
- есть `error_log`;
- есть `safety_event_log`;
- есть `feedback_log`;
- настроены alerts по error rate, cost, latency и safety;
- есть dashboard для продукта и инженера;
- плохой run можно превратить в eval case;
- сырые персональные данные не светятся в dashboard.
Проверка результата: возьмите любой плохой ответ пользователя и за минуту восстановите путь: input, prompt version, model, retrieval, tools, errors, cost, latency и final answer.
Что нельзя автоматизировать в первой версии
В первой версии не автоматизируйте:
- автозакрытие safety incidents;
- автоматическое повышение лимитов стоимости;
- автоматическую замену модели без evals;
- удаление логов без retention policy;
- отправку raw prompts всем разработчикам;
- игнорирование human feedback;
- скрытие fallback от владельца продукта;
- массовую запись персональных данных в dashboard;
- алерты без ответственного;
- action tools без audit log;
- production-запуск без trace по `run_id`;
- обновление prompt без сравнения метрик;
- работу без error budget;
- хранение API keys в логах;
- оценку качества только по "ответ выглядит нормально".
Сначала добейтесь прозрачности одного агента, потом переносите схему мониторинга на остальные.
Частые вопросы
Чем мониторинг ИИ-агента отличается от обычного мониторинга сайта?
Обычный мониторинг показывает HTTP errors, CPU, память и время ответа. Мониторинг ИИ-агента должен дополнительно показывать prompt, model calls, retrieval, tool calls, cost, safety flags, fallback, handoff и качество ответа.
Нужно ли хранить полный prompt?
Не всегда. Для отладки полезно хранить полный prompt в защищенном storage с ограниченным доступом и TTL. В обычных таблицах и dashboard лучше хранить hash, summary и признаки PII.
Какие метрики самые важные на старте?
Минимум: completion rate, error rate, p95 latency, cost per run, fallback rate, invalid JSON rate, tool error rate, retrieval empty rate, safety events и user feedback.
Что делать с плохими ответами пользователей?
Сохраняйте `run_id`, feedback, правильный ответ и причину ошибки. Потом превращайте такие случаи в eval cases, чтобы новая модель или prompt не повторяли ту же ошибку.
Langfuse, LangSmith или свой мониторинг?
Для быстрого старта удобны Langfuse или LangSmith: traces, prompts, datasets, evals и dashboards уже готовы. Свой мониторинг имеет смысл, если есть строгие требования к данным, self-hosting или нужно глубоко связать AI traces с внутренней инфраструктурой.