English translation is not available yet. Showing Russian content.
Реализовать SLO для RAG
ТЕХНИЧЕСКОЕ ЗАДАНИЕ: Реализовать SLO для RAG
1. Цель задачи
Научиться формализовать и мониторить Service Level Objectives (SLO) для production RAG-системы. Необходимо определить два ключевых SLO: latency p95 < 2 секунд и faithfulness > 0.9, настроить сбор соответствующих метрик, организовать дашборд и alerting, а также рассчитать error budget для каждого SLO.
Ключевой результат Работающий error budget для RAG-системы, который позволяет команде принимать обоснованные решения о релизах и инцидентах.
2. Исходные данные
Перед началом необходимо иметь:
| Что нужно | Откуда взять |
|---|---|
| RAG-система (рабочая или тестовая) | Собранный pet-проект / существующая система (например, на FastAPI + LangChain) |
| HTTP-запросы к RAG API (или эмуляция нагрузки) | Подготовленный скрипт генерации трафика (locust / k6) |
| LLM-модель для оценки faithfulness | OpenAI API / локальная модель (например, Llama 3) / RAGAS |
| Система мониторинга | Prometheus + Grafana (локально или Docker) |
| Инструмент распределённой трассировки | OpenTelemetry (Python SDK) + Jaeger / Tempo (опционально) |
| База данных для метрик | Prometheus TSDB (будет создана автоматически) |
Если нет реального инструмента — симулируем:
- Разверни локальную RAG-систему на FastAPI с эндпоинтом
/rag/query. Используй FAISS (в памяти) и sentence-transformers (all-MiniLM-L6-v2) для эмбеддингов. - Напиши простой скрипт, который отправляет 100–500 тестовых запросов с разным содержимым, имитируя пользовательский трафик.
- Для оценки faithfulness без LLM-асистента используй эвристику: сравнивай ответ с исходными документами через BERTScore или ROUGE-L; запиши результат как float 0..1. Если нет возможности – просто генерируй случайные faithfulness метрики в диапазоне [0.85, 0.95] для симуляции.
- Установи OpenTelemetry Python SDK и Prometheus клиент для экспорта метрик.
3. Технологический стек
| Компонент | Инструменты | Назначение |
|---|---|---|
| RAG-сервер | FastAPI + LangChain / LlamaIndex | Обработка запросов |
| Эмбеддинги | sentence-transformers (all-MiniLM-L6-v2) | Chunk + query embedding |
| Векторное хранилище | FAISS (in-memory) | Retrieval |
| Мониторинг метрик | Prometheus (python client) + pushgateway (опционально) | Сбор latency p95, faithfulness |
| Визуализация | Grafana | Дашборд SLO |
| Трассировка | OpenTelemetry + Jaeger (опционально) | Детальное измерение latency по компонентам |
| Генерация нагрузки | Locust / k6 | Нагрузочное тестирование |
| Оценка faithfulness | RAGAS / DeepEval / эвристика BERTScore | Метрика качества ответа |
| Хранение метрик | Prometheus TSDB | Долгосрочное хранение |
4. Этапы выполнения
Этап 1: Определение SLO и сценариев (30 минут)
Действия
- Запиши SLO в читаемом виде:
latency_p95 < 2s— 95-й перцентиль времени ответа RAG (от получения запроса до отправки ответа) меньше 2 секунд.- faithfulness > 0.9 — средняя faithfulness оценка за окно (например, 5 минут) должна быть выше 0.9.
- Установи период наблюдения (SLI window): например, последние 5 минут для вычисления p95.
- Определи Error Budget:
- За период (например, 30 дней) допустимое количество ошибок = (1 - SLO_target) * total_requests.
- SLO target для latency: 99% (соответствие <2с) → error budget = 1% запросов.
- SLO target для faithfulness: 95% (средняя >0.9) → error budget = 5% плохих ответов. (Вы можете выбрать другие таргеты, но они должны быть осмыслены)
- Согласуй, как часто пересчитывать error budget: ежедневно.
Ожидаемый результат этапа Чёткая документация SLO (в README или Confluence): показатели, окна, таргеты, метод расчёта error budget.
Этап 2: Инструментирование RAG-пайплайна для сбора метрик (2–3 часа)
Действия
- Установи Prometheus client для Python: pip install prometheus-client.
- В RAG-эндпоинте добавь Histogram для latency:
from prometheus_client import Histogram, Counter import time LATENCY_HISTOGRAM = Histogram('rag_latency_seconds', 'Latency of RAG query', buckets=[0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 5.0, 10.0]) FAITHFULNESS_SUMMARY = Gauge('rag_faithfulness', 'Faithfulness score (last value)') @app.post("/rag/query") async def rag_query(request: QueryRequest): start = time.time() # ... ваш RAG pipeline ... latency = time.time() - start LATENCY_HISTOGRAM.observe(latency) # после получения ответа оцени faithfulness faithfulness = compute_faithfulness(query, docs, answer) FAITHFULNESS_SUMMARY.set(faithfulness) return {"answer": answer, "faithfulness": faithfulness} - Экспонируй метрики: добавь endpoint
/metricsна FastAPI (используя prometheus_client'smake_asgi_app). - Настрой Prometheus для сбора метрик с этого endpoint (scrape_config).
- Добавь распределённую трассировку (опционально): используй OpenTelemetry для замера времени retrieval и LLM вызова отдельно.
- Проверь: запусти RAG, выполни несколько запросов, убедись, что в
/metricsпоявилисьrag_latency_seconds_bucket,rag_faithfulness.
Ожидаемый результат этапа Метрики latency и faithfulness экспортируются в Prometheus, данные можно видеть в PromQL.
Этап 3: Настройка вычислителя faithfulness (1–2 часа)
Действия
- Выбери способ оценки faithfulness:
- Вариант 1: RAGAS (
pip install ragas). Пример:from ragas.metrics import faithfulness from ragas import evaluate from datasets import Dataset def compute_faithfulness(query, documents, answer): ds = Dataset.from_dict({ "question": [query], "contexts": [documents], "answer": [answer] }) result = evaluate(ds, metrics=[faithfulness]) return result['faithfulness'][0] # float 0..1 - Вариант 2: эвристика с BERTScore (без LLM) – медленнее, но дешевле.
- Вариант 1: RAGAS (
- Интегрируй функцию в RAG-пайплайн после получения ответа.
- Важно не замедляй ответ для пользователя. Вычисляй faithfulness асинхронно (например, отправляй в background task) и обновляй метрику позже. Для простоты на первых порах можно вычислять синхронно.
- Настрой Gauge-метрику (
rag_faithfulness), которая обновляется после каждой оценки.
Ожидаемый результат этапа Faithfulness вычисляется и попадает в Prometheus как последнее значение. В дальнейшем можно перейти на Summary или Histogram.
Этап 4: Дашборд и alerting в Grafana (1–2 часа)
Действия
- Установи и настрой Grafana (через Docker compose вместе с Prometheus).
- Создай дашборд "RAG SLO" с панелями:
- Latency p95 за окно 5 мин:
histogram_quantile(0.95, sum(rate(rag_latency_seconds_bucket[5m])) by (le)) - SLO compliance latency: процент запросов <2с:
sum(rate(rag_latency_seconds_bucket{le="2.0"}[5m])) / sum(rate(rag_latency_seconds_count[5m])) - Faithfulness (средняя за 5 мин):
avg_over_time(rag_faithfulness[5m]) - Error budget latency (оставшийся budget в процентах за период, например, 30 дней):
- График faithfulness за последний час.
- Latency p95 за окно 5 мин:
- Настрой alerting:
- Импортируй дашборд (сохрани JSON для последующего использования).
Ожидаемый результат этапа Графана дашборд с панелями SLO и рабочими алертами.
Этап 5: Расчёт error budget и автоматизация (1 час)
Действия
- Напиши Python-скрипт (или используй PromQL) для расчёта error budget:
- Для latency: определи SLO target (например, 99% попаданий <2с). Error budget за период =
(1 - target) * total_requests. - Используй range запросы:
sum(increase(rag_latency_seconds_count[30d]))иsum(increase(rag_latency_seconds_bucket{le="2.0"}[30d])). - Вычисли consumed budget.
- Для latency: определи SLO target (например, 99% попаданий <2с). Error budget за период =
- Запиши error budget как метрику в Prometheus (Gauge, обновляется раз в час cron-задачей).
- Добавь панель "Error Budget Remaining" в Grafana.
- Документируй процесс:
- Как пересчитывать error budget.
- Правило: если error budget исчерпан на >50% за период, запрещены релизы.
Ожидаемый результат этапа Автоматизированный error budget, отображаемый на дашборде.
5. Критерии приемки (Definition of Done)
- В RAG-сервер добавлены метрики latency (Histogram) и faithfulness (Gauge).
- Prometheus настроен и успешно скрейпит
/metrics. - Faithfulness корректно вычисляется для каждого ответа (синхронно или асинхронно).
- В Grafana создан дашборд с панелями: latency p95 за 5 мин, SLO compliance %, faithfulness avg, error budget.
- Настроены алерты для выхода за пределы SLO.
- Error budget рассчитывается автоматически и виден на дашборде.
- Нагрузочное тестирование (locust) подтверждает, что при нагрузке <50 RPS p95 latency < 2s (иначе надо тюнить).
- Написана README с описанием SLO, метрик и правил использования error budget.
6. Ожидаемый результат
Основной артефакт GitHub-репозиторий / папка проекта со следующим содержимым:
rag_server.py— FastAPI сервер с инструментированием.faithfulness_evaluator.py— функция вычисления faithfulness (RAGAS / эвристика).docker-compose.yml— запуск Prometheus + Grafana (готовые конфиги).grafana_dashboard.json— экспортированный дашборд.locustfile.py— сценарий нагрузочного тестирования (опционально).README.md— документация SLO, инструкция по запуску, описание метрик.
Дополнительно Скриншоты Grafana дашборда с работающими метриками и alerting.
7. Возможные сложности и их решение
| Сложность | Решение |
|---|---|
| Faithfulness требует LLM, что увеличивает latency | Вычислять faithfulness асинхронно (background task), записывать в отдельный gauge с задержкой. Или использовать быструю эвристику (BERTScore). |
| Latency p95 может быть неточным при малом количестве запросов | Увеличить bucket resolution, использовать sliding window (например, 5 минут). Для тестов достаточно 100+ запросов. |
| Prometheus не хранит точные перцентили по умолчанию | Использовать histogram_quantile с достаточным количеством buckets. Для production – VictoriaMetrics или Thanos. |
| Оценка faithfulness нестабильна | Повышать threshold усреднения (за 10-15 минут). Использовать несколько независимых оценок. |
| Error budget сложно подсчитать из-за разных окон | Фиксировать календарный месяц как период SLO. Рассчитывать error budget ежедневно через PromQL subquery. |
8. Бюджет времени (оценка)
| Этап | Время |
|---|---|
| Этап 1: Определение SLO и сценариев | 30 мин |
| Этап 2: Инструментирование RAG | 2–3 ч |
| Этап 3: Настройка faithfulness | 1–2 ч |
| Этап 4: Дашборд и alerting | 1–2 ч |
| Этап 5: Error budget | 1 ч |
| Итого | 6–8 ч |
Примечание для первого раза Если RAG-система строится с нуля, добавь 2–3 часа на базовую реализацию (эмбеддинги, FAISS, простой LLM). В таблице время указано при уже рабочем RAG-сервере.
9. Связанные вопросы из базы знаний
| Вопрос | Тема |
|---|---|
| 201 | Что такое SLO и SLI? |
| 203 | Как рассчитать error budget? |
| 207 | Мониторинг latency p95 в Prometheus |
| 210 | Настройка дашборда SLO в Grafana |
| 302 | Оценка faithfulness в RAG (RAGAS) |
| 305 | Метрики faithfulness: проблемы и best practices |
| 401 | Установка и настройка Prometheus |
| 408 | Использование histogram_quantile |
| 509 | Распределённая трассировка с OpenTelemetry |
| 701 | Нагрузочное тестирование RAG‑системы (k6/locust) |
10. Чек-лист самопроверки
- Я прописал SLO (latency p95 <2s, faithfulness >0.9) и их таргеты.
- Я добавил Prometheus Histogram для latency и Gauge для faithfulness.
- Я настроил Prometheus scrape и Grafana datasource.
- Я создал дашборд с панелями p95, compliance, faithfulness, error budget.
- Я протестировал алерт на выход за SLO.
- Я написал скрипт или PromQL для расчёта error budget.
- Я сохранил дашборд как JSON.
- README объясняет, как запустить проект и интерпретировать метрики.