English translation is not available yet. Showing Russian content.

Какие оптимизаторы (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-код), а затем компилируете её с помощью оптимизатора.

ProgramDSPy-программа, состоящая из модулей (например, 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. Сравнительная таблица оптимизаторов

ПризнакBootstrapFewShotMIPROCOPRO
Что оптимизирует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. Практические рекомендации по выбору оптимизатора

  1. Начните с BootstrapFewShot – он самый быстрый и даст базовое улучшение. Если метрика уже устраивает – останавливайтесь.
  2. Если задача сложная и есть бюджет – используйте MIPRO. Он дорогой, но часто даёт +5-15% к метрике за счёт совместной оптимизации.
  3. Если вы уверены в few-shot, но хотите улучшить инструкцию – используйте COPRO. Он хорошо работает, когда ошибки систематические (например, модель путает формат вывода).
  4. Комбинируйте: начните с COPRO для улучшения инструкции, затем с BootstrapFewShot для добавления few-shot, а потом финально донастройте через MIPRO.
  5. Всегда проверяйте скомпилированный промпт – оптимизатор может «переоптимизироваться» под конкретный 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)

Шаги:

  1. Подготовить датасет (вопрос-ответ).
  2. Определить программу с dspy.ChainOfThought("question -> answer").
  3. Метрика: dspy.evaluate.answer_exact_match.
  4. Запустить компиляцию с каждым оптимизатором, замеряя время и финальную метрику на dev.
  5. Визуализировать результаты (таблица, график).
  6. Просмотреть скомпилированные промпты и проанализировать, что изменилось.

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

  • 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. Навигация


Навигация