Accuracy никто не меряет в проде. Не потому что лень - потому что нечем. Агент либо сделал задачу, либо нет, и "нет" обнаруживается через несколько часов когда смотришь на результат.
Зато есть вещи которые можно мерять в реальном времени и которые говорят о здоровье агента раньше чем он сломается.
Индустрия идёт к полноценным observability-платформам - traces, metrics, events, DAG-графы вызовов. OpenObserve, LangSmith, Arize - инструменты становятся стандартом. Но если поставить красивый дашборд не понимая что в нём смотреть - это витрина перед пустым магазином.
Начинать надо с пяти чисел.
Базовый минимум: пять чисел для любого агента
1. Разбивка токенов - не сумма
Одна цифра "потрачено X токенов" бесполезна. Важна структура:
inputTokens- новый текст от пользователя и ответы инструментовoutputTokens- что сгенерировала модельcacheReadTokens- прочитано из кеша (промпт, история)cacheCreateTokens- записано в кеш
Структура говорит об архитектуре. Если cacheRead в 10-100 раз больше input - у тебя длинные стабильные сессии, и это хорошо. Если cacheRead маленький - сессии короткие или промпт постоянно меняется.
2. Cache ratio - индикатор здоровья архитектуры
Cache ratio = cacheRead / (cacheRead + cacheCreate + input).
Кеш у Claude стоит в 10 раз дешевле обычного input. При ratio 97% каждый вызов обходится в 6-7 раз дешевле чем без кеша. Это не оптимизация - это условие работы продуктового агента.
Если ratio падает ниже 80% - что-то не так. Либо сессии рестартуют слишком часто, либо системный промпт меняется динамически, либо история не сохраняется. Смотреть в первую очередь.
3. Latency: минимум, среднее, максимум
Среднее время ответа - не главная цифра. Максимальное - главная.
Разброс между avg и max показывает характер задач. Если avg 30 секунд, а max 23 минуты - агент иногда делает что-то тяжёлое: цепочки субагентов, внешние операции с retry, долгие SSH-сессии. Без max этого не видно.
4. Контекстное окно - ресурс который течёт
Не "сколько токенов потрачено", а "сколько токенов в окне прямо сейчас". Это разные вещи.
Контекст растёт пока сессия активна. Когда инструменты возвращают большой вывод, когда история не сжимается, когда в контекст лезет мусор - окно раздувается незаметно.
Пороги: 350K - предупреждение, 600K - красный флаг, начинай новую сессию. Без мониторинга это обнаруживается когда агент начинает вести себя странно и непонятно почему.
5. API вызовы и стоимость в день
Дневные вызовы - пульс агента. Если вызовов мало и latency высокая - что-то застряло. Если вызовов много и стоимость неожиданно выросла - проверь что именно изменилось.
Стоимость в день даёт операционную реальность. Не "мы используем Claude API" а "$15-30 в день при нормальной нагрузке, $200 без кеша".
Мои метрики и почему именно они
Я строил мониторинг не из best practices - а потому что несколько раз обнаруживал проблемы слишком поздно. Каждая метрика появилась после конкретного инцидента.
Разбивка токенов появилась когда я не понимал почему некоторые дни дорогие. Оказалось: в один день cacheCreate был в 3 раза выше обычного - промпт поменялся и кеш пришлось перезаписывать.
Cache ratio появился как главный показатель после того как я увидел что без кеша мои недельные $133 превратились бы в $924. Это не абстракция - это деньги.
Max latency появился после запроса который занял 23 минуты 29 секунд. Я не знал что такое бывает пока не начал трекать. Это был деплой через SSH с несколькими retry-циклами - всё правильно работало, просто долго.
Контекстное окно появился после странного поведения агента в длинных сессиях. Пока я писал эту статью - у меня было 744K токенов в контексте. Это выше красной зоны. Живой пример того о чём пишу.
Субагенты появился чтобы понимать параллелизацию. За текущую сессию: 198 API вызовов, 135 субагентов - 0.68 субагента на запрос. Когда этот показатель резко растёт без роста задач - агент не справляется сам и делегирует всё подряд.
mem0 hit rate появился чтобы понимать работает ли память вообще. 2 поиска, 2 хита, 0 сбросов. Если бы хиты были 0 при активных поисках - значит память пустая или сломанная.
Реальные данные за неделю:
| День | API вызовов | Avg latency | Cost ($) | Без кеша ($) |
|---|---|---|---|---|
| 24 мар | 92 | 71s | 20.7 | 128 |
| 25 мар | 123 | 30s | 17.6 | 117 |
| 26 мар | 164 | 27s | 23.6 | 154 |
| 27 мар | 36 | 139s | 18.6 | 138 |
| 28 мар | 79 | 50s | 28.3 | 210 |
| 29 мар | 27 | 147s | 17.5 | 126 |
| 30 мар | 20 | 51s | 7.0 | 51 |
Итого за неделю: 541 вызов, $133 с кешем, $924 без. Cache ratio 97.5%.
Как реализовать минимально
Всё в двух JSON-файлах: session_stats.json (текущая сессия) и daily_stats.json (7 дней). Никаких зависимостей.
interface SessionStats {
inputTokens: number;
outputTokens: number;
cacheReadTokens: number;
cacheCreateTokens: number;
apiCalls: number;
sessionStartTime: number;
fastestRequestMs: number;
slowestRequestMs: number;
totalRequestMs: number;
totalRequests: number;
subagentCount: number;
mem0Searches: number;
mem0Hits: number;
lastContextWindow: number;
}После каждого API-ответа - обновить, записать на диск. По команде /stats - сформатировать и вернуть. 50 строк кода. Потом, когда поймёшь что именно смотришь - можно добавить OpenObserve или LangSmith.
Куда двигаться дальше
Индустрия стандартизируется на трёх слоях: traces (полный путь: промпт > tool calls > ответ), metrics (агрегаты: производительность, стоимость), events (алерты). Gartner прогнозирует что к 2028 году 60% инженерных команд будут использовать AI observability платформы - против 18% сейчас.
Но пять чисел в файле - это база. Без неё платформа не поможет.