Что такое SLI (Service Level Indicators) для AI системы и как их собирать?

Краткий тезис

SLI (Service Level Indicators) — это количественные метрики, которые измеряют ключевые аспекты работы AI-системы: производительность, надёжность, качество ответов и доступность. Для AI-систем, особенно в архитектуре Agentic RAG, SLI включают латентность (p50/p95/p99), частоту ошибок (4xx/5xx), пропускную способность (req/s), метрики качества (faithfulness, answer relevance) и аптайм. Сбор SLI требует комбинации инструментов мониторинга (Prometheus, OpenTelemetry), логирования, LLM-as-a-judge и A/B-тестирования.


1. Определение SLI, SLO и SLA

SLI (Service Level Indicator) — числовая метрика, отражающая определённый аспект сервиса. Примеры: время ответа, процент успешных запросов, точность ответов.

SLO (Service Level Objective) — целевое значение SLI, которое команда обязуется поддерживать. Например: «p95 latency < 2 секунд в 99% времени за месяц».

SLA (Service Level Agreement) — юридическое обязательство перед клиентом, обычно жёстче SLO. Например: «Если p95 latency превышает 2 секунды более 5 минут в месяц, клиент получает компенсацию».

ТерминПример для AI-системы
SLIp95 latency = 1.8 с
SLOp95 latency < 2 с в 99.9% времени за месяц
SLAp95 latency < 2 с в 99.9% времени за месяц, иначе возврат 10% стоимости

2. Категории SLI для AI-систем

SLI для AI можно разделить на четыре группы:

  • Производительность (Performance): латентность, пропускная способность, время генерации первого токена (TTFT).
  • Надёжность (Reliability): частота ошибок, аптайм, rate limits.
  • Качество (Quality): faithfulness, answer relevance, context relevance, toxicity, bias.
  • Безопасность (Safety): процент ответов, содержащих запрещённый контент, PII leakage.

В контексте Agentic RAG добавляются метрики, связанные с действиями агента: успешность выполнения инструментов, количество шагов, время на планирование.


3. Latency (задержка)

Latency — время от отправки запроса до получения полного ответа. Измеряется в миллисекундах или секундах.

Ключевые перцентили:

  • p50 (медиана): типичное время ответа.
  • p95: 95% запросов быстрее этого значения.
  • p99: 99% запросов быстрее — критично для SLA.

Как собирать:

  • Вставлять тайминги в код (например, с помощью time.perf_counter() в Python).
  • Использовать middleware в веб-фреймворке (FastAPI, Flask).
  • Экспортировать метрики в Prometheus через клиентскую библиотеку (prometheus_client).
import time
from prometheus_client import Histogram

latency_histogram = Histogram('llm_request_duration_seconds', 'LLM request latency', buckets=[0.1, 0.5, 1, 2, 5, 10])

def call_llm(prompt):
    start = time.perf_counter()
    response = llm_client.generate(prompt)
    latency = time.perf_counter() - start
    latency_histogram.observe(latency)
    return response

Важно: для streaming-ответов измеряют Time to First Token (TTFT) и Total Generation Time.


4. Error Rate (частота ошибок)

Error rate — доля запросов, завершившихся ошибкой. Разделяют:

  • 4xx ошибки: клиентские (неверный запрос, превышение rate limit, токен истёк).
  • 5xx ошибки: серверные (перегрузка, сбой модели, таймаут).

Как собирать:

  • Логировать статус-коды HTTP-ответов.
  • В Prometheus — счётчик ошибок (Counter).
from prometheus_client import Counter

error_counter = Counter('llm_errors_total', 'Total LLM errors', ['status_code'])

def handle_request(request):
    try:
        response = llm_client.generate(request)
        error_counter.labels(status_code=200).inc()
        return response
    except HTTPError as e:
        error_counter.labels(status_code=e.code).inc()
        raise

Типичные SLO: error rate < 1% для 5xx, < 0.1% для 4xx (если не связаны с клиентом).


5. Throughput (пропускная способность)

Throughput — количество запросов, обработанных за единицу времени. Измеряется в requests per second (RPS) или tokens per second (TPS) для LLM.

Как собирать:

  • Использовать счётчик запросов в Prometheus (Counter), затем вычислять rate через rate() в PromQL.
  • Для TPS — логировать количество сгенерированных токенов.
from prometheus_client import Counter

request_counter = Counter('llm_requests_total', 'Total LLM requests')
token_counter = Counter('llm_tokens_total', 'Total generated tokens')

def generate(prompt):
    request_counter.inc()
    response = llm_client.generate(prompt)
    token_counter.inc(len(response.tokens))
    return response

SLO: обычно задают минимальный throughput (например, 100 RPS) или максимальный (чтобы не превысить лимиты API).


6. Quality (качество ответов)

Качество — самая сложная категория SLI для AI. Основные метрики:

  • Faithfulness (фактологичность): насколько ответ соответствует предоставленному контексту (без галлюцинаций).
  • Answer Relevance (релевантность ответа): отвечает ли ответ на заданный вопрос.
  • Context Relevance (релевантность контекста): насколько извлечённые документы соответствуют запросу (для RAG).
  • Toxicity: наличие оскорбительного или вредного контента.

Как собирать:

  • LLM-as-a-judge: использовать отдельную LLM (например, GPT-4) для оценки ответов по шкале 1–5.
  • RAGAS: библиотека с готовыми метриками (faithfulness, answer relevancy, context precision).
  • Человеческая оценка: краудсорсинг или внутренние эксперты (дорого, но точнее).
from ragas import evaluate
from datasets import Dataset

data = Dataset.from_dict({
    'question': ['What is RAG?'],
    'answer': ['RAG stands for Retrieval-Augmented Generation.'],
    'contexts': [['Retrieval-Augmented Generation (RAG) is a technique...']]
})
scores = evaluate(data, metrics=['faithfulness', 'answer_relevancy'])
print(scores)

SLO: например, faithfulness > 0.9, answer relevance > 0.85.


7. Availability (доступность)

Availability — доля времени, в течение которого система отвечает на запросы. Формула:

Availability = (Total Time - Downtime) / Total Time * 100%

Как собирать:

  • Health check эндпоинт (например, /health), который проверяет доступность LLM API, базы данных, векторного хранилища.
  • Мониторинг uptime с помощью Uptime Kuma, Pingdom или Prometheus Blackbox Exporter.

Типичные SLO: 99.9% (три девятки) — допустимо ~8.7 часов простоя в год.


8. Инструменты сбора SLI

ИнструментНазначение
Prometheus + GrafanaСбор метрик (латентность, ошибки, throughput), визуализация дашбордов
OpenTelemetryТрассировка запросов, сбор распределённых метрик
ELK (Elasticsearch, Logstash, Kibana)Логирование ошибок и качества
Lunary / HeliconeМониторинг LLM API (стоимость, токены, задержки)
RAGAS / DeepEvalОценка качества ответов
Custom LLM-as-a-judgeАвтоматическая оценка faithfulness, relevance

Пример дашборда Grafana:

  • График p50/p95/p99 latency за последние 24 часа.
  • Счётчик ошибок по статусам (4xx/5xx).
  • Throughput (RPS) с аномалиями.
  • Средний faithfulness score по запросам.

9. Особенности для Agentic RAG

В Agentic RAG агент выполняет несколько шагов: планирование, вызов инструментов, генерация. Дополнительные SLI:

  • Step latency: время на каждый шаг агента.
  • Tool success rate: доля успешных вызовов внешних инструментов (API, базы данных).
  • Task completion rate: процент задач, которые агент завершил без ошибок.

Сбор требует трассировки каждого шага (например, через OpenTelemetry spans).


Пет-проект для закрепления

Задача: Разработать систему мониторинга SLI для простого RAG-сервиса (FastAPI + OpenAI + ChromaDB).

Инструменты: Python, Prometheus, Grafana, RAGAS, Docker.

Шаги:

  1. Реализовать RAG-эндпоинт с замером latency (p50/p95/p99) через prometheus_client.Histogram.
  2. Добавить счётчик ошибок (4xx/5xx) и счётчик запросов.
  3. Настроить health check (/health) и экспорт метрик в /metrics.
  4. Запустить Prometheus для сбора метрик и Grafana для дашборда.
  5. Добавить асинхронную оценку faithfulness через RAGAS (сохранять результаты в отдельную метрику).
  6. Настроить алерты в Grafana (например, p95 latency > 3 с или error rate > 2%).

Ожидаемый результат: Дашборд с графиками latency, error rate, throughput и faithfulness. Алерты при нарушении SLO.


Связь с другими вопросами

ВопросТема
387Что такое SLO и SLA для AI-систем?
389Как настроить алертинг для AI-системы?
390Какие метрики качества ответов LLM вы знаете?
391Как проводить A/B-тестирование AI-модели?
392Что такое LLM-as-a-judge и как его использовать?
393Как оценивать галлюцинации в RAG?

Навигация