Реализовать автоматический rollback промпта при падении faithfulness
ТЕХНИЧЕСКОЕ ЗАДАНИЕ: Реализовать автоматический rollback промпта при падении faithfulness
1. Цель задачи
Разработать и внедрить механизм автоматического отката версии системного промпта (или конфигурации) при обнаружении статистически значимого падения метрики faithfulness более чем на 5% относительно установленного baseline. Решение должно быть готово к интеграции в существующую RAG-систему и выполняться полностью автономно в пределах 1 минуты с момента детекции деградации.
Ключевой результат Работающий пайплайн мониторинга faithfulness + триггер rollback, который за 1 минуту возвращает стабильную версию промпта по умолчанию.
2. Исходные данные
| Что нужно | Откуда взять |
|---|---|
| RAG-система с динамическими промптами (test или prod) | Пет-проект / учебная среда / production sandbox |
| Система управления версиями промптов | LangSmith, PromptLayer, собственная БД (например, PostgreSQL) |
| Онлайн-измерение faithfulness (score) | RAGAS faithfulness scorer (требует LLM-as-judge) или proxy-модель |
| Baseline faithfulness (среднее и std за последние 7 дней) | ClickHouse / InfluxDB / просто CSV-файл с метками времени |
| CI/CD pipeline (опционально) | GitHub Actions / GitLab CI – для автоматического развёртывания новой версии после rollback |
| Дашборд мониторинга | Grafana + Prometheus (не обязательно, но желательно) |
Если нет реального инструмента – симулируем:
- Разверните минимальную RAG-систему (например, на базе Hugging Face + FAISS) с одним промптом-шаблоном
- Сделайте две версии промпта:
v1(базовый, faithfulness ~0.85) иv2(намеренно плохой, faithfulness ~0.70) - Напишите скрипт, который постоянно подаёт запросы и считает faithfulness через RAGAS (но можно заменить на быструю proxy-модель, например BERTScore)
- Сохраняйте метрики в локальную БД SQLite
3. Технологический стек
| Компонент | Инструменты | Назначение |
|---|---|---|
| RAG-система | LangChain / LlamaIndex / custom Python | Генерация ответов с заданным промптом |
| Оценка faithfulness | RAGAS faithfulness (или BERTScore + правило) | Получение числовой метрики |
| Мониторинг метрик | Prometheus + Grafana / простой Flask + SQLite | Сбор, хранение, визуализация |
| Управление промптами | JSON-файлы + Git / LangSmith / PromptLayer | Версионирование и rollback |
| Оркестрация rollback | Python-скрипт + Webhook / GitHub API | Триггер смены версии |
| CI/CD (опционально) | GitHub Actions / GitLab CI | Автоматическое переключение версии в Git |
4. Этапы выполнения
Этап 1: Настройка мониторинга faithfulness (2 часа)
Действия
-
Выберите способ вычисления faithfulness в реальном времени
- Используйте ragas.metrics.faithfulness (требует OpenAI, но можно симулировать локальной LLM)
- Или напишите простую proxy-метрику: cosine similarity между эмбеддингами ответа и контекста + пороговое правило
- Если используете RAGAS, запускайте оценку асинхронно (batch по 10 ответов) раз в 30 секунд.
-
Соберите baseline
- Запустите систему на стабильной версии промпта
v1в течение 30 минут - Запишите среднюю faithfulness и стандартное отклонение (std) за этот период
- Сохраните их в конфигурационном файле:
{ "baseline_mean": 0.85, "baseline_std": 0.03, "window_size": 10, "threshold_percent": 5 } - Запустите систему на стабильной версии промпта
-
Реализуйте скользящее окно метрик
- Собирайте последние N замеров faithfulness (например, N=10)
- Каждые 15 секунд пересчитывайте среднее по окну
- Если среднее упало ниже (baseline_mean * (1 - threshold_percent/100)), считаем это деградацией
Ожидаемый результат этапа
Работающий скрипт monitor.py, который каждые 15 секунд выводит метрику и флаг деградации (True/False).
Этап 2: Разработка логики rollback (1 час)
Действия
-
Определите условия для срабатывания rollback
- Деградация должна наблюдаться в течение 3 последовательных окон (чтобы отфильтровать шум)
- Дополнительно: проверьте, что падение не связано с потерей данных (например, если количество ответов в окне < 5)
-
Реализуйте функцию переключения версии промпта
- Храните версии промптов как JSON-файлы в директории
prompts/(например v1.json, v2.json) - Или используйте API LangSmith: langsmith.update_prompt_version(prompt_id, new_version)
- Напишите
rollback_to_stable(), которая:- Определяет последнюю стабильную версию (пометьте
v1как stable=true) - Меняет симлинк current_prompt.json на эту версию
- Логирует событие в rollback_events.log (время, версия, метрики до/после)
- Определяет последнюю стабильную версию (пометьте
- Храните версии промптов как JSON-файлы в директории
-
Добавьте защиту от повторных срабатываний
Ожидаемый результат этапа
Функция rollback_to_stable(), готовая вызываться из мониторинга.
Этап 3: Интеграция и автоматизация (1–1.5 часа)
Действия
-
Свяжите мониторинг и rollback
-
Интеграция с Git (опционально)
- Пусть версия промпта – это файл в Git-репозитории.
- Сделайте GitHub Action, который при мерже
hotfix/rollbackавтоматически меняетcurrent_prompt.txtв веткеmain. - Либо используйте git revert к последнему коммиту со stable-версией.
-
Разверните демо-приложение
- Flask-endpoint
/trigger_rollbackдля ручного теста - Flask-endpoint /health – показывает текущую версию и метрики
- Flask-endpoint
Важно Время от момента фиксации падения до смены версии не должно превышать 60 секунд. Замерьте с помощью time.perf_counter().
Ожидаемый результат этапа
Одно приложение (или набор скриптов), которое в цикле мониторит faithfulness и при обнаружении деградации делает rollback не более чем за 1 минуту.
Этап 4: Тестирование и симуляция падения (1 час)
Действия
-
Создайте тестовый сценарий
- Запустите систему на
v1(baseline ~0.85) - Подождите 3 окна для стабилизации
- Вручную (или скриптом) переключитесь на
v2(плохой промпт, faithfulness ~0.70) - Замерьте, через сколько секунд произошёл rollback обратно на
v1
- Запустите систему на
-
Проверьте граничные случаи
- Падение менее 5% – отката быть не должно
- Единичный выброс (1 окно плохое, остальные хорошие) – без отката
- Потеря всех данных (остановка генерации) – не должно ложно сработать
-
Зафиксируйте результаты теста
# Пример проверки assert rollback_triggered == True, "Rollback not triggered for >5% drop" assert time_to_rollback < 60, f"Rollback took {time_to_rollback}s"
Ожидаемый результат этапа
Лог теста с временами, подтверждающий, что rollback срабатывает корректно в заданных условиях и не срабатывает в шумовых.
Этап 5: Документирование и постмортем (30 минут)
Действия
- Опишите архитектуру решения (диаграмма последовательности в Mermaid)
- Напишите README с инструкцией по развёртыванию
- Создайте типовой постмортем на случай, если rollback не сработал (формат из примера ТЗ)
- Запушьте весь код в Git с тегом
v0.1-rollback
Ожидаемый результат этапа
Репозиторий с кодом, README, логами тестов.
5. Критерии приемки (Definition of Done)
- Мониторинг faithfulness вычисляется автоматически с периодом не более 30 секунд
- Порог срабатывания отката – падение >5% от baseline (relative), подтверждённое тремя последовательными окнами
- Время от момента падения до полного переключения на стабильную версию промпта ≤ 60 секунд
- В лог пишутся: время срабатывания, версия до/после, метрики faithfulness до/после
- Откат не срабатывает при единичных выбросах или при падении менее 5%
- После отката система возвращается к работе на стабильной версии без вмешательства оператора
- Предусмотрена защита от повторного циклического отката (блокировка на 5 минут)
6. Ожидаемый результат
Основной артефакт
Python-репозиторий с модулями:
monitor.py– скрипт мониторинга с функциями оценки faithfulness и скользящего окнаrollback.py– логика отката (выбор стабильной версии, переключение симлинка/API, логирование)test_simulation.py– скрипт для симуляции падения faithfulnessprompts/– директория с версиями промптов (v1.json,v2.json, ...)config.json– параметры (baseline, threshold, window_size)README.md– инструкция по запуску
Ожидаемое содержимое config.json
{
"baseline_mean": 0.85,
"baseline_std": 0.03,
"threshold_percent": 5,
"window_size": 10,
"min_consecutive_anomalies": 3,
"rollback_cooldown_seconds": 300,
"current_version": "v1",
"stable_version": "v1"
}
Дополнительно (опционально):
- Интеграция с Telegram-ботом для уведомлений
- Grafana dashboard с панелью faithfulness и событиями rollback
7. Возможные сложности и их решение
| Сложность | Решение |
|---|---|
| Faithfulness scorer медленный (LLM-as-judge) | Используйте proxy-метрику (BERTScore + порог) или фоновый batch каждые 30 секунд |
| Ошибка в оценке faithfulness (ложное падение) | Увеличьте количество последовательных аномалий до 3-5; добавьте фильтр по std окна |
| Задержка при переключении версии через LangSmith | Замените на локальное чтение файла (symlink) – время ~1 мс |
| Конкуренция запросов во время rollback | Примените блокировку (threading.Lock) – запросы, начатые до отката, завершаются по старому промпту |
| Неопределённый baseline (fresh system) | Установите эмпирический baseline 0.80 (для тестов) или запросите оператора задать вручную |
8. Бюджет времени (оценка)
| Этап | Время (часы) |
|---|---|
| 1. Настройка мониторинга faithfulness | 2.0 |
| 2. Разработка логики rollback | 1.0 |
| 3. Интеграция и автоматизация | 1.5 |
| 4. Тестирование и симуляция | 1.0 |
| 5. Документирование | 0.5 |
| Итого | 6.0 |
Примечание: Для первого раза может потребоваться +1 час на изучение инструментов (RAGAS, LangSmith).
9. Связанные вопросы из базы знаний
| Вопрос | Тема |
|---|---|
| 42 | Метрики качества RAG (faithfulness, answer relevancy) |
| 101 | Управление версиями промптов |
| 203 | Автоматический мониторинг LLM-приложений |
| 315 | Anomaly detection временных рядов метрик |
| 422 | CI/CD для промптов |
| 501 | Rollback стратегии в production |
| 608 | Логирование и уведомления инцидентов |
| 711 | BERTScore как метрика семантической близости |
| 812 | Интерпретация падения faithfulness |
| 899 | Практики postmortem для AI-систем |
10. Чек-лист самопроверки
- Я реализовал мониторинг faithfulness с периодом ≤ 30 секунд
- В моём скрипте есть проверка трёх последовательных аномалий перед rollback
- Я измерил время rollback и убедился, что оно ≤ 60 с
- Я проверил, что при падении < 5% откат не происходит
- Я написал логирование каждого события rollback с деталями
- Я настроил блокировку повторного отката на 5 минут (cooldown)
- Я добавил в README команду для запуска тестовой симуляции