中文翻译暂不可用,显示俄语原文。

Настроить prompt regression suite

ТЕХНИЧЕСКОЕ ЗАДАНИЕ: Настроить prompt regression suite

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

Разработать и внедрить регрессионный тестовый набор для проверки изменений промптов LLM-агента. Набор включает 50 репрезентативных промптов, автоматическое сравнение ответов агента до и после изменения (по метрике семантической близости или LLM-суду) и генерацию алерта при отклонении более чем на 10% относительного базового качества. Это позволит команде безопасно экспериментировать с промптами, не опасаясь незамеченной деградации.

Ключевой результат Пайплайн, который запускается при каждом изменении промпта, сравнивает ответы на 50 тестовых запросах и при снижении метрики качества >10% отправляет алерт (в лог, Telegram, Slack или CI-систему).


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

Что нужноОткуда взять
Рабочий LLM-агент (прототип или production)Существующий проект / пет-проект
Список типовых запросов пользователей (50 шт)Логи реального использования / экспертный подбор
Текущий промпт (системный + шаблон пользователя)Конфигурация агента
Инструмент для сравнения ответовsentence-transformers / LLM-judge (любая модель)
Инфраструктура для алертовlogging, requests для Telegram/Slack или CI-статус

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

  1. Разверните простого RAG-бота на основе LangChain + открытая модель (например, Llama 3.2-1B-Instruct через Ollama).
  2. Определите 3 версии системного промпта (базовая, с повышенной креативностью, с ограничениями на ответы).
  3. Используйте публичный набор промптов из datasets (например, HuggingFaceH4/ultrachat_200k — взять первые 50) или сгенерируйте 50 запросов вручную (например, 20 вопросов по фактам, 15 — на логику, 15 — на генерацию кода/творчество).

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

КомпонентИнструментыНазначение
Язык и окружениеPython 3.11+, pytest, venv/uvОркестрация тестов
Работа с LLMopenai / langchain / ollamaПолучение ответов агента
Сравнение ответовsentence-transformers (all-MiniLM-L6-v2) + cosine similarity или langchain.evaluationВычисление метрики регрессии
Запуск тестовpytest + pytest-xdist (опционально)Параллельный запуск
Алертыlogging + smtplib / requestsУведомления при >10% отклонения
РепозиторийGit + CI (GitHub Actions / GitLab CI)Версионирование и автоматизация

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

Этап 1: Подготовка тестового набора промптов (2 часа)

Действия

  1. Создайте каталог prompt_regression_suite/ в проекте.
  2. Внутри создайте файл test_prompts.json — список из 50 объектов:
    [
      {
        "id": "qa_01",
        "prompt": "Что такое квантовая запутанность?",
        "expected_quality": "factual",
        "tags": ["factual", "science"]
      },
      ...
    ]
    
    Разбейте на категории: фактические запросы (20), логические задачи (15), творческие (10), вопросы по безопасности (5).
  3. Напишите вспомогательный скрипт generate_prompts.py, который будет генерировать промпты из датасета (если используется симуляция) или парсить логи.

Ожидаемый результат этапа Файл test_prompts.json с 50 промптами, размеченными по типам.

Этап 2: Сбор ответов от базовой версии агента (1 час)

Действия

  1. В файле baseline_agent.py реализуйте функцию get_agent_response(prompt: str, agent_config: dict) -> str.
    • Агент берёт текущий системный промпт из файла system_prompt.txt.
    • Используйте выбранный LLM-провайдер (OpenAI / Ollama).
  2. В get_baseline.py:
    • Загрузите test_prompts.json.
    • Для каждого промпта получите ответ от агента (используйте tqdm для прогресса).
    • Сохраните ответы в baseline_responses.json:
      [
        {"id": "qa_01", "prompt": "…", "response": "…"},
        ...
      ]
      
  3. Дополнительно для каждого ответа вычислите эмбеддинг через sentence-transformers и сохраните как baseline_embeddings.npy.

Ожидаемый результат этапа Файлы baseline_responses.json (тексты ответов) и baseline_embeddings.npy (эмбеддинги).

Этап 3: Сбор ответов от новой версии агента (1 час)

Действия

  1. Скопируйте system_prompt.txt в system_prompt_new.txt и внесите в него изменение (например, добавьте «Отвечай кратко и по делу» или измените ролевой промпт).
  2. Создайте get_candidate.py — аналог get_baseline.py, но использует system_prompt_new.txt.
  3. Выполните скрипт, получите candidate_responses.json и candidate_embeddings.npy.
  4. Для чистоты эксперимента убедитесь, что seed (температуру, top_p) зафиксированы одинаково для обоих запусков, иначе результаты будут несопоставимы.

Ожидаемый результат этапа Два набора ответов (baseline и candidate) и их эмбеддинги.

Этап 4: Реализация метрики регрессии и порога (2 часа)

Действия

  1. Создайте модуль regression_metrics.py с функциями:

    from sentence_transformers import SentenceTransformer
    import numpy as np
    
    model = SentenceTransformer('all-MiniLM-L6-v2')
    
    def semantic_similarity(baseline_resp, candidate_resp):
        emb1 = model.encode(baseline_resp)
        emb2 = model.encode(candidate_resp)
        return cosine_similarity([emb1], [emb2])[0][0]
    
  2. Реализуйте пороговый механизм:

    • Для каждого из 50 промптов вычислите similarity.
    • Если средняя similarity по всем 50 меньше порога 0.85 (эквивалент 15% падения), или доля промптов с similarity <0.85 превышает 10% → срабатывает алерт.
    • Абсолютные цифры (0.85 — как пример) нужно подобрать под ваши данные.
  3. Напишите тест-раннер test_regression.py с использованием pytest:

    import pytest
    from regression_metrics import evaluate_regression
    
    def test_regression():
        report = evaluate_regression('baseline_responses.json', 'candidate_responses.json')
        assert report['pass'] is True, report['alert_message']
    

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

Этап 5: Интеграция алерта и CI (2 часа)

Действия

  1. В regression_metrics.py добавьте отправку алерта (для примера — в logger и файл alert.log):
    import logging
    logging.basicConfig(filename='regression_alert.log', level=logging.WARNING)
    
    def send_alert(message):
        logging.warning(message)
        # тут же можно отправить в Telegram / Slack через webhook
    
  2. Создайте файл .github/workflows/prompt_regression.yml:
    name: Prompt Regression
    on:
      pull_request:
        paths:
          - 'system_prompt.txt'
    jobs:
      test:
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v4
          - uses: actions/setup-python@v5
            with: { python-version: '3.11' }
          - run: pip install -r requirements.txt
          - run: python get_baseline.py     # на CI baseline уже есть, но можно перегенерить
          - run: python get_candidate.py
          - run: python test_regression.py
    
  3. Убедитесь, что при падении теста CI возвращает ненулевой код, и PR блокируется.

Ожидаемый результат этапа Рабочий CI-пайплайн и алерт в логах/чате при деградации >10%.


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

  • Репозиторий содержит test_prompts.json с 50 промптами, размеченными по категориям.
  • Созданы скрипты get_baseline.py и get_candidate.py, корректно вызывающие агента и сохраняющие результаты.
  • Ответы baseline и candidate собраны в отдельных JSON-файлах с одинаковым набором id.
  • Реализована метрика семантической схожести (semantic_similarity через SentenceTransformer).
  • Порог регрессии установлен и документирован: средняя similarity < 0.85 или >10% промптов дают similarity < 0.85 → алерт.
  • Написан Pytest-тест test_regression.py для интеграции в CI.
  • При изменении системного промпта в PR запускается GitHub Action (или другой CI) и при деградации >10% блокирует мерж.
  • Настроен алерт (хотя бы в alert.log) с указанием id проблемных промптов и значений similarity.
  • Регрессионный набор воспроизводим: зафиксированы seed, температура, версии моделей.

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

Основной артефакт Папка prompt_regression_suite/ в репозитории со следующей структурой:

prompt_regression_suite/
├── test_prompts.json
├── baseline_responses.json
├── candidate_responses.json
├── baseline_embeddings.npy
├── candidate_embeddings.npy
├── regression_metrics.py
├── test_regression.py
├── get_baseline.py
├── get_candidate.py
├── system_prompt.txt
├── system_prompt_new.txt
├── alert.log
└── .github/workflows/prompt_regression.yml   (опционально)

Содержание Рабочий пайплайн, который:

  • может быть запущен локально одной командой (pytest test_regression.py);
  • при прогоне на CI автоматически проверяет новый промпт;
  • при превышении порога регрессии генерирует алерт и прерывает сборку.

Дополнительно Документация в README.md (по желанию) с описанием набора, порогов и инструкции по добавлению новых промптов.


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

СложностьРешение
Ответы LLM недетерминированы даже при одинаковом seedУвеличить количество промптов или усреднять по 2-3 запускам; использовать порог на основе распределения, а не абсолютного значения
Семантическая метрика не коррелирует с качеством ответаДополнить метрикой LLM-as-judge (попросить модель оценить, стал ответ хуже/лучше/тот же)
50 промптов прогоняются медленно из-за LLMРаспараллелить запросы (asyncio, ThreadPoolExecutor) или использовать более дешёвую модель для тестов
Изменение промпта может улучшить качество, но метрика покажет падениеВвести двусторонний порог: alert при >10% отклонении в любую сторону (как улучшения, так и ухудшения) для осознанного анализа
Нет реального агента — симуляцияИспользовать ollama с моделью llama3.2:1b — она бесплатно и быстро отвечает; создать две версии системного промпта
CI-сервер не имеет GPUEmbedded модель all-MiniLM-L6-v2 работает на CPU за <1 секунды на 50 пар; алерт — просто вывод в лог

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

ЭтапВремя (часы)
Этап 1: Подготовка набора промптов2
Этап 2: Сбор baseline ответов1
Этап 3: Сбор candidate ответов1
Этап 4: Реализация метрики и порога2
Этап 5: Интеграция алерта и CI2
Итого8

Примечание Для первого раза может потребоваться до 12 часов с учётом отладки и настройки CI.


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

ВопросТема
12Что такое регрессионное тестирование для LLM-агентов?
45Как оценить качество ответов LLM без ручной разметки?
78Метрики сравнения текстов: ROUGE, BLEU, sentence similarity
123Настройка GitHub Actions для ML-пайплайнов
256Промпт-инжиниринг: как безопасно менять системный промпт?
311Использование sentence-transformers в production
405LLM-as-judge: как обучить модель оценивать ответы
512Алертинг в ML-системах: Telegram, Slack, PagerDuty
678Детерминированные ответы LLM: параметры температуры и seed
789Тестовые наборы для QA агентов: разметка и генерация

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

  • Я создал 50 промптов, покрывающих основные сценарии использования агента (факты, логика, творчество, безопасность).
  • Я убедился, что зафиксированы случайные seed и температура при обоих прогонах, чтобы метрика отражала именно изменение промпта, а не случайность.
  • Я выбрал порог регрессии (средняя similarity < 0.85 или >10% промптов за гранью) и обосновал его в документации.
  • Я проверил, что при прогоне pytest test_regression.py с одинаковыми baseline и candidate тест проходит (pass), а с заведомо плохим промптом — падает и формирует алерт.
  • Я настроил CI так, что при изменении system_prompt.txt запускается регрессия, а в логах видно, какие именно промпты провалились (id и similarity).