中文翻译暂不可用,显示俄语原文。
Какие оптимизаторы (teleprompters) в DSPy вы использовали и когда? BootstrapFewShot, MIPRO, COPRO?
Краткий тезис
DSPy — это фреймворк для программирования LLM, в котором оптимизаторы (teleprompters) автоматически настраивают промпты и/или few-shot примеры под задачу. BootstrapFewShot подходит для быстрого прототипирования (генерирует few-shot примеры из validation набора), MIPRO — для production-сценариев (одновременно оптимизирует инструкции и few-shot), а COPRO — для итеративного улучшения только инструкций промпта. Выбор зависит от доступных ресурсов, сложности задачи и требований к качеству.
1. Термины: DSPy, program, teleprompter
DSPy (Declarative Self-improving Python) — фреймворк, в котором вы описываете логику работы с LLM как модульную программу (обычный Python-код), а затем компилируете её с помощью оптимизатора.
Program — DSPy-программа, состоящая из модулей (например, dspy.ChainOfThought, dspy.ReAct), которые декларируют входы и выходы. Внутри модуля DSPy автоматически генерирует промпт на основе сигнатуры (входные поля → выходные поля).
Teleprompter — оптимизатор, который при компиляции программы адаптирует её промпты и/или few-shot примеры под конкретный датасет и метрику. В DSPy встроены три основных телепромптера: BootstrapFewShot, MIPRO и COPRO.
2. Общая идея оптимизаторов (teleprompters)
Оптимизаторы решают проблему ручного написания промптов: вместо того, чтобы вручную подбирать инструкции и few-shot примеры, вы предоставляете DSPy программу, несколько labelled примеров (train), набор для валидации (dev) и метрику (например, точность). Оптимизатор автоматически подбирает промпты и/или few-shot, чтобы максимизировать метрику на dev-наборе.
Ключевая идея — разделение декларативной логики (что делает программа) и оптимизации (как она это делает). Это похоже на автоматический поиск гиперпараметров в ML, но на уровне промптов.
3. BootstrapFewShot — быстрый старт с few-shot примерами
Принцип работы
- На training set запускается программа с дефолтным промптом (обычно без few-shot).
- На каждом примере LLM генерирует ответ.
- Если метрика на этом примере хорошая (например, ответ совпал с golden), то этот пример (вход+выход) сохраняется как демонстрация (demonstration).
- Из накопленных демонстраций выбирается k лучших (по метрике) и добавляются в промпт как few-shot примеры.
- На validation set программа с новым промптом (=дефолтный + few-shot демонстрации) оценивается.
Когда использовать
- Быстрое прототипирование: нужно за 5 минут получить работающий промпт с улучшением.
- Мало размеченных данных (10–50 примеров) — BootstrapFewShot не требует много данных, так как демонстрации генерируются самим LLM.
- Когда не хочется трогать инструкцию: если базовая инструкция уже подходящая, а не хватает только примеров.
Ограничения
- Не меняет саму инструкцию промпта.
- Качество few-shot сильно зависит от того, насколько генерации LLM на train-примерах попадают в цель.
- Может подсаживать шумные демонстрации.
4. MIPRO (Multilingual Instruction-based Prompt Optimization) — комбинированная оптимизация
Принцип работы
- Двухшаговая процедура: сначала оптимизируется инструкция промпта (instruction), а затем few-shot примеры (или наоборот, итеративно).
- MIPRO использует LLM (обычно более мощную, чем та, что будет в проде) для генерации кандидатов на замену текущей инструкции и few-shot. Например, подаёт текущий промпт и просит LLM предложить 3–5 улучшенных вариантов.
- Каждый кандидат оценивается на validation set по метрике, и выбирается лучший.
- Процесс повторяется несколько шагов, постепенно улучшая оба компонента промпта.
Когда использовать
- Production-сценарии, где нужно высокое качество, а вычислительные ресурсы позволяют запустить много LLM-запросов на этапе оптимизации.
- Сложные задачи (например, извлечение информации, генерация кода), где инструкция играет ключевую роль.
- Когда есть достаточно размеченных данных (100+ примеров) и бюджет на много вызовов LLM.
Преимущества
- Одновременная оптимизация инструкции и few-shot.
- Использование LLM для креативного поиска вариантов — часто находит неочевидные улучшения.
5. COPRO (Coarse-to-fine Prompt Optimization) — итеративное уточнение инструкций
Принцип работы
- Начинает с грубой (coarse) инструкции — например, общей фразы «Ответь на вопрос».
- На каждом шаге детализирует (fine) инструкцию на основе анализа ошибок на validation set. Например, если программа часто путает даты, COPRO сгенерирует дополнительное указание «Обращай внимание на формат даты».
- Для генерации новых инструкций снова вызывается LLM (обычно та же модель). Каждая новая версия инструкции тестируется, и если метрика улучшается — она принимается.
- Процесс останавливается, когда улучшения перестают быть значимыми.
Когда использовать
- Когда инструкция изначально слабая — например, вы написали «Сделай что-нибудь», а нужно детальное описание.
- Когда нет размеченных few-shot примеров — COPRO работает только с инструкцией, few-shot не генерирует.
- Для задач с чёткими критериями правильности — ошибки легко интерпретировать и превращать в дополнительные указания.
Ограничения
- Не добавляет few-shot примеры.
- Может перегрузить инструкцию лишними деталями, если не контролировать длину.
6. Сравнительная таблица оптимизаторов
| Признак | BootstrapFewShot | MIPRO | COPRO |
|---|---|---|---|
| Что оптимизирует | few-shot примеры | инструкция + few-shot (совместно) | только инструкция |
| Источник улучшений | выбор лучших генераций на train | генерация кандидатов LLM | генерация уточнений на основе ошибок |
| Требует данных | мало (10–50 размеченных) | средне (100–500 размеченных) | средне (100+ размеченных) |
| Вычислительные затраты | низкие (один проход по train) | очень высокие (много вызовов LLM) | средние (один вызов на шаг) |
| Скорость настройки | минуты | часы | десятки минут |
| Когда использовать | прототипирование, мало данных | production, сложные задачи | улучшение инструкции, нет few-shot |
| Пример сценария | QA по нескольким документам | генерация SQL-запросов | извлечение сущностей с чёткими правилами |
7. Примеры кода (Python с DSPy)
import dspy
# 1. Создаём программу
class QAModule(dspy.Module):
def __init__(self):
super().__init__()
self.generate_answer = dspy.ChainOfThought("question -> answer")
def forward(self, question):
return self.generate_answer(question=question)
# 2. Загружаем данные (примеры – список словарей с "question", "answer")
trainset = [...] # labelled examples
devset = [...] # validation examples
# 3. Определяем метрику (простая точность совпадения)
def metric_exact_match(gold, pred, trace=None):
return gold.answer.strip().lower() == pred.answer.strip().lower()
# 4. Компилируем с разными оптимизаторами
# BootstrapFewShot
teleprompter_bfs = dspy.BootstrapFewShot(metric=metric_exact_match, max_bootstrapped_demos=4)
compiled_bfs = teleprompter_bfs.compile(QAModule(), trainset=trainset, valset=devset)
# MIPRO
teleprompter_mipro = dspy.MIPRO(metric=metric_exact_match,
num_candidates=6,
init_temperature=1.0,
prompt_model=dspy.OpenAI(model="gpt-4o-mini"))
compiled_mipro = teleprompter_mipro.compile(QAModule(), trainset=trainset, valset=devset)
# COPRO
teleprompter_copro = dspy.COPRO(metric=metric_exact_match,
breadth=10,
depth=3,
prompt_model=dspy.OpenAI(model="gpt-4o-mini"))
compiled_copro = teleprompter_copro.compile(QAModule(), trainset=trainset, valset=devset)
# 5. Используем
pred = compiled_bfs(question="Какой цвет у неба?")
print(pred.answer)
Пояснения к параметрам
max_bootstrapped_demos— сколько few-shot примеров добавить в промпт.num_candidates(MIPRO) — сколько вариантов инструкции/примеров генерировать на каждом шаге.breadth,depth(COPRO) — ширина поиска (сколько вариантов на шаг) и глубина (максимальное число итераций).
8. Расшифровка технических терминов
- Few-shot — пара (вход, выход), вставляемая в промпт в качестве примера.
- Validation set — набор данных, на котором оценивается метрика; не участвует в обучении/генерации примеров.
- Metric — функция сравнения предсказания программы с правильным ответом; может быть точностью, F1, LLM-as-judge и т.д.
- Instruction — часть промпта, описывающая задачу (например, «Ответь на вопрос, используя только факты»).
- Program compilation — процесс применения оптимизатора к DSPy-программе, в результате которого создаётся «скомпилированная» версия с улучшенными промптами.
- Prompt model — LLM, используемая для генерации кандидатов инструкций (обычно более мощная, чем исполнительная модель).
9. Практические рекомендации по выбору оптимизатора
- Начните с BootstrapFewShot – он самый быстрый и даст базовое улучшение. Если метрика уже устраивает – останавливайтесь.
- Если задача сложная и есть бюджет – используйте MIPRO. Он дорогой, но часто даёт +5-15% к метрике за счёт совместной оптимизации.
- Если вы уверены в few-shot, но хотите улучшить инструкцию – используйте COPRO. Он хорошо работает, когда ошибки систематические (например, модель путает формат вывода).
- Комбинируйте: начните с COPRO для улучшения инструкции, затем с BootstrapFewShot для добавления few-shot, а потом финально донастройте через MIPRO.
- Всегда проверяйте скомпилированный промпт – оптимизатор может «переоптимизироваться» под конкретный validation set.
Типичная ошибка: использовать MIPRO с очень маленьким validation set (10–20 примеров) – высокая дисперсия, оптимизатор подгонится под шум. Нужно хотя бы 100+ примеров.
10. Пет-проект для закрепления
Задача Создать DSPy-программу для ответа на вопросы по научным статьям (датасет QASA или SQuAD) и сравнить три оптимизатора.
Инструменты
- Python + DSPy
- LLM:
gpt-3.5-turbo(исполнительная) иgpt-4o-mini(для MIPRO/COPRO как prompt model) - Датасет: 200 вопросов с ответами (150 train, 50 dev)
Шаги:
- Подготовить датасет (вопрос-ответ).
- Определить программу с
dspy.ChainOfThought("question -> answer"). - Метрика:
dspy.evaluate.answer_exact_match. - Запустить компиляцию с каждым оптимизатором, замеряя время и финальную метрику на dev.
- Визуализировать результаты (таблица, график).
- Просмотреть скомпилированные промпты и проанализировать, что изменилось.
Ожидаемый результат
- BootstrapFewShot выполнится за 1–2 минуты, даст метрику ~0.75.
- COPRO – 10–15 минут, метрика ~0.78.
- MIPRO – 1–2 часа, метрика ~0.81.
- Вывод: MIPRO даёт прирост, но затраты по времени и вызовам LLM значительны.
11. Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 101 | Что такое DSPy и как он отличается от LangChain? |
| 102 | Как устроена компиляция программы в DSPy? |
| 104 | В каких сценариях вы бы предпочли DSPy, а не ручные промпты? |
| 105 | Как в DSPy обрабатываются ошибки и edge cases? |
| 106 | Как интегрировать DSPy с внешними инструментами (калькулятор, поиск)? |
12. Навигация
- Предыдущий: 102
- Следующий: 104
- Индекс: 00. Индекс разборов
Навигация
- Предыдущий: 102
- Следующий: 104
- Индекс: 00. Индекс разборов