GEPA: рефлексивная эволюционная оптимизация промптов вместо RL

· 2 мин чтения
prompt-engineering optimization llm python evaluation
📂 Исходный код на GitHub

Genetic-Pareto: фреймворк для оптимизации промптов, кода и архитектур агентов через LLM-рефлексию и Парето-эффективный эволюционный поиск.

GEPA: рефлексивная эволюционная оптимизация промптов вместо RL

GEPA (Genetic-Pareto) — open-source фреймворк на Python для оптимизации любых систем с текстовыми параметрами: промптов, кода, архитектур агентов, конфигураций. Вместо reinforcement learning с тысячами rollout'ов GEPA использует LLM-рефлексию: модель читает полные трассы выполнения, диагностирует причины неудач и предлагает точечные исправления. Среди авторов — Матеи Захария (сооснователь Databricks) и Омар Хаттаб (создатель DSPy). Проект набирает популярность в продакшене: его используют Databricks, Shopify, Dropbox, OpenAI, Nubank и другие компании.

Ключевые результаты

Результат Детали
В 90 раз дешевле Открытые модели + GEPA обошли Claude Opus 4.1 в Enterprise-агентах у Databricks
В 35 раз быстрее RL 100–500 оценок против 5000–25 000+ у GRPO (статья)
32% → 89% Точность агента на ARC-AGI через автоматический поиск архитектуры
40.2% экономии Политика облачного шедулинга, найденная GEPA, обошла экспертные эвристики
55% → 82% Resolve rate кодинг-агента на Jinja через автоизвлечённые скиллы
50+ продакшн-кейсов Shopify, Databricks, Dropbox, OpenAI, Pydantic, MLflow, Comet ML

CEO Shopify Тоби Лютке публично назвал GEPA «серьёзно недооценённым» в мире context engineering.

Как это работает

Классические оптимизаторы знают, что кандидат провалился, но не знают, почему. RL схлопывает всю трассу выполнения в один скалярный reward. GEPA идёт другим путём:

  1. Select — выбор кандидата с границы Парето (кандидаты, сильные на разных подмножествах задач)
  2. Execute — запуск на мини-батче с записью полных трасс выполнения
  3. Reflect — LLM читает трассы: сообщения об ошибках, вывод профайлера, логи рассуждений — и ставит диагноз
  4. Mutate — генерация улучшенного кандидата с учётом уроков всех предков
  5. Accept — добавление в пул при улучшении, обновление Парето-фронта

Ключевая концепция — Actionable Side Information (ASI): диагностический фидбек от оценщиков, который играет роль «градиента» для текстовой оптимизации. Поддерживается и system-aware merge — слияние сильных сторон двух Парето-оптимальных кандидатов.

Быстрый старт

Установка: pip install gepa. Оптимизация системного промпта для математических задач AIME:

import gepa

trainset, valset, _ = gepa.examples.aime.init_dataset()

seed_prompt = {
    "system_prompt": "You are a helpful assistant. Answer the question. "
                     "Put your final answer in the format '### <answer>'"
}

result = gepa.optimize(
    seed_candidate=seed_prompt,
    trainset=trainset,
    valset=valset,
    task_lm="openai/gpt-4.1-mini",
    max_metric_calls=150,
    reflection_lm="openai/gpt-5",
)

print("Optimized prompt:", result.best_candidate['system_prompt'])

Результат из документации: GPT-4.1 Mini поднимается с 46.6% до 56.6% на AIME 2025 — плюс 10 процентных пунктов без дообучения модели.

Самый мощный способ применения — внутри DSPy, где оптимизатор доступен как dspy.GEPA:

import dspy

optimizer = dspy.GEPA(
    metric=your_metric,
    max_metric_calls=150,
    reflection_lm="openai/gpt-5",
)
optimized_program = optimizer.compile(student=MyProgram(), trainset=trainset, valset=valset)

optimize_anything: оптимизация чего угодно

API optimize_anything работает с любым текстовым артефактом — кодом, архитектурой агента, конфигом, SVG. Вы предоставляете только evaluator, поиск берёт на себя система:

import gepa.optimize_anything as oa
from gepa.optimize_anything import optimize_anything, GEPAConfig, EngineConfig

def evaluate(candidate: str) -> float:
    result = run_my_system(candidate)
    oa.log(f"Output: {result.output}")
    oa.log(f"Error: {result.error}")
    return result.score

result = optimize_anything(
    seed_candidate="<your initial artifact>",
    evaluator=evaluate,
    objective="Describe what you want to optimize for.",
    config=GEPAConfig(engine=EngineConfig(max_metric_calls=100)),
)

GEPA также распространяется как Agent Skill для .claude/skills/ — кодинг-агенты (Claude Code, Cursor, Codex, Gemini CLI) могут запускать оптимизацию самостоятельно.

Что GEPA находит на практике

Авторы описывают это как «предвычисление рассуждений во время оптимизации»: в промпт запекается план действий для будущих задач. Например, для multi-hop QA на HotpotQA GEPA самостоятельно вывел стратегию второго поискового запроса — искать не перефраз вопроса, а связанные сущности более высокого уровня, которых не хватает для полного ответа. Для AIME оптимизатор собрал настоящий каталог приёмов: строгое соблюдение ограничений на цифры при смене системы счисления, модульная арифметика для сужения перебора, структурные аргументы вместо наивного энумерирования. Промпт превращается из одной строчки в детальную инструкцию с типовыми ловушками — но каждая ловушка выведена из реальных ошибок на трейне, а не придумана человеком.

Адаптеры и интеграции

GEPA подключается к любой системе через интерфейс GEPAAdapter. Встроенные адаптеры:

  • DefaultAdapter — оптимизация system prompt для single-turn задач
  • DSPy Full Program — эволюция целых DSPy-программ: 67% → 93% на бенчмарке MATH
  • Generic RAG — оптимизация RAG-пайплайнов независимо от векторной БД (ChromaDB, Weaviate, Qdrant, Pinecone)
  • MCP Adapter — оптимизация описаний MCP-инструментов и системных промптов
  • LangChain — промпты для любых LangChain/LangGraph-пайплайнов
  • ConfidenceAdapter — классификация с учётом logprob: штрафует «счастливые угадывания»

Фреймворк уже интегрирован в экосистему: dspy.GEPA в DSPy, mlflow.genai.optimize_prompts() в MLflow, оптимизатор в Comet ML Opik, промпт-оптимизация для Pydantic AI, adk optimize в Google ADK. Microsoft применяет GEPA/DSPy для тюнинга LLM-judge промпта при фильтрации кодовых страниц в претрейне MAI-Thinking-1 — около 233 млрд токенов курируемых данных.

Когда GEPA особенно полезен

  • Дорогие rollout'ы — научные симуляции, агенты с tool calls, медленная компиляция: нужно 100–500 оценок против 10 000+ у RL
  • Мало данных — работает от 3 примеров, большой обучающий набор не нужен
  • API-only модели — доступ к весам не требуется, GPT-5, Claude и Gemini оптимизируются напрямую через API
  • Интерпретируемость — человекочитаемые трассы показывают, почему изменился каждый промпт
  • Дополняет RL — быстрый старт оптимизации с GEPA, затем RL/fine-tuning для дополнительных gains

Итог

GEPA переводит оптимизацию промптов из ручного перебора в систематический инженерный процесс. Философия простая: если метрику можно измерить — её можно оптимизировать. Для команд, работающих с LLM-агентами и пайплайнами, это один из самых практичных инструментов context engineering: дешёвый, интерпретируемый и проверенный в продакшене.

Полезные ссылки: статья arXiv:2507.19457, документация, туториалы dspy.GEPA.

Источник: https://github.com/gepa-ai/gepa