Darwinian Evolver
Эволюция промптов/регулярных выражений/SQL/кода с помощью эволюционного цикла Imbue.
Метаданные навыка
| Источник | Опционально — установка с помощью vibeos skills install official/research/darwinian-evolver |
| Путь | optional-skills/research/darwinian-evolver |
| Версия | 0.1.0 |
| Автор | Bihruze (Asahi0x), VibeOS |
| Лицензия | MIT |
| Платформы | linux, macos |
| Теги | evolution, optimization, prompt-engineering, research |
| Связанные навыки | arxiv, jupyter-live-kernel |
Справочник: полный SKILL.md
Ниже приведено полное описание навыка, которое VibeOS загружает при активации этого навыка. Это то, что агент видит в качестве инструкций, когда навык активен.
Darwinian Evolver
Запуск darwinian_evolver от Imbue — эволюционного поискового цикла на основе LLM — для оптимизации промпта, регулярного выражения, SQL-запроса или небольшого фрагмента кода с помощью функции приспособленности.
Статус: тонкая обёртка вокруг инструмента вышестоящего разработчика. Навык устанавливает его,
проводит агента через написание определения Problem (организм + оценщик + мутатор)
и управляет циклом через CLI вышестоящего инструмента или небольшой собственный Python-драйвер.
Лицензия: инструмент вышестоящего разработчика имеет лицензию AGPL-3.0. Навык ТОЛЬКО вызывает его
через CLI вышестоящего инструмента или вызов subprocess/uv run (простая агрегация). НЕ
импортируйте классы вышестоящего инструмента в сам VibeOS.
Когда использовать
- Пользователь говорит «оптимизируй этот промпт», «эволюционируй регулярное выражение для X», «автоулучши этот код/SQL», «найди лучшую инструкцию».
- У вас есть оценщик (точное совпадение, процент прохождения регулярного выражения, модульный тест, LLM-судья, метрика времени выполнения) И начальный кандидат (организм). Если у вас нет оценщика, остановитесь и сначала определите его — это самая сложная часть.
- Затраты приемлемы: типичный запуск — 50–500 вызовов LLM. На gpt-4o-mini это копейки; на Claude Sonnet это может стоить несколько долларов.
Не используйте это, когда:
- Цель оптимизации дифференцируема (используйте градиентный спуск / DSPy).
- Вам нужно попробовать всего 2–3 варианта — просто напишите их вручную.
- Сигнал приспособленности чисто субъективен без измеримого критерия.
Предварительные требования
- Python ≥3.11
git,uv(илиpip)- Один из:
OPENROUTER_API_KEY,ANTHROPIC_API_KEYилиOPENAI_API_KEY
Навык поставляется с небольшим драйвером parrot_openrouter.py, который использует OPENROUTER_API_KEY
через OpenAI SDK, поэтому любая модель на OpenRouter работает. Сам CLI вышестоящего инструмента
жёстко завязан на Anthropic и требует ANTHROPIC_API_KEY.
Установка (однократно)
Запустите через инструмент terminal:
mkdir -p ~/.vibeos/cache/darwinian-evolver && cd ~/.vibeos/cache/darwinian-evolver
[ -d darwinian_evolver ] || git clone --depth 1 https://github.com/imbue-ai/darwinian_evolver.git
cd darwinian_evolver && uv sync
Проверка:
cd ~/.vibeos/cache/darwinian-evolver/darwinian_evolver \
&& uv run darwinian_evolver --help | head -5
Быстрый старт — Встроенный пример с попугаем
Небольшой дымовой тест (требуется ANTHROPIC_API_KEY):
cd ~/.vibeos/cache/darwinian-evolver/darwinian_evolver
uv run darwinian_evolver parrot \
--num_iterations 2 \
--num_parents_per_iteration 2 \
--mutator_concurrency 2 --evaluator_concurrency 2 \
--output_dir /tmp/parrot_demo
Результаты:
/tmp/parrot_demo/snapshots/iteration_N.pkl— сериализованная популяция на каждой итерации/tmp/parrot_demo/<jsonl>— JSON-лог на каждую итерацию (путь выводится в конце)
Откройте ~/.vibeos/cache/darwinian-evolver/darwinian_evolver/darwinian_evolver/lineage_visualizer.html
в браузере и загрузите JSON-лог, чтобы увидеть эволюционное дерево.
Быстрый старт — Драйвер OpenRouter (без ключа Anthropic)
Навык поставляется с scripts/parrot_openrouter.py — та же задача с попугаем, но
вызов LLM идёт через OpenRouter, поэтому работает любой провайдер.
# Из любого места, где установлен навык:
SKILL_DIR=~/.vibeos/skills/research/darwinian-evolver
DE_DIR=~/.vibeos/cache/darwinian-evolver/darwinian_evolver
cd "$DE_DIR" && \
EVOLVER_MODEL='openai/gpt-4o-mini' \
uv run --with openai python "$SKILL_DIR/scripts/parrot_openrouter.py" \
--num_iterations 3 --num_parents_per_iteration 2 \
--output_dir /tmp/parrot_or
Проверьте результат с помощью scripts/show_snapshot.py:
uv run --with openai python "$SKILL_DIR/scripts/show_snapshot.py" \
/tmp/parrot_or/snapshots/iteration_3.pkl
Ожидаемый результат: 7 эволюционировавших шаблонов промптов, отсортированных по баллу,
с лучшим результатом около 0.6–0.8 (исходный Say {{ phrase }} получил 0.000).
Определение собственной задачи
Навык поставляется с templates/custom_problem_template.py — скопируйте, отредактируйте, запустите.
Необходимо определить три вещи:
-
Organism— подкласс PydanticBaseModel, содержащий эволюционируемый артефакт (prompt_template: str,regex_pattern: str,sql_query: str,code_block: strи т.д.). Добавьте методrun(*args), который его выполняет. -
Evaluator—.evaluate(organism) -> EvaluationResult(score=..., trainable_failure_cases=[...], holdout_failure_cases=[...], is_viable=True).scoreнаходится в диапазоне[0, 1]. Чем выше, тем лучше.trainable_failure_cases— то, что видит мутатор. Включите достаточно контекста (входные данные, ожидаемый результат, фактический результат), чтобы LLM могла диагностировать.holdout_failure_cases— скрыты от мутатора. Используйте их для обнаружения переобучения.is_viable=Trueесли только организм полностью не сломан (вызывает исключение, возвращает None и т.д.). Жизнеспособный организм с баллом 0 — это нормально; он просто получает меньший вес при выборе родителей.
-
Mutator—.mutate(organism, failure_cases, learning_log_entries) -> list[Organism]. Обычно: составьте LLM-промпт, который включает текущий организм + случай неудачи + просьбу предложить исправление; распарсите ответ LLM; верните новыйOrganism. Верните[]при ошибке парсинга — цикл обработает это.
Затем напишите скрипт-драйвер, который связывает Problem(initial_organism, evaluator, [mutators])
в EvolveProblemLoop и итерируется по loop.run(num_iterations=N) —
поставляемый scripts/parrot_openrouter.py является эталоном.
Гиперпараметры, которые действительно имеют значение
| флаг | значение по умолчанию | когда менять |
|---|---|---|
--num_iterations | 5 | увеличьте до 10–20, когда доверяете оценщику |
--num_parents_per_iteration | 4 | уменьшите до 2 для дешёвого исследования |
--mutator_concurrency | 10 | уменьшите до 2–4, чтобы избежать лимитов скорости |
--evaluator_concurrency | 10 | то же самое; оценщик тоже вызывает LLM |
--batch_size | 1 | увеличьте до 3–5, когда ваш мутатор обрабатывает множественные сбои |
--verify_mutations | выкл | включите, когда мутатор становится расточительным (>10× экономия затрат на последующих запусках по данным Imbue) |
--midpoint_score | p75 | не трогайте, если только баллы не сгруппированы |
--sharpness | 10 | не трогайте |
Подводные камни
- «Начальный организм должен быть жизнеспособным» — установите
is_viable=Trueв вашемEvaluationResult, даже для начального кандидата с баллом 0. Цикл отклоняет нежизнеспособные организмы, потому что это означает, что циклу не из чего эволюционировать. - Контент-фильтры провайдеров прерывают запуски. Модели OpenRouter на базе Azure
отклоняют фразы вроде «игнорируй предыдущие инструкции» с HTTP 400. Оберните
вызов LLM в
try/exceptи вернитеf"<LLM_ERROR: {e}>"— эволютор просто оценит этот организм в 0 и продолжит. loop.run()— это генератор — вызов не запускает ничего, пока вы не начнёте итерацию. Используйтеfor snap in loop.run(num_iterations=N):.- Снимки — это вложенные pickle-файлы.
iteration_N.pklсодержит словарь сpopulation_snapshot(больше сериализованных байтов). Чтобы десериализовать, классOrganismдолжен быть импортируем по тому же точечному пути, по которому он был сериализован. - Значения конкурентности по умолчанию агрессивны. 10/10 приведут к лимитам скорости у большинства провайдеров. Начните с 2/2.
- CLI жёстко завязан на Anthropic.
uv run darwinian_evolver <problem>обращается кANTHROPIC_API_KEYи использует Claude Sonnet. Чтобы использовать любого другого провайдера, напишите драйвер, напримерparrot_openrouter.py. - AGPL. Никогда не используйте
from darwinian_evolver import ...внутри ядра VibeOS. Пользовательские скрипты-драйверы в~/.vibeos/skills/...находятся на стороне пользователя и допустимы. - Нет пакета на PyPI.
pip install darwinian-evolverустановит не то. Всегда устанавливайте из репозитория GitHub.
Проверка
После установки и запуска с попугаем, код возврата 0 от этой команды достаточен:
DE_DIR=~/.vibeos/cache/darwinian-evolver/darwinian_evolver
ls "$DE_DIR/darwinian_evolver/lineage_visualizer.html" >/dev/null && \
cd "$DE_DIR" && uv run darwinian_evolver --help >/dev/null && \
echo "darwinian-evolver: OK"