Мониторинг AI-приложений — это непрерывное наблюдение за производительностью, стоимостью и качеством работы AI-компонентов в продакшене. В отличие от обычного мониторинга веб-сервисов, AI-мониторинг включает уникальные метрики: стоимость токенов, latency моделей, качество ответов, drift промптов. В этой статье построим полноценную систему мониторинга.
Ключевые метрики AI-приложений
Метрики делятся на четыре категории:
Производительность
- Latency (P50, P95, P99) — время ответа модели. P95 не должен превышать 10 секунд.
- Time to First Token (TTFT) — время до первого токена (для streaming). Целевое значение < 500 мс.
- Tokens per Second (TPS) — скорость генерации. GPT-4o: 80-100 TPS.
- Throughput — количество запросов в секунду (QPS).
Стоимость
- Cost per Request — средняя стоимость одного запроса.
- Daily/Monthly Spend — суточные и месячные расходы.
- Cost by Model — расходы в разрезе моделей.
- Cost per User — расходы на одного пользователя.
Надёжность
- Error Rate — процент ошибочных запросов. Целевое значение < 1%.
- Rate Limit Hits — количество срабатываний rate limit.
- Timeout Rate — процент запросов с таймаутом.
Качество
- Response Length — средняя длина ответа (резкое изменение может означать проблему).
- User Feedback — процент положительных отзывов (thumbs up/down).
- Refusal Rate — как часто модель отказывается отвечать.
Сбор метрик на Python
import time
from prometheus_client import Counter, Histogram, Gauge, start_http_server
from openai import OpenAI
# Prometheus-метрики
ai_requests_total = Counter(
"ai_requests_total", "Total AI API requests", ["model", "status"]
)
ai_request_duration = Histogram(
"ai_request_duration_seconds", "AI request latency",
["model"], buckets=[0.5, 1, 2, 5, 10, 30]
)
ai_tokens_total = Counter(
"ai_tokens_total", "Total tokens consumed", ["model", "type"]
)
ai_daily_cost = Gauge(
"ai_daily_cost_dollars", "Estimated daily cost", ["model"]
)
client = OpenAI(
base_url="https://api.modelswitch.ru/v1",
api_key="msk_ваш_ключ"
)
# Примерные цены за 1M токенов
PRICES = {
"gpt-4o": {"input": 2.50, "output": 10.00},
"gpt-4o-mini": {"input": 0.15, "output": 0.60},
"claude-3.5-sonnet": {"input": 3.00, "output": 15.00},
}
def monitored_completion(messages: list, model: str = "gpt-4o") -> str:
"""Запрос к AI с автоматическим сбором метрик."""
start = time.time()
try:
response = client.chat.completions.create(model=model, messages=messages)
duration = time.time() - start
# Записываем метрики
ai_requests_total.labels(model=model, status="success").inc()
ai_request_duration.labels(model=model).observe(duration)
ai_tokens_total.labels(model=model, type="input").inc(response.usage.prompt_tokens)
ai_tokens_total.labels(model=model, type="output").inc(response.usage.completion_tokens)
# Считаем стоимость
if model in PRICES:
cost = (
response.usage.prompt_tokens / 1_000_000 * PRICES[model]["input"]
+ response.usage.completion_tokens / 1_000_000 * PRICES[model]["output"]
)
ai_daily_cost.labels(model=model).inc(cost)
return response.choices[0].message.content
except Exception as e:
ai_requests_total.labels(model=model, status="error").inc()
ai_request_duration.labels(model=model).observe(time.time() - start)
raise
# Запуск Prometheus endpoint
start_http_server(9090)
print("Prometheus metrics на :9090/metrics")
Настройка алертов
Критические алерты, которые должны быть у каждого AI-приложения:
# prometheus_alerts.yml
groups:
- name: ai_alerts
rules:
# Error rate > 5%
- alert: HighAIErrorRate
expr: rate(ai_requests_total{status="error"}[5m]) / rate(ai_requests_total[5m]) > 0.05
for: 5m
annotations:
summary: "AI API error rate выше 5%"
# Latency P95 > 10s
- alert: HighAILatency
expr: histogram_quantile(0.95, rate(ai_request_duration_seconds_bucket[5m])) > 10
for: 5m
annotations:
summary: "AI API latency P95 > 10 секунд"
# Расход > $100 за день
- alert: HighAICost
expr: ai_daily_cost_dollars > 100
annotations:
summary: "Дневной расход на AI API превысил $100"
Метрики в TypeScript-приложениях
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.modelswitch.ru/v1",
apiKey: "msk_ваш_ключ",
});
interface AIMetrics {
totalRequests: number;
totalErrors: number;
totalTokens: number;
totalCostUsd: number;
latencyP50: number;
latencyP95: number;
}
class AIMetricsCollector {
private latencies: number[] = [];
metrics: AIMetrics = {
totalRequests: 0, totalErrors: 0, totalTokens: 0,
totalCostUsd: 0, latencyP50: 0, latencyP95: 0,
};
recordRequest(latencyMs: number, tokens: number, costUsd: number) {
this.metrics.totalRequests++;
this.metrics.totalTokens += tokens;
this.metrics.totalCostUsd += costUsd;
this.latencies.push(latencyMs);
this.updatePercentiles();
}
recordError() {
this.metrics.totalRequests++;
this.metrics.totalErrors++;
}
private updatePercentiles() {
const sorted = [...this.latencies].sort((a, b) => a - b);
this.metrics.latencyP50 = sorted[Math.floor(sorted.length * 0.5)] ?? 0;
this.metrics.latencyP95 = sorted[Math.floor(sorted.length * 0.95)] ?? 0;
}
getErrorRate(): number {
return this.metrics.totalRequests > 0
? this.metrics.totalErrors / this.metrics.totalRequests
: 0;
}
}
const collector = new AIMetricsCollector();
// Использование
const start = Date.now();
const response = await client.chat.completions.create({
model: "gpt-4o",
messages: [{ role: "user", content: "Привет" }],
});
collector.recordRequest(
Date.now() - start,
response.usage?.total_tokens ?? 0,
0.005 // примерная стоимость
);
console.log("Метрики:", collector.metrics);
Лучшие практики мониторинга
- Начните с малого — latency, error rate и cost достаточно для старта. Добавляйте метрики по мере роста.
- Разделяйте по моделям — разные модели имеют разные характеристики. Алерты должны учитывать это.
- Алерт на аномалии расходов — если дневной расход вырос в 3 раза — это может быть утечка ключа или баг.
- Дашборд ModelSwitch — используйте встроенную аналитику ModelSwitch для базового мониторинга без дополнительной настройки.
- Retention логов — храните подробные логи 30 дней, агрегированные метрики — 12 месяцев.
- Не логируйте PII — не сохраняйте персональные данные пользователей в логах промптов.
Мониторинг — это не опциональная функция, а обязательный компонент production AI-приложений. ModelSwitch предоставляет дашборд с расходами и метриками из коробки, что покрывает базовые потребности. Для продвинутого мониторинга подключите Prometheus и Grafana.