Реализовать 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‑стенда — симулируем:
- Возьмите любой открытый датасет с question‑answer парами (например, Natural Questions, HotpotQA) и индексируйте документы в Qdrant/FAISS.
- Запустите простой RAG‑пайплайн (открытый LLM через Ollama / vLLM + retrieval из FAISS).
- Прокрутите 500–1000 запросов, сохраните ответы, контексты и ground truth (если доступны) в CSV.
- Считайте faithfulness по каждой паре (answer, context) с помощью RAGAS.
3. Технологический стек
| Компонент | Инструменты | Назначение |
|---|---|---|
| Оценка faithfulness | RAGAS (Python) | Расчёт метрики по паре (ответ, контекст) |
| Вычисление SLI | Python (pandas, numpy) | Скользящее среднее faithfulness за окно N запросов |
| Хранение метрик | Prometheus (custom metrics) / InfluxDB | Сбор значений SLI и алертные метрики |
| Алертинг | Alertmanager (Prometheus) / Grafana Alerts | Отправка уведомлений при нарушении SLO |
| Витрина метрик | Grafana | Дашборд для визуализации SLI и SLO |
| Оркестрация | cron / Airflow / Prefect (опционально) | Периодический запуск расчёта |
4. Этапы выполнения
Этап 1: Настройка измерения faithfulness (1 час)
Действия
-
Установите RAGAS
pip install ragas
Если используете внешнюю LLM (например, GPT-4 для оценки faithfulness) – настройте API‑ключ. Для изолированной работы можно использовать ragas с локальными моделями (через langchain + Ollama). -
Подготовьте данные для оценки
Соберите из логов (или сгенерируйте) CSV‑файл со столбцами:question— запрос пользователя;- answer — ответ RAG‑системы;
contexts— список текстов (chunks), которые были переданы LLM (строкой, разделённой|||или JSON).
Пример строки:
question,answer,contexts "Что такое SLO?","SLO – это целевой уровень качества сервиса...","SLO — Service Level Objective|||SLI — Service Level Indicator" -
Реализуйте скрипт расчёта 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) -
Проверьте распределение faithfulness
Постройте гистограмму, вычислите 25-й / 50-й / 95-й перцентиль. Это нужно для выбора разумного SLO.
Ожидаемый результат этапа CSV‑файл с колонкой faithfulness для каждой записи; гистограмма распределения метрики.
Этап 2: Вычисление SLI и выбор SLO (45 минут)
Действия
-
Определите временное окно для SLI
Рекомендуется скользящее среднее за последние 100 запросов (или за 1 час, если запросов меньше 100 в час). -
Напишите функцию расчета 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() -
Выберите SLO
Исходя из гистограммы и бизнес-требований (обычно 0.85–0.95).
Пример: SLO = 0.90 (90% faithfulness).
Запишите SLO в конфигурационный файл config.yaml:slo: faithfulness: 0.90 window: 100 evaluation_interval: "5m" -
Экспортируйте 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 минут)
Действия
-
Настройте Prometheus на сбор метрики
Добавьте вprometheus.yml:scrape_configs: - job_name: 'faithfulness_sli' scrape_interval: 1m static_configs: - targets: ['localhost:8000'] -
Напишите правило алерта в 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']. -
Настройте 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' -
Проверьте срабатывание алерта
Искусственно понизьте faithfulness (например, подайте на вход случайные ответы). Убедитесь, что через 5 минут алерт появляется в Alertmanager и приходит уведомление.
Ожидаемый результат этапа Алерт FaithfulnessBelowSLO отображается в Prometheus UI, уведомление доставлено (или видно в логах Alertmanager).
Этап 4: Развёртывание дашборда и документация (30 минут)
Действия
-
Создайте дашборд в Grafana
- Панель «SLI Faithfulness (скользящее среднее)» с линией SLO.
- Панель «Распределение faithfulness (гистограмма)».
- Панель «Количество запросов» (чтобы понимать выборку).
-
Напишите README проекта
Опишите:- Формат логов;
- Как запустить скрипт расчёта;
- Где лежат правила алертов;
- Как интерпретировать SLI и SLO.
-
Автоматизируйте запуск (опционально)
Добавьте скрипт в crontab (каждые 5 минут) или в Airflow DAG.
Ожидаемый результат этапа Дашборд в Grafana с метриками; README в репозитории.
Этап 5: Финальная проверка и корректировка SLO (15 минут)
Действия
- Подайте 50–100 новых запросов (лучше разнообразных).
- Проверьте, что SLI не упал ниже SLO при нормальной работе.
- Если ложных срабатываний много – увеличьте SLO или окно агрегации.
- Проведите нагрузочный тест имитируйте деградацию (например, замените контексты на пустые) и убедитесь, что алерт срабатывает.
Ожидаемый результат этапа Скорректированный 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 truth | Faithfulness оценивает верность ответа данному контексту, ground truth не нужен – контекст считается «истиной». |
8. Бюджет времени (оценка)
| Этап | Время |
|---|---|
| 1. Настройка измерения faithfulness | 1 ч |
| 2. Вычисление SLI и выбор SLO | 45 мин |
| 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 |
| 567 | LLM‑eval асимметрия |
| 701 | Выбор порогов SLO |
| 814 | Observability 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.