中文翻译暂不可用,显示俄语原文。

Реализовать SLO для faithfulness

ТЕХНИЧЕСКОЕ ЗАДАНИЕ: Реализовать SLO для faithfulness

1. Цель задачи

Научиться внедрять мониторинг качества ответов LLM‑системы в production. Вы настроите измерение faithfulness (фактологической верности) с помощью RAGAS, рассчитаете SLI (Service Level Indicator) как скользящее среднее метрики и зададите SLO (Service Level Objective) – порог, при нарушении которого срабатывает алерт. В результате команда будет получать уведомление о падении faithfulness ниже приемлемого уровня.

Ключевой результат Рабочий пайплайн: логи → расчёт faithfulness → SLI → сравнение с SLO → алерт в систему оповещения.

2. Исходные данные

Что нужноОткуда взять
Production RAG‑система (или её аналог)Любой существующий RAG‑проект, pet‑проект, или тестовый стенд
Логи ответов и контекстов за последние 7 днейClickHouse, Loki, файлы JSON/CSV
Базовые навыки Python и работы с RAGASДокументация RAGAS, примеры из открытых источников
Prometheus и Alertmanager (или их аналоги)Установленные локально в Docker или на сервере
Система метрик (Grafana)Для визуализации SLI (опционально)

Если нет реального production‑стенда — симулируем:

  1. Возьмите любой открытый датасет с question‑answer парами (например, Natural Questions, HotpotQA) и индексируйте документы в Qdrant/FAISS.
  2. Запустите простой RAGпайплайн (открытый LLM через Ollama / vLLM + retrieval из FAISS).
  3. Прокрутите 500–1000 запросов, сохраните ответы, контексты и ground truth (если доступны) в CSV.
  4. Считайте faithfulness по каждой паре (answer, context) с помощью RAGAS.

3. Технологический стек

КомпонентИнструментыНазначение
Оценка faithfulnessRAGAS (Python)Расчёт метрики по паре (ответ, контекст)
Вычисление SLIPython (pandas, numpy)Скользящее среднее faithfulness за окно N запросов
Хранение метрикPrometheus (custom metrics) / InfluxDBСбор значений SLI и алертные метрики
АлертингAlertmanager (Prometheus) / Grafana AlertsОтправка уведомлений при нарушении SLO
Витрина метрикGrafanaДашборд для визуализации SLI и SLO
Оркестрацияcron / Airflow / Prefect (опционально)Периодический запуск расчёта

4. Этапы выполнения

Этап 1: Настройка измерения faithfulness (1 час)

Действия

  1. Установите RAGAS
    pip install ragas
    Если используете внешнюю LLM (например, GPT-4 для оценки faithfulness) – настройте API‑ключ. Для изолированной работы можно использовать ragas с локальными моделями (через langchain + Ollama).

  2. Подготовьте данные для оценки
    Соберите из логов (или сгенерируйте) CSV‑файл со столбцами:

    • question — запрос пользователя;
    • answer — ответ RAG‑системы;
    • contexts — список текстов (chunks), которые были переданы LLM (строкой, разделённой ||| или JSON).

    Пример строки:

    question,answer,contexts
    "Что такое SLO?","SLO – это целевой уровень качества сервиса...","SLO — Service Level Objective|||SLI — Service Level Indicator"
    
  3. Реализуйте скрипт расчёта faithfulness
    Используйте Ragas с метрикой Faithfulness:

    from ragas import evaluate
    from ragas.metrics import faithfulness
    from datasets import Dataset
    import pandas as pd
    
    df = pd.read_csv("rag_logs.csv")
    dataset = Dataset.from_pandas(df[["question","answer","contexts"]])
    # преобразуем contexts в список
    dataset = dataset.map(lambda x: {"contexts": x["contexts"].split("|||")})
    score = evaluate(dataset, metrics=[faithfulness])
    df["faithfulness"] = score["faithfulness"]
    df.to_csv("rag_logs_with_scores.csv", index=False)
    
  4. Проверьте распределение faithfulness
    Постройте гистограмму, вычислите 25-й / 50-й / 95-й перцентиль. Это нужно для выбора разумного SLO.

Ожидаемый результат этапа CSV‑файл с колонкой faithfulness для каждой записи; гистограмма распределения метрики.

Этап 2: Вычисление SLI и выбор SLO (45 минут)

Действия

  1. Определите временное окно для SLI
    Рекомендуется скользящее среднее за последние 100 запросов (или за 1 час, если запросов меньше 100 в час).

  2. Напишите функцию расчета SLI

    import pandas as pd
    
    df = pd.read_csv("rag_logs_with_scores.csv")
    WINDOW = 100
    df["sli"] = df["faithfulness"].rolling(window=WINDOW, min_periods=1).mean()
    
  3. Выберите SLO
    Исходя из гистограммы и бизнес-требований (обычно 0.85–0.95).
    Пример: SLO = 0.90 (90% faithfulness).
    Запишите SLO в конфигурационный файл config.yaml:

    slo:
      faithfulness: 0.90
      window: 100
      evaluation_interval: "5m"
    
  4. Экспортируйте SLI в Prometheus
    Используйте prometheus_client:

    from prometheus_client import start_http_server, Gauge
    import time
    
    sli_gauge = Gauge('rag_faithfulness_sli', 'SLI for faithfulness', ['model_version'])
    # ... внутри цикла вычисляем текущий SLI и обновляем gauge
    sli_gauge.labels(model_version="v1").set(current_sli)
    

    Запустите скрипт как отдельный процесс на порту 8000.

Ожидаемый результат этапа Работающий эндпоинт метрик http://localhost:8000/metrics, на котором доступен gauge rag_faithfulness_sli; конфигурационный файл config.yaml.

Этап 3: Настройка алерта при нарушении SLO (45 минут)

Действия

  1. Настройте Prometheus на сбор метрики
    Добавьте в prometheus.yml:

    scrape_configs:
      - job_name: 'faithfulness_sli'
        scrape_interval: 1m
        static_configs:
          - targets: ['localhost:8000']
    
  2. Напишите правило алерта в Prometheus
    Создайте файл alerts.yml:

    groups:
    - name: faithfulness_alerts
      rules:
      - alert: FaithfulnessBelowSLO
        expr: rag_faithfulness_sli < 0.90
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "Faithfulness SLI below SLO ({{ $value }})"
          description: "SLI = {{ $value }}, SLO = 0.90. Последние 100 запросов."
    

    Подключите в prometheus.yml через rule_files: ['alerts.yml'].

  3. Настройте Alertmanager
    Создайте alertmanager.yml с роутингом на email / Slack / Telegram (можно использовать hook‑бота).
    Пример для Slack:

    receivers:
    - name: 'slack'
      slack_configs:
      - api_url: 'https://hooks.slack.com/services/...'
        channel: '#alerts'
    route:
      receiver: 'slack'
    
  4. Проверьте срабатывание алерта
    Искусственно понизьте faithfulness (например, подайте на вход случайные ответы). Убедитесь, что через 5 минут алерт появляется в Alertmanager и приходит уведомление.

Ожидаемый результат этапа Алерт FaithfulnessBelowSLO отображается в Prometheus UI, уведомление доставлено (или видно в логах Alertmanager).

Этап 4: Развёртывание дашборда и документация (30 минут)

Действия

  1. Создайте дашборд в Grafana

    • Панель «SLI Faithfulness (скользящее среднее)» с линией SLO.
    • Панель «Распределение faithfulness (гистограмма)».
    • Панель «Количество запросов» (чтобы понимать выборку).
  2. Напишите README проекта
    Опишите:

    • Формат логов;
    • Как запустить скрипт расчёта;
    • Где лежат правила алертов;
    • Как интерпретировать SLI и SLO.
  3. Автоматизируйте запуск (опционально)
    Добавьте скрипт в crontab (каждые 5 минут) или в Airflow DAG.

Ожидаемый результат этапа Дашборд в Grafana с метриками; README в репозитории.

Этап 5: Финальная проверка и корректировка SLO (15 минут)

Действия

  1. Подайте 50–100 новых запросов (лучше разнообразных).
  2. Проверьте, что SLI не упал ниже SLO при нормальной работе.
  3. Если ложных срабатываний много – увеличьте SLO или окно агрегации.
  4. Проведите нагрузочный тест имитируйте деградацию (например, замените контексты на пустые) и убедитесь, что алерт срабатывает.

Ожидаемый результат этапа Скорректированный config.yaml, подтверждение работоспособности.

5. Критерии приемки (Definition of Done)

  • Скрипт расчёта faithfulness сохраняет результаты в CSV с колонкой faithfulness.
  • SLI вычисляется как скользящее среднее за настраиваемое окно.
  • Prometheus endpoint отдаёт gauge rag_faithfulness_sli с лейблом model_version.
  • Prometheus правило алерта FaithfulnessBelowSLO срабатывает при SLI < SLO в течение 5 минут.
  • Alertmanager отправляет уведомление в Slack/Telegram/email (или пишет в лог, если нет внешнего сервиса).
  • В Grafana создан дашборд с минимум двумя панелями (SLI + SLO линия, распределение faithfulness).
  • Конфигурация SLO вынесена в отдельный файл config.yaml.
  • README описывает запуск, формат данных и настройку алертирования.
  • Воспроизведён сценарий деградации (алерт успешно сработал).

6. Ожидаемый результат

Основной артефакт
Репозиторий / папка проекта со следующей структурой:

faithfulness-slo/
├── config.yaml                 # Параметры SLO и окна
├── evaluate_faithfulness.py    # Скрипт расчёта faithfulness из CSV
├── compute_sli.py              # Скрипт вычисления SLI и экспорта в Prometheus
├── alerts.yml                  # Правила алертов Prometheus
├── alertmanager.yml            # Конфигурация Alertmanager
├── docker-compose.yml          # (опционально) для поднятия стека
├── data/
│   ├── rag_logs.csv            # Исходные логи
│   └── rag_logs_with_scores.csv # Результат после расчёта
├── grafana/
│   └── dashboard.json          # Экспорт дашборда
└── README.md                   # Документация

Дополнительные результаты

  • Рабочий Prometheus + Alertmanager (возможно в Docker).
  • Настроенный канал оповещений (Slack/Telegram/email).
  • Понимание, как адаптировать SLO под другие метрики (ответственность, полезность).

7. Возможные сложности и их решение

СложностьРешение
Нет production‑логовИспользовать симуляцию: датасет + простой RAG (см. этап 0).
RAGAS требует много ресурсов (LLM‑вызовы)Заменить Faithfulness на упрощённую модель (например, SentenceTransformer‑based scorer) или использовать маленькую LLM (Mistral-7B).
Prometheus не видит метрикиПроверить scrape_interval и target; убедиться, что скрипт работает (curl localhost:8000/metrics).
Слишком много ложных срабатыванийУвеличить окно агрегации (например, до 200 запросов) или повысить SLO с учётом естественного шума.
Нет доступа к внешнему API для алертов (Slack/Telegram)Настроить webhook на локальный сервер или писать алерты в файл (alertmanager.log).
Данные не содержат ground truthFaithfulness оценивает верность ответа данному контексту, ground truth не нужен – контекст считается «истиной».

8. Бюджет времени (оценка)

ЭтапВремя
1. Настройка измерения faithfulness1 ч
2. Вычисление SLI и выбор SLO45 мин
3. Настройка алерта45 мин
4. Дашборд и документация30 мин
5. Финальная проверка15 мин
Итого~3 ч 15 мин

Примечание Для первого раза заложите дополнительно 1 час на отладку конфигурации Prometheus/Alertmanager.

9. Связанные вопросы из базы знаний

ВопросТема
42Что такое SLO, SLI, SLA
55Метрики RAGAS (faithfulness, answer relevancy)
101Мониторинг ML‑систем в production
204Настройка Prometheus Alertmanager
310Оценка faithfulness в RAG
412Экспорт Python‑метрик в Prometheus
567LLM‑eval асимметрия
701Выбор порогов SLO
814Observability RAG‑систем
899Алертинг на основе скользящего среднего

10. Чек-лист самопроверки

  • Я могу запустить скрипт evaluate_faithfulness.py на любом CSV‑файле с колонками question, answer, contexts.
  • Я понимаю разницу между мгновенным faithfulness и скользящим SLI.
  • Я настроил Prometheus и вижу метрику rag_faithfulness_sli в /metrics.
  • Я проверил, что при SLI = 0.85 (ниже SLO = 0.90) через 5 минут приходит алерт.
  • Я документировал шаги по добавлению нового датасета или изменению окна SLO.