中文翻译暂不可用,显示俄语原文。
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 — симулируем:
- Используем локальную модель HuggingFace (например, microsoft/Phi-3-mini-4k-instruct).
- Если недостаточно ресурсов — для симуляции faithfulness можно вернуть ответ, содержащий N токенов из контекста, и искусственно занизить faithfulness, вставляя случайные факты.
- Используем opensource эмбеддинги (sentence-transformers/all-MiniLM-L6-v2).
3. Технологический стек
| Компонент | Инструменты | Назначение |
|---|---|---|
| RAG-пайплайн | LangChain / LlamaIndex | Оркестрация извлечения, генерации и оценки |
| Оценка faithfulness | RAGAS (faithfulness metric) | Вычисление доли утверждений ответа, подтверждённых контекстом |
| Векторное хранилище | FAISS (локально) / Qdrant (Docker) | Индексация и поиск эмбеддингов документов |
| LLM / Embeddings | OpenAI API / HuggingFace transformers | Генерация ответов и создание эмбеддингов |
| Метрики | Prometheus Python client (prometheus_client) | Экспорт метрик faithfulness в формате /metrics |
| Визуализация | Grafana (через Docker) | Дашборд с графиками и алертами |
| Контейнеризация | Docker Compose | Запуск Prometheus, Grafana, RAG‑сервера |
4. Этапы выполнения
Этап 1: Сбор данных и создание базового RAG-пайплайна (30 минут)
Действия
- Скачать датасет (например, первые 100 статей из Wikipedia в формате Markdown).
- Написать скрипт
build_index.py:- Загрузить документы, разбить на чанки (chunk_size=500, chunk_overlap=100).
- Вычислить эмбеддинги с помощью sentence-transformers.
- Индексировать в FAISS (сохранить индекс локально).
- Создать класс
RAGRetrieverна LangChain:- Метод get_context(query): поиск топ‑5 чанков.
- Написать простой
LLMResponseGenerator:- Принимает запрос и контекст, вызывает LLM (HuggingFace pipeline) и возвращает ответ.
- Проверить пайплайн на 5 тестовых запросах, вывести ответы на экран.
Ожидаемый результат этапа Рабочий скрипт rag_pipeline.py, который для произвольного запроса возвращает ответ и использованный контекст.
Этап 2: Интеграция RAGAS для оценки faithfulness (1 час)
Действия
- Установить ragas (pip install ragas).
- Импортировать Faithfulness из ragas.metrics.
- Написать функцию evaluate_faithfulness(query, context, answer):
- Сформировать Dataset в формате RAGAS (одна запись с полями
question,contexts, answer). - Вычислить faithfulness score (от 0 до 1).
- Сформировать Dataset в формате RAGAS (одна запись с полями
- Модифицировать RAG-пайплайн: после генерации ответа сразу вычислять faithfulness.
- Написать модульный тест на синтетическом примере:
- Контекст: "Солнце — звезда". Ответ: "Солнце — звезда". Ожидаемый faithfulness ≈ 1.0.
- Ответ "Солнце — это планета". Ожидаемый faithfulness ≈ 0.0.
Ожидаемый результат этапа Функция compute_faithfulness возвращает корректный score, интегрирована в RAG-пайплайн.
Этап 3: Экспорт метрик в Prometheus (1 час)
Действия
- Установить prometheus_client (pip install prometheus-client).
- В RAG‑сервере (например, FastAPI или Flask) добавить эндпоинт
/metrics. - Создать Prometheus метрику:
from prometheus_client import Gauge faithfulness_gauge = Gauge('rag_faithfulness', 'Faithfulness score of RAG answers') - В эндпоинте
/askпосле вычисления faithfulness обновлять gauge:faithfulness_gauge.set(score) - Написать Docker Compose с сервисом Prometheus:
В prometheus.yml указать цель (RAG‑сервер на порту 8000).prometheus: image: prom/prometheus volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml ports: - "9090:9090" - Запустить RAG‑сервер через Docker Compose (сеть общая).
- Отправить 10–20 запросов через curl/Postman, убедиться, что metrics endpoint отдаёт
rag_faithfulness.
Ожидаемый результат этапа Prometheus собирает метрику rag_faithfulness, доступна на порту 9090.
Этап 4: Дашборд Grafana (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 - Настроить datasource (Prometheus) через provisioning.
- Создать дашборд в UI Grafana (или импортировать JSON):
- Один график "Faithfulness over time" (ось Y – score, ось X – время).
- Статистики: среднее за 1 час, минимальное, максимальное.
- Алерт при faithfulness < 0.5 за последние 5 минут.
- Экспортировать дашборд как
dashboard.json(сохранить в репозиторий). - Повторить отправку запросов, наблюдать обновление графика в реальном времени.
Ожидаемый результат этапа Дашборд Grafana с метрикой faithfulness, алерт настроен.
Этап 5: Тестирование и алерты (30 минут)
Действия
- Намеренно испортить faithfulness (например, изменить prompt на "отвечай что угодно, не используя контекст").
- Проверить, что алерт срабатывает в Grafana.
- Написать 3 интеграционных теста:
- Нормальный запрос → faithfulness > 0.8.
- Запрос без контекста (если контекст пустой) → faithfulness ≈ 0.
- Запрос с плохим контекстом → faithfulness < 0.3.
- Задокументировать процесс запуска системы (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.py— FastAPI сервер с эндпоинтами/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: Сбор данных и базовый RAG | 30 минут |
| Этап 2: Интеграция RAGAS | 1 час |
| Этап 3: Экспорт метрик в Prometheus | 1 час |
| Этап 4: Дашборд Grafana | 1 час |
| Этап 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-приложений: что измерять и как отображать |
| 610 | Docker 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 содержит инструкцию по запуску.