В прошлой статье мы рассказали о первом шаге перехода от SOTA-моделей к опенсорсным: разбить агентный пайплайн на максимально возможное количество узлов, где каждый узел обслуживается отдельной моделью со своим промптом. Чем больше узлов — тем менее мощные модели нам нужны, а значит, тем шире выбор: qwen3-32b, gpt-oss-20b и так далее.
Теперь перед нами следующая задача: повысить качество промптинга для открытых моделей. Вариантов по сути два: перебирать промпты вручную или автоматизировать процесс. Именно здесь на помощь приходит GEPA.
GEPA опенсорсный фреймворк из экосистемы DSPy, использующий рефлексивную эволюцию для оптимизации промптов. Он работает по принципу генетического подхода с Pareto-отбором: анализирует траектории выполнения программы, рефлексирует над ошибками через LLM и строит дерево эволюционировавших промпт-кандидатов, накапливая улучшения итерация за итерацией.
Мы интегрировали GEPA в пайплайн для узлов с просевшим качеством: он берет execution traces из продакшена, анализирует текстовый фидбек (не только скалярные метрики) и за 10-15 итераций выдает промпт, который позволяет qwen3-4b работать на уровне Claude Sonnet 4.5. При этом GEPA требует значительно меньше вычислительных ресурсов, чем RL-подходы вроде GRPO, и позволяет одновременно оптимизировать несколько компонентов — например, системный промпт и few-shot-примеры в одном узле.
Приятные сюрпризы. Узлы timeframe и table_chain показали впечатляющий рост accuracy: с 0.33 и 0.52 до 0.79 и 0.91 соответственно. При этом мы спокойно пересели с Claude Haiku на qwen3-4b. Узел detect_language вообще не потребовал оптимизации — с первого запуска на qwen3-4b показал accuracy 1.0, что ожидаемо для такой прямолинейной задачи.
Проблемные узлы. agent_choice стал самым сложным: из-за комплексности выбора accuracy стартовала с 0.01, и даже после оптимизации через GEPA со схемой и SGR мы выжали лишь 0.57. Планировщик (planning) тоже преподнес сюрприз — accuracy упала с 0.089 до 0.032 при переходе на схему валидации, и пока мы не нашли способ заставить небольшие модели справляться с этим узлом. Узлы criticize_stage и process_language также требуют либо ручной валидации, либо остаются на SOTA-моделях.
Честный вывод: не каждый узел стоит переводить на небольшие опенсорсные модели. Рядом всегда должна быть большая — хотя бы на 32B параметров.
Если хотите попробовать GEPA у себя, то процесс старта достаточно простой. Устанавливаете pip install gepa и dspy-ai, готовите датасет в простом CSV формате — у нас это timeframe_dataset.csv с колонками input_message, output и input_type.
Пример данных:
