Реализовать prompt lifecycle
ТЕХНИЧЕСКОЕ ЗАДАНИЕ: Реализовать prompt lifecycle
1. Цель задачи
Научиться управлять полным жизненным циклом промпта в production-системе: от черновика до вывода из эксплуатации. Создать repeatable pipeline, который обеспечивает контроль версий, ревью, A/B тестирование, канареечный деплой и graceful deprecation каждого промпта.
Ключевой результат Промпт последовательно проходит все стадии (Draft → Review → Staging → Production → Deprecated) с фиксацией каждого шага в истории Git и метриках качества.
2. Исходные данные
Перед началом необходимо иметь:
| Что нужно | Откуда взять |
|---|---|
| LLM API (OpenAI / Claude / внутренняя) | Зарегистрировать ключ или использовать локальную модель (Ollama) |
| Репозиторий для хранения промптов | Создать новый Git-репозиторий на GitHub / GitLab |
| CI/CD пайплайн | GitHub Actions / GitLab CI / Jenkins (локально) |
| Система управления версиями промптов | Git + YAML-файлы (каждый промпт в отдельной директории) |
| Тестовый датасет (вопросы + ожидаемые ответы) | Создать 10–20 пар «вопрос-идеальный ответ» вручную |
Если нет реального инструмента — симулируем:
- Создать локальный Git-репозиторий (git init) с ветками
main, staging, production. - Использовать Actions (бесплатные минуты) для CI/CD; если нет доступа — написать скрипты на Python, эмулирующие шаги.
- Вместо настоящего LLM API использовать mock-функцию, которая имитирует ответы по шаблону (для проверки пайплайна).
- A/B тестирование проводить на синтетических данных: сравнивать метрики (например, долю совпадений с эталоном) на тестовом датасете.
3. Технологический стек
| Компонент | Инструменты | Назначение |
|---|---|---|
| Язык программирования | Python 3.10+ | Скрипты проверки, A/B тесты |
| LLM API | OpenAI / Anthropic / Ollama | Генерация ответов (реальная или mock) |
| Система контроля версий | Git + GitHub / GitLab | Версионирование промптов |
| CI/CD | GitHub Actions / GitLab CI | Автоматизация stages |
| Формат хранения | YAML / JSON | Шаблоны промптов + метаданные |
| Тестирование | pytest + pytest-benchmark | Unit-тесты и бенчмарки промптов |
| Метрики | Python (scikit-learn для текстовых метрик) | ROUGE, BLEU, точность |
4. Этапы выполнения
Этап 1: Создание структуры репозитория и первого промпта (Draft) (1 час)
Действия
- Инициализировать Git-репозиторий с ветками
main, staging, production. - Создать директорию
prompts/и внутри — поддиректорию для первого промпта, напримерprompts/qa-assistant/. - Внутри создать файлы:
- Написать Python-скрипт
validate_prompt.py, который: - Закоммитить в ветку
feature/qa-draft.
Пример шаблона template.yaml
system_prompt: |
Ты — квалифицированный ассистент по {domain}. Отвечай кратко и по делу.
Если не знаешь — скажи «Не знаю». Не выдумывай факты.
user_prompt: |
Вопрос пользователя: {question}
Пример meta.yaml
version: 0.1.0
author: "Иван Иванов"
status: draft
created: 2025-03-14
description: "Первый черновик Q&A ассистента"
Ожидаемый результат этапа Закоммиченный черновик промпта в отдельной ветке, скрипт валидации проходит.
Этап 2: Review — настройка code review и линтинг (1 час)
Действия
- Создать Pull Request из
feature/qa-draftв staging. - Настроить GitHub Actions workflow
.github/workflows/review.yml:- триггер:
pull_requestв staging; - шаги: checkout → Python setup → запуск
validate_prompt.py→ проверка статуса; - условие: PR не может быть слит, пока workflow не пройдёт.
- триггер:
- Добавить линтер для YAML (yamllint) — проверка форматирования.
- Написать тест на то, что промпт не содержит запрещённых слов (например, «всегда», «никогда» без оговорок).
- Назначить код-ревьюер (в реальной команде) или эмулировать: создать второй аккаунт GitHub и оставить комментарий.
Ожидаемый результат этапа PR прошёл review, изменения слиты в staging.
Этап 3: Staging — деплой на staging и A/B тестирование (2 часа)
Действия
- Настроить второй workflow
staging-deploy.yml:- триггер: push в staging;
- шаги: checkout → копирование промпта в
/staging/prompts/→ запуск A/B теста.
- Написать скрипт
ab_test.py, который:- берёт текущую production-версию промпта (ветка production) и staging-версию;
- прогоняет обе на тестовом датасете (из tests/test_cases.yaml);
- вычисляет метрики (например, точность, ROUGE-1);
- выводит, какая версия лучше.
- Добавить порог acceptance: если staging-версия не хуже production на >5% по ключевой метрике — считать успехом.
- Результаты A/B теста сохранить в prompts/qa-assistant/ab_results.json.
- Если A/B тест пройден — создать PR из staging в production с приложенными результатами.
Пример ab_test.py
import yaml, json, sys
from mock_llm import mock_response
def load_prompt(branch):
with open(f'prompts/qa-assistant/template.yaml') as f:
return yaml.safe_load(f)
def evaluate(prompt_version, tests):
correct = 0
for test in tests:
output = mock_response(prompt_version, test['input'])
if output.strip() == test['expected'].strip():
correct += 1
return correct / len(tests)
# ... (загрузка, сравнение, запись)
Ожидаемый результат этапа Staging-версия протестирована, подготовлен PR в production.
Этап 4: Production — promotion в production с canary (1.5 часа)
Действия
- Настроить
production-deploy.yml:- триггер: push в production;
- можно добавить ручной approval перед деплоем (GitHub Environments / GitLab Approvals).
- Реализовать canary release:
- в прод-среде оставить старую версию (0.1.0) для 90% запросов;
- новую (0.2.0) — для 10%;
- через 30 минут собрать логи и метрики (можно симулировать генерацией результатов);
- если метрики не ухудшились — поднять процент до 100%.
- В meta.yaml обновить статус на production и дату.
- Зафиксировать версию в production тегом (git tag v0.2.0).
Canary (симуляция):
- Написать скрипт
canary_sim.py, который отправляет случайные 10% запросов к новой версии mock LLM, остальные — к старой, и выводит сводку метрик.
Ожидаемый результат этапа Промпт переведён в production, работает с canary, затем full rollout, тег версии создан.
Этап 5: Deprecated — вывод из эксплуатации (0.5 часа)
Действия
- В meta.yaml изменить статус на deprecated, добавить причину и дату.
- Создать ветку
archive/qa-assistant-v0.1.0, переместить туда файлы. - В основной директории (
prompts/qa-assistant/) оставить только ссылку на архив в README.md. - Обновить CI/CD: отключить триггеры для деприкейтед промптов (добавить условие
if: contains(github.event.head_commit.message, 'deprecated')или просто не запускать workflow). - Закоммитить и смержить в
main.
Ожидаемый результат этапа Старый промпт заархивирован, статус обновлён, production использует новую версию.
5. Критерии приемки (Definition of Done)
- Промпт создан через Pull Request в ветку
feature/, прошёл code review (минимум 1 approve). - CI-пайплайн на push в
stagingвыполняет валидацию и A/B тест. - A/B тест показал, что staging-версия не хуже production по выбранной метрике (допуск ≤5% ухудшения).
- Промпт переведён в
productionчерез PR с ручным approval (или автоматически, если настроено). - Canary release симулирован: не менее 10% трафика на новую версию с положительными метриками.
- В
meta.yamlпоследовательно указаны все статусы:draft,staging,production,deprecated. - Каждый этап зафиксирован в истории Git: коммиты, теги, слияния веток.
- После deprecation файлы промпта перемещены в
archive/и не влияют на пайплайн.
6. Ожидаемый результат
Основной артефакт Git-репозиторий с полной историей жизненного цикла одного промпта.
- Ветки:
feature/qa-draft,staging,production,main,archive/qa-assistant-v0.1.0. - Файлы: все YAML-шаблоны, тесты, скрипты валидации и A/B тестирования.
- Теги:
v0.1.0,v0.2.0(фиксация production-версий). - CI/CD конфигурация:
.github/workflows/*.yml.
Дополнительные результаты
- Результаты A/B теста (
ab_results.json). - Отчёт канареечного деплоя (симуляция
canary_sim.log). - README с описанием lifecycle policy.
7. Возможные сложности и их решение
| Сложность | Решение |
|---|---|
| Нет доступа к реальному LLM | Использовать mock-функцию, возвращающую ответы по правилам (например, если в вопросе есть слово «погода» — ответ «Сегодня солнечно»). |
| Сложно провести реальный A/B тест без трафика | Симулировать случайные 100 запросов, разделить на две группы, посчитать метрики «точность» по заранее известным эталонам. |
| Путаница с версиями промптов при merging | Строго соблюдать naming: в meta.yaml — semver, в Git — теги. Использовать GitHub Actions для авто-инкремента версии. |
| Отсутствие второго аккаунта для review | Эмулировать review, оставив approve через UI от своего имени (не рекомендуется для реальной практики, но для ТЗ допустимо). |
| Деприкейтированный промпт случайно используется | В meta.yaml добавить поле active: false, и в основном коде LLM проверять только active: true. |
8. Бюджет времени (оценка)
| Этап | Время |
|---|---|
| 1. Структура репозитория и Draft | 1 час |
| 2. Review и линтинг | 1 час |
| 3. Staging + A/B тестирование | 2 часа |
| 4. Production + canary | 1.5 часа |
| 5. Deprecated и архив | 0.5 часа |
| Итого | 6 часов |
Примечание для первого раза может потребоваться до 10 часов из-за отладки CI/CD и скриптов. Рекомендуется выполнять последовательно, не пропуская этапы.
9. Связанные вопросы из базы знаний
| Вопрос | Тема |
|---|---|
| 17 | Как версионировать промпты в Git? |
| 34 | CI/CD для ML-пайплайнов (MLOps) |
| 56 | A/B тестирование в NLP-системах |
| 89 | Code review для промптов: best practices |
| 112 | Canary деплой для LLM-сервисов |
| 145 | Жизненный цикл конфигураций (Configuration Lifecycle) |
| 201 | Оценка качества ответов LLM (ROUGE, BLEU, custom) |
| 278 | Управление устаревшими артефактами (Data/Model retirement) |
| 344 | Mock-тестирование AI-компонентов |
| 401 | Интеграция OpenAI API с Python |
10. Чек-лист самопроверки
- Я создал структуру директорий для промпта и заполнил все обязательные поля в meta.yaml.
- Я запустил скрипт валидации локально и убедился, что он проходит без ошибок.
- Я создал Pull Request в staging, дождался прохождения CI и получил approve.
- Я провёл A/B тест с использованием тестового датасета и записал результаты.
- Я перевёл промпт в production через PR с ручным approval и создал Git-тег.
- Я заархивировал деприкейтированную версию и обновил meta.yaml.
- Я проверил, что в репозитории нет мусорных файлов, а все коммиты имеют осмысленные сообщения.