English translation is not available yet. Showing Russian content.

RAG с оценкой faithfulness и дашбордом Grafana

ТЕХНИЧЕСКОЕ ЗАДАНИЕ: RAG с оценкой faithfulness и дашбордом Grafana

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

Разработать RAG-систему, которая не только извлекает контекст из документов и генерирует ответы, но и в реальном времени оценивает faithfulness (фактическую точность ответа относительно предоставленного контекста) с помощью библиотеки RAGAS. Настроить сбор метрик faithfulness в Prometheus и визуализировать их на дашборде Grafana для оперативного мониторинга качества.

Ключевой результат Работающий RAG-пайплайн, который на каждый запрос вычисляет faithfulness score, сохраняет его в Prometheus и отображает в Grafana с настраиваемыми алертами при падении метрики ниже порога.


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

Что нужноОткуда взять
Набор документов (корпус)Публичный датасет (например, SQuAD, Wikipedia, собственные .txt файлы). Рекомендуемый объём: 50–200 документов.
LLM для генерации ответовOpenAI API (gpt-4o-mini, gpt-3.5-turbo) / HuggingFace модели (например, Mistral-7B-Instruct) или симуляция.
Embedding модельOpenAI text-embedding-ada-002 / sentence-transformers (all-MiniLM-L6-v2).
ИнструментарийPython 3.10+, Docker, Prometheus, Grafana.

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

  1. Используем локальную модель HuggingFace (например, microsoft/Phi-3-mini-4k-instruct).
  2. Если недостаточно ресурсов — для симуляции faithfulness можно вернуть ответ, содержащий N токенов из контекста, и искусственно занизить faithfulness, вставляя случайные факты.
  3. Используем opensource эмбеддинги (sentence-transformers/all-MiniLM-L6-v2).

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

КомпонентИнструментыНазначение
RAG-пайплайнLangChain / LlamaIndexОркестрация извлечения, генерации и оценки
Оценка faithfulnessRAGAS (faithfulness metric)Вычисление доли утверждений ответа, подтверждённых контекстом
Векторное хранилищеFAISS (локально) / Qdrant (Docker)Индексация и поиск эмбеддингов документов
LLM / EmbeddingsOpenAI API / HuggingFace transformersГенерация ответов и создание эмбеддингов
МетрикиPrometheus Python client (prometheus_client)Экспорт метрик faithfulness в формате /metrics
ВизуализацияGrafana (через Docker)Дашборд с графиками и алертами
КонтейнеризацияDocker ComposeЗапуск Prometheus, Grafana, RAG‑сервера

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

Этап 1: Сбор данных и создание базового RAG-пайплайна (30 минут)

Действия

  1. Скачать датасет (например, первые 100 статей из Wikipedia в формате Markdown).
  2. Написать скрипт build_index.py:
    • Загрузить документы, разбить на чанки (chunk_size=500, chunk_overlap=100).
    • Вычислить эмбеддинги с помощью sentence-transformers.
    • Индексировать в FAISS (сохранить индекс локально).
  3. Создать класс RAGRetriever на LangChain:
    • Метод get_context(query): поиск топ‑5 чанков.
  4. Написать простой LLMResponseGenerator:
    • Принимает запрос и контекст, вызывает LLM (HuggingFace pipeline) и возвращает ответ.
  5. Проверить пайплайн на 5 тестовых запросах, вывести ответы на экран.

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

Этап 2: Интеграция RAGAS для оценки faithfulness (1 час)

Действия

  1. Установить ragas (pip install ragas).
  2. Импортировать Faithfulness из ragas.metrics.
  3. Написать функцию evaluate_faithfulness(query, context, answer):
    • Сформировать Dataset в формате RAGAS (одна запись с полями question, contexts, answer).
    • Вычислить faithfulness score (от 0 до 1).
  4. Модифицировать RAG-пайплайн: после генерации ответа сразу вычислять faithfulness.
  5. Написать модульный тест на синтетическом примере:
    • Контекст: "Солнце — звезда". Ответ: "Солнце — звезда". Ожидаемый faithfulness ≈ 1.0.
    • Ответ "Солнце — это планета". Ожидаемый faithfulness ≈ 0.0.

Ожидаемый результат этапа Функция compute_faithfulness возвращает корректный score, интегрирована в RAG-пайплайн.

Этап 3: Экспорт метрик в Prometheus (1 час)

Действия

  1. Установить prometheus_client (pip install prometheus-client).
  2. В RAG‑сервере (например, FastAPI или Flask) добавить эндпоинт /metrics.
  3. Создать Prometheus метрику:
    from prometheus_client import Gauge
    faithfulness_gauge = Gauge('rag_faithfulness', 'Faithfulness score of RAG answers')
    
  4. В эндпоинте /ask после вычисления faithfulness обновлять gauge:
    faithfulness_gauge.set(score)
    
  5. Написать Docker Compose с сервисом Prometheus:
    prometheus:
      image: prom/prometheus
      volumes:
        - ./prometheus.yml:/etc/prometheus/prometheus.yml
      ports:
        - "9090:9090"
    
    В prometheus.yml указать цель (RAG‑сервер на порту 8000).
  6. Запустить RAG‑сервер через Docker Compose (сеть общая).
  7. Отправить 10–20 запросов через curl/Postman, убедиться, что metrics endpoint отдаёт rag_faithfulness.

Ожидаемый результат этапа Prometheus собирает метрику rag_faithfulness, доступна на порту 9090.

Этап 4: Дашборд Grafana (1 час)

Действия

  1. Добавить сервис Grafana в Docker Compose:
    grafana:
      image: grafana/grafana
      ports:
        - "3000:3000"
      environment:
        - GF_SECURITY_ADMIN_PASSWORD=admin
      volumes:
        - ./grafana-datasources.yml:/etc/grafana/provisioning/datasources/datasources.yaml
    
  2. Настроить datasource (Prometheus) через provisioning.
  3. Создать дашборд в UI Grafana (или импортировать JSON):
    • Один график "Faithfulness over time" (ось Y – score, ось X – время).
    • Статистики: среднее за 1 час, минимальное, максимальное.
    • Алерт при faithfulness < 0.5 за последние 5 минут.
  4. Экспортировать дашборд как dashboard.json (сохранить в репозиторий).
  5. Повторить отправку запросов, наблюдать обновление графика в реальном времени.

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

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

Действия

  1. Намеренно испортить faithfulness (например, изменить prompt на "отвечай что угодно, не используя контекст").
  2. Проверить, что алерт срабатывает в Grafana.
  3. Написать 3 интеграционных теста:
    • Нормальный запрос → faithfulness > 0.8.
    • Запрос без контекста (если контекст пустой) → faithfulness ≈ 0.
    • Запрос с плохим контекстом → faithfulness < 0.3.
  4. Задокументировать процесс запуска системы (README.md).

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


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

  • RAG-пайплайн запускается в Docker Compose одной командой docker-compose up.
  • Эндпоинт /ask принимает POST-запрос с полем query и возвращает JSON { "answer": ..., "faithfulness": ... }.
  • Prometheus собирает метрику rag_faithfulness и доступен на http://localhost:9090.
  • Grafana показывает дашборд с графиком faithfulness и текущим значением.
  • Настроен алерт при падении faithfulness < 0.5 на 5 минут.
  • Написаны минимум 3 интеграционных теста (pytest) и они проходят.

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

В итоге вы получите:

  • Кодовая база в директории rag-faithfulness/:
    • rag_pipeline.py — классы ритривера, генератора, оценки.
    • server.pyFastAPI сервер с эндпоинтами /ask, /metrics.
    • build_index.py — скрипт загрузки и индексации документов.
    • tests/ — тесты.
    • docker-compose.yml — сервисы: rag-server, prometheus, grafana.
    • prometheus.yml — конфигурация сборщика.
    • grafana-dashboard.json — экспортированный дашборд.
    • README.md — инструкция по запуску.
  • Запущенная система с возможностью отправлять запросы и видеть обновление метрик в real-time.

Дополнительно Можно добавить мониторинг других метрик RAGAS (answer relevancy, context precision) или общий скоринг.


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

СложностьРешение
Нет доступа к OpenAI APIИспользовать локальную модель HuggingFace (Mistral-7B или Phi-3); для faithfulness это не требуется LLM, только NLP парсинг утверждений.
RAGAS требует большого количества запросов к LLM для разложения ответа на утвержденияИспользовать ragas.llms.HuggingFaceLLM с той же моделью, что и для генерации; или воспользоваться синтетическим разметчиком из RAGAS.
Prometheus не видит метрикиПроверить, что сервер rag-server доступен по сети (в docker-compose добавить networks). Указать правильный таргет в prometheus.yml.
График в Grafana пустойНастроить датасорс Prometheus с правильным URL (http://prometheus:9090). Убедиться, что есть метрики с временными метками.
Долгий запуск LLM модели на CPUИспользовать модель маленького размера (например, distilgpt2) или симулировать ответы фиксированными строками на время отладки.

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

ЭтапВремя
Этап 1: Сбор данных и базовый RAG30 минут
Этап 2: Интеграция RAGAS1 час
Этап 3: Экспорт метрик в Prometheus1 час
Этап 4: Дашборд Grafana1 час
Этап 5: Тестирование и алерты30 минут
Итого4 часа

Примечание При первом выполнении задачи может потребоваться дополнительное время (до 2 часов) на установку зависимостей, скачивание моделей и отладку Docker.


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

ВопросТема
121Что такое RAG и в чём его отличие от fine-tuning?
188Как выбрать embedding модель для RAG-системы?
221Ручная сборка RAG-пайплайна на LangChain
245Введение в RAGAS: метрики faithfulness, answer relevancy, context precision
312Экспорт пользовательских метрик в Prometheus с помощью Python-клиента
330Основы Grafana: дашборды и алерты
418Разница между faithfulness и factuality в контексте LLM
507Мониторинг LLM-приложений: что измерять и как отображать
610Docker Compose для ML-сервисов: типичные ошибки и их решение
789Настройка алертов в Grafana для метрик машинного обучения

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

  • Я развернул RAG-систему в Docker Compose и могу отправить запрос через curl -X POST localhost:8000/ask -H "Content-Type: application/json" -d '{"query":"..."}'.
  • В ответе содержится поле faithfulness с числом от 0 до 1.
  • Prometheus (localhost:9090) показывает список метрик, включая rag_faithfulness.
  • Grafana (localhost:3000) авторизуется под admin/admin и отображает дашборд с графиком, который обновляется при новых запросах.
  • Я создал алерт, который отправляет уведомление (например, в Telegram через webhook или просто помечается в дашборде) при faithfulness < 0.5.
  • Код размещён в системе контроля версий, README содержит инструкцию по запуску.