AI-инжиниринг
DSPy: промпты как код - компилируй, не пиши руками
Цели урока
- Понять почему ручной prompt engineering не масштабируется и хрупок
- Освоить три абстракции DSPy: Signature, Module, Program
- Разобраться как работают оптимизаторы BootstrapFewShot и MIPROv2
- Собрать оптимизированный RAG pipeline с измерением качества до и после
ChatGPT вышел в 2022. За год в LinkedIn появилось 10 000 вакансий 'Prompt Engineer'. К 2025 большинство из них занял код. Stanford DSPy показал: если задать метрику и тренировочные данные, компилятор находит промпт лучше любого человека. Phi-3 mini с оптимизированными DSPy-промптами обошёл GPT-4 на нескольких NLP бенчмарках - при разнице в размере в 50 раз.
- Компания JetBlue использует DSPy для маршрутизации запросов - accuracy вырос с 71% до 89% без смены модели
- Weaviate интегрировал DSPy как стандартный слой оптимизации для RAG-пайплайнов в production
- Phi-3 mini (3.8B параметров) с DSPy оптимизацией превзошёл GPT-4 на benchmark HotpotQA
- DSPy используется в 50+ academic papers 2024-2025 как baseline для prompt optimization
От ручных промптов к компиляторам
**2022 - Chain-of-Thought (Wei et al.)**: 'думай пошагово' как универсальная фраза, которую инженеры вставляли вручную. **2023 - Automatic Prompt Engineer (Zhou et al.)**: первая попытка генерировать промпты автоматически через LLM. **Октябрь 2023 - DSPy (Khattab et al., Stanford)**: промпт как абстракция компилятора, не как ручной артефакт. **2024 - TextGrad**: текстовые 'градиенты' от LLM как механизм обратного распространения. **2024 - MIPROv2**: байесовская оптимизация Signature + few-shot примеров одновременно, лучший оптимизатор DSPy на данный момент. Переход занял два года - от промптов как текста к промптам как программам.
Предварительные знания
Проблема ручного prompt engineering
ChatGPT вышел в 2022. За год в LinkedIn появилось 10 000 вакансий 'Prompt Engineer'. К 2025 большинство из них занял код. Не потому что промпты стали неважны - а потому что ручное написание промптов не масштабируется.
Ручные промпты - это код без компилятора. Инженер часами подбирает формулировки, тестирует на 20 примерах, деплоит. Через месяц OpenAI обновляет модель. Промпт, который давал 87% accuracy, теперь даёт 71%. Начинается всё сначала.
| Проблема | Симптом | Масштаб |
|---|---|---|
| Хрупкость | Промпт 'сломался' после обновления модели | GPT-3.5 -> GPT-4 -> GPT-4o - каждый раз заново |
| Субъективность | Два инженера пишут разные промпты на одну задачу | Нет объективной метрики выбора |
| Непереносимость | Промпт для GPT-4o не работает на Claude | Vendor lock-in на уровне текста |
| Масштаб | 100 задач = 100 промптов вручную | O(N) усилий на O(N) задач |
Корень проблемы - путаница между **задачей** и **инструкцией**. Задача стабильна: 'классифицировать тональность'. Инструкция нестабильна: зависит от модели, примеров, формата вывода. DSPy разделяет их.
Исследование Sclar et al. (2023) показало: изменение промпта на один токен может изменить accuracy на 10-15%. Это означает что ручной промпт - случайная точка в огромном пространстве возможных инструкций, а не оптимум.
Почему ручной промпт-инжиниринг не масштабируется?
DSPy: объявляй задачу, не пиши промпт
Stanford DSPy (Khattab et al., 2023) - фреймворк где промпт не пишется вручную. Вместо этого объявляется **Signature** (что на входе, что на выходе), **Module** (как обрабатывать), **Program** (pipeline из модулей). Компилятор находит оптимальные промпты автоматически.
Аналогия с компиляторами точная. В C нет смысла вручную расставлять регистры процессора - компилятор делает это лучше. В DSPy нет смысла вручную писать 'Think step by step' - оптимизатор находит лучшие инструкции через обратное распространение по метрике.
**Встроенные модули DSPy** - готовые стратегии обработки:
| Модуль | Что делает | Когда использовать |
|---|---|---|
| Predict | Прямой вызов LLM по Signature | Простая классификация, extraction |
| ChainOfThought | Добавляет reasoning перед ответом | Сложные задачи, math, multi-step |
| ReAct | Reasoning + Action - вызывает tools | Агенты с инструментами |
| Retrieve | Поиск в vector store | RAG-компоненты |
| ProgramOfThought | Генерирует и выполняет код | Вычисления, структурированная обработка |
DSPy Signature поддерживает аннотации типов Python - это позволяет валидировать выход LLM автоматически. Если модель вернула невалидный JSON или неправильный тип, DSPy повторяет запрос автоматически (до 3 раз).
В DSPy Signature описывает...
Оптимизаторы DSPy: BootstrapFewShot, MIPROv2, BayesianSignatureOptimizer
Сердце DSPy - оптимизаторы (раньше назывались teleprompters). Метрика качества работает как функция потерь в нейронных сетях: оптимизатор ищет промпт, максимизирующий метрику на тренировочных примерах. Backward pass не через веса - через пространство возможных инструкций.
| Оптимизатор | Как работает | Когда использовать |
|---|---|---|
| BootstrapFewShot | Генерирует few-shot примеры автоматически из training set | Мало данных (10-50 примеров), быстрый старт |
| MIPROv2 | Байесовская оптимизация: перебирает инструкции + примеры одновременно | 50-500 примеров, баланс качества и скорости |
| BayesianSignatureOptimizer | Оптимизирует формулировку Signature (не только примеры) | Когда задача плохо определена изначально |
| BootstrapFewShotWithRandomSearch | Random search по пространству промптов | Baseline, когда другие оптимизаторы нестабильны |
Что происходит внутри MIPROv2: генерируются кандидатные инструкции (от 10 до 50), для каждой запускается evaluation на subset тренировочных данных, байесовская оптимизация определяет следующую кандидатную инструкцию. Результат - промпт, который конкретная модель понимает лучше всего для конкретной задачи.
Оптимизация требует LLM-вызовов. MIPROv2 с medium=50 итерациями и датасетом из 100 примеров делает примерно 5 000 вызовов. На gpt-4o-mini это около USD 0.5-2. Запускать один раз, сохранять результат - не повторять при каждом деплое.
Что выполняет роль 'функции потерь' при оптимизации в DSPy?
Практика: RAG pipeline на DSPy с оценкой
Конкретный сценарий: RAG-система для технической документации. Baseline - ручной промпт, 68% F1 на golden dataset. После оптимизации MIPROv2 - 84% F1. Без изменения модели, без изменения кода retrieval.
Что изменилось внутри после оптимизации - можно посмотреть:
TextGrad (Yuksekgonul et al., 2024) и Adalflow - альтернативы DSPy. TextGrad использует буквальные текстовые 'градиенты': LLM объясняет почему ответ неверен, это объяснение используется для улучшения промпта. Adalflow - более лёгкий фреймворк с акцентом на production-деплой.
При смене модели с GPT-4o на Claude, оптимизированный DSPy-промпт нужно...
DSPy нужен только для исследований - в production проще писать промпты вручную
DSPy экономит часы при каждой смене модели и даёт воспроизводимые результаты - это production-инструмент
При смене GPT-4o на Claude 3.5 ручной промпт требует переработки. DSPy Program перекомпилируется за 10-30 минут. При 10+ моделях в портфеле или частых model upgrades, экономия линейно растёт.
Оптимизатор DSPy перебирает все возможные промпты - это слишком долго
MIPROv2 использует байесовскую оптимизацию: 50-200 оцениваний, не миллионы - занимает 10-30 минут
Байесовский оптимизатор учится на каждой итерации и направляет поиск в перспективные области пространства промптов. Это не grid search, а умный поиск с posterior обновлением.
Итоги
- Ручной промпт - хрупкая точка в пространстве инструкций, ломается при обновлении модели
- DSPy разделяет задачу (Signature) и инструкцию (промпт) - компилятор генерирует промпт автоматически
- Метрика-функция = градиент; оптимизатор максимизирует метрику на тренировочных данных
- MIPROv2 - байесовская оптимизация, 50-200 LLM-вызовов, даёт +10-25% vs ручного промпта
- При смене модели: перекомпилировать, не переписывать - это главное преимущество подхода
Вопросы для размышления
- Какие задачи в текущем проекте используют жёстко заданные промпты? Насколько они хрупки при смене модели?
- Что было бы метрикой для оптимизации в конкретном pipeline - F1, accuracy, или что-то доменное?
- DSPy оптимизирует промпты на тренировочном наборе - как убедиться что метрика не переобучается под него?
Связанные темы
DSPy автоматизирует промпты. Fine-tuning идёт дальше - встраивает знания в веса модели.
- Evaluation и golden datasets — Метрика DSPy - это то же самое что evaluation pipeline: нужны хорошие тестовые данные
- Fine-tuning — Альтернативный путь - вместо оптимизации промпта, обучить модель на задаче
- Advanced RAG — DSPy позволяет оптимизировать весь RAG-pipeline как единую программу