English translation is not available yet. Showing Russian content.

Реализовать алертинг по faithfulness

ТЕХНИЧЕСКОЕ ЗАДАНИЕ: Реализовать алертинг по faithfulness

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

Научиться настраивать мониторинг и алертинг на метрику faithfulness (фактологическая точность) в RAG-системе. Вы развернёте пайплайн сбора метрик, настройки порога тревоги (faithfulness < 0.8) и интеграции с системой оповещения (PagerDuty или её эмуляцией). Основной фокус — добиться, чтобы уведомление приходило не позднее 1 минуты после падения метрики.

Ключевой результат Работающий алерт, который уведомляет команду о деградации faithfulness быстрее 60 секунд.


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

Перед началом необходимо иметь:

Что нужноОткуда взять
RAG-система (рабочая или тестовая)Пет-проект из учебного курса или собственная реализация
Набор тестовых вопросов и ответовСгенерировать самому (20–50 пар) или взять из открытых датасетов (например, Natural Questions, TriviaQA)
Ground truth (эталонные ответы)Разметить вручную или взять из датасета с reference
Python 3.10+ с RAGASpip install ragas
Prometheus + AlertmanagerDocker Compose (рекомендуется)
PagerDuty (или эмуляция)Бесплатный аккаунт PagerDuty или любой вебхук-приёмник (Slack, Telegram, локальный HTTP endpoint)
DockerДля быстрого развёртывания инфраструктуры мониторинга

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

  1. Создаём простой HTTP-сервер на Python (Flask / FastAPI), который имитирует приём алертов (логирует в файл или выводит в консоль).
  2. Настраиваем Alertmanager на отправку вебхуков на этот сервер.
  3. Используем готовые сервисы-заглушки: webhook.site или putsreq.

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

КомпонентИнструментыНазначение
Вычисление faithfulnessRAGAS (Faithfulness) + PythonРасчёт метрики по парам (вопрос, ответ, контекст)
Хранилище метрикPrometheus (Pushgateway для push-модели)Сбор и хранение временного ряда faithfulness
Правила алертингаPrometheus rules (YAML)Определение условия faithfulness < 0.8
AlertmanagerAlertmanager APIМаршрутизация и отправка уведомлений
УведомленияPagerDuty (Integration → Webhook), либо эмуляция HTTP-серверомДоставка сигнала ответственному инженеру
Оркестрацияcron / systemd timer / Kubernetes CronJob (опционально)Периодический запуск пайплайна сбора faithfulness

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

Этап 1: Подготовка данных и расчёт faithfulness (1 час)

Действия

  1. Подготовить тестовые данные Создайте файл test_data.jsonl с полями:

    • question — вопрос пользователя
    • answer — ответ RAG-системы
    • contexts — список чанков, использованных для генерации ответа
    • ground_truth (опционально) — эталонный ответ

    Пример:

    {"question": "Столица Франции?", "answer": "Париж — столица Франции.", "contexts": ["Париж находится во Франции и является её столицей."]}
    
  2. **Написать скрипт compute_faithfulness.py, который загружает данные, вызывает ragas.metrics.Faithfulness и сохраняет результат (например, среднее значение).

    from datasets import Dataset
    from ragas import evaluate
    from ragas.metrics import faithfulness
    
    dataset = Dataset.from_json("test_data.jsonl")
    result = evaluate(dataset, metrics=[faithfulness])
    avg_faithfulness = result["faithfulness"].mean()
    print(avg_faithfulness)
    
  3. Отработать скрипт вручную, убедиться, что значение faithfulness в диапазоне 0–1.

Ожидаемый результат этапа Рабочий Python-скрипт, который возвращает численное значение faithfulness.


Этап 2: Настройка сбора метрик в Prometheus (1–1.5 часа)

Действия

  1. Развернуть Prometheus + Pushgateway + Alertmanager через Docker Compose. Пример docker-compose.yml:

    version: '3.8'
    services:
      prometheus:
        image: prom/prometheus:latest
        volumes:
          - ./prometheus.yml:/etc/prometheus/prometheus.yml
          - ./alert.rules.yml:/etc/prometheus/alert.rules.yml
        ports:
          - "9090:9090"
    
      pushgateway:
        image: prom/pushgateway:latest
        ports:
          - "9091:9091"
    
      alertmanager:
        image: prom/alertmanager:latest
        volumes:
          - ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
        ports:
          - "9093:9093"
    
  2. Создать prometheus.yml: добавить job для Pushgateway:

    scrape_configs:
      - job_name: 'pushgateway'
        static_configs:
          - targets: ['pushgateway:9091']
    
  3. Дополнить скрипт отправки метрики в Pushgateway (используйте prometheus_client):

    from prometheus_client import CollectorRegistry, Gauge, push_to_gateway
    
    registry = CollectorRegistry()
    g = Gauge('rag_faithfulness', 'Faithfulness score', registry=registry)
    avg_faithfulness = compute()  # вызов вашего расчёта
    g.set(avg_faithfulness)
    push_to_gateway('localhost:9091', job='rag', registry=registry)
    
  4. Запустить скрипт вручную и проверить, что метрика rag_faithfulness появилась в Prometheus (http://localhost:9090/graph).

Ожидаемый результат этапа Метрика faithfulness поступает в Prometheus и видна на дашборде.


Этап 3: Конфигурация алертов в Prometheus/Alertmanager (1 час)

Действия

  1. Создать файл правил alert.rules.yml:

    groups:
      - name: faithfulness
        rules:
          - alert: LowFaithfulness
            expr: rag_faithfulness < 0.8
            for: 30s
            labels:
              severity: critical
            annotations:
              summary: "Faithfulness dropped below 0.8"
              description: "Current value: {{ $value }}"
    

    Значение for: 30s — задержка перед алертом, чтобы избежать ложных срабатываний.

  2. Настроить alertmanager.yml для отправки в PagerDuty (или эмуляцию):

    • Для PagerDuty:

      receivers:
        - name: pagerduty
          pagerduty_configs:
            - routing_key: "YOUR_PAGERDUTY_INTEGRATION_KEY"
      route:
        receiver: pagerduty
      
    • Для эмуляции (HTTP webhook):

      receivers:
        - name: webhook
          webhook_configs:
            - url: "http://localhost:5000/alert"
      
  3. Перезапустить стеки Docker Compose и проверить, что Alertmanager загружает конфигурации.

  4. Протестировать правило — временно уменьшить порог в скрипте (например, имитировать падение). Отправить метрику с низким значением и проверить, что алерт переходит в состояние PENDING, затем FIRING.

Ожидаемый результат этапа При значении faithfulness < 0.8 в течение 30 секунд алерт переходит в FIRING.


Этап 4: Интеграция с PagerDuty / эмуляция уведомлений (45 минут)

Действия

  1. Создать сервер-заглушку для эмуляции (если нет PagerDuty):

    from flask import Flask, request
    app = Flask(__name__)
    
    @app.route('/alert', methods=['POST'])
    def handle_alert():
        data = request.json
        with open('alerts.log', 'a') as f:
            f.write(str(data) + '\n')
        print("Alert received:", data)
        return '', 200
    
    if __name__ == '__main__':
        app.run(port=5000)
    
  2. Убедиться, что Alertmanager отправляет вебхук — проверить логи alertmanager.log (см. docker logs alertmanager).

  3. Измерить задержку: засечь время изменения метрики до момента получения уведомления. Для точности:

    • Добавить штамп времени в заглушку.
    • Использовать time.time() при отправке метрики и при приёме.
    • Разница должна быть < 60 секунд.
  4. Настроить периодический запуск скрипта (каждые 30 секунд) через cron (*/1 * * * * python compute_faithfulness.py). Это даст почти непрерывный мониторинг.

Ожидаемый результат этапа Уведомление приходит на заданный endpoint не позднее чем через 1 минуту после падения faithfulness.


Этап 5: Тестирование и документирование (30 минут)

Действия

  1. Написать скрипт для симуляции падения faithfulness (занизить значения в тестовых данных).
  2. Запустить сценарий сначала нормальное значение, затем падение, затем восстановление.
  3. Проверить все стадии алерта inactive → pending → firing → resolved (когда значение поднимется выше 0.8).
  4. Зафиксировать конфигурационные файлы (prometheus.yml, alert.rules.yml, alertmanager.yml, docker-compose.yml, compute_faithfulness.py, заглушка) в отдельной папке monitoring/.
  5. Написать короткий README с описанием архитектуры и инструкцией по запуску.

Ожидаемый результат этапа Воспроизводимый сценарий и полная документация для команды.


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

  • Метрика faithfulness вычисляется и отправляется в Prometheus с периодичностью не реже 1 раза в минуту.
  • Правило в Prometheus срабатывает при faithfulness < 0.8 (после задержки for: 30s).
  • Alertmanager получает алерт и отправляет уведомление на PagerDuty (или эмуляцию).
  • Время от падения метрики до получения уведомления не превышает 1 минуты.
  • При восстановлении метрики выше 0.8 алерт автоматически переходит в resolved.
  • Все конфигурационные файлы сохранены и задокументированы.
  • README содержит инструкцию по запуску стека мониторинга и скрипта сбора метрик.

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

Итоговый артефакт — папка monitoring/ с содержимым:

monitoring/
├── docker-compose.yml                  # стек Prometheus + Pushgateway + Alertmanager
├── prometheus.yml                      # конфигурация scrap
├── alert.rules.yml                     # правило LowFaithfulness
├── alertmanager.yml                    # конфигурация receiver
├── compute_faithfulness.py             # скрипт расчёта и отправки метрики
├── webhook_receiver.py                 # эмуляция PagerDuty (или ссылка на аккаунт)
├── test_data.jsonl                     # тестовый набор данных
├── alerts.log                          # логи срабатываний (при эмуляции)
└── README.md                           # описание и инструкция

Опциональный дополнительный результат Дашборд в Grafana с графиком faithfulness и статусом алерта.


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

СложностьРешение
Pushgateway может «зависать» с устаревшими даннымиИспользуйте push_to_gateway с параметром job; настраивайте TTL для метрик. Или перейдите на pull-модель с экспортёром (например, Prometheus Python exporter как отдельный сервис).
Задержка из-за периодического сбора (каждые N секунд)Сделать интервал сбора меньше 60 секунд (например, 10 с). Уменьшить for до 10 с.
Нет доступа к PagerDutyИспользуйте эмуляцию через webhook (Flask) и логируйте в Slack/Telegram через webhook.
Faithfulness может быть недоступен в реальном времени (требует ground truth)Используйте proxy‑метрику, например, confidence score из LLM или entailment score от специального классификатора. Либо рассчитывайте faithfulness на исторических данных с задержкой, а алерт — по тренду.
Prometheus не видит PushgatewayПроверьте сеть в Docker Compose: все сервисы должны быть в одной сети. Используйте depends_on.

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

ЭтапВремя
Этап 1: Подготовка данных и расчёт faithfulness1 час
Этап 2: Настройка сбора метрик в Prometheus1–1.5 часа
Этап 3: Конфигурация алертов1 час
Этап 4: Интеграция с PagerDuty / эмуляция45 минут
Этап 5: Тестирование и документирование30 минут
Итого4–4.5 часа

Примечание Для первого раза заложите +1 час на отладку Docker и конфигураций.


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

ВопросТема
14Как настроить алертинг в Prometheus?
37Что такое faithfulness и как его измерять?
42Как интегрировать PagerDuty с Alertmanager?
58Как использовать Pushgateway в Prometheus?
63RAGAS: метрики faithfulness и answer relevancy
87Настройка Alertmanager для отправки в Slack
112Как симулировать инцидент для тестирования алертов?
144Docker Compose для инфраструктуры мониторинга
201Мониторинг RAG-систем: ключевые метрики
238Периодический сбор метрик с cron в Prometheus

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

  • Я написал скрипт, который рассчитывает faithfulness и отправляет метрику в Pushgateway.
  • Я развернул Docker Compose с Prometheus, Pushgateway и Alertmanager.
  • Я создал правило алертинга и проверил, что оно срабатывает при значении < 0.8.
  • Я настроил получатель уведомлений (PagerDuty или эмуляцию) и получил тестовое уведомление.
  • Я измерил время от падения метрики до прихода уведомления — оно менее 60 секунд.
  • Я зафиксировал все конфигурационные файлы и написал README.