Перейти к основному содержимому

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 — скопируйте, отредактируйте, запустите. Необходимо определить три вещи:

  1. Organism — подкласс Pydantic BaseModel, содержащий эволюционируемый артефакт (prompt_template: str, regex_pattern: str, sql_query: str, code_block: str и т.д.). Добавьте метод run(*args), который его выполняет.

  2. 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 — это нормально; он просто получает меньший вес при выборе родителей.
  3. 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_iterations5увеличьте до 10–20, когда доверяете оценщику
--num_parents_per_iteration4уменьшите до 2 для дешёвого исследования
--mutator_concurrency10уменьшите до 2–4, чтобы избежать лимитов скорости
--evaluator_concurrency10то же самое; оценщик тоже вызывает LLM
--batch_size1увеличьте до 3–5, когда ваш мутатор обрабатывает множественные сбои
--verify_mutationsвыклвключите, когда мутатор становится расточительным (>10× экономия затрат на последующих запусках по данным Imbue)
--midpoint_scorep75не трогайте, если только баллы не сгруппированы
--sharpness10не трогайте

Подводные камни​

  1. «Начальный организм должен быть жизнеспособным» — установите is_viable=True в вашем EvaluationResult, даже для начального кандидата с баллом 0. Цикл отклоняет нежизнеспособные организмы, потому что это означает, что циклу не из чего эволюционировать.
  2. Контент-фильтры провайдеров прерывают запуски. Модели OpenRouter на базе Azure отклоняют фразы вроде «игнорируй предыдущие инструкции» с HTTP 400. Оберните вызов LLM в try/except и верните f"<LLM_ERROR: {e}>" — эволютор просто оценит этот организм в 0 и продолжит.
  3. loop.run() — это генератор — вызов не запускает ничего, пока вы не начнёте итерацию. Используйте for snap in loop.run(num_iterations=N):.
  4. Снимки — это вложенные pickle-файлы. iteration_N.pkl содержит словарь с population_snapshot (больше сериализованных байтов). Чтобы десериализовать, класс Organism должен быть импортируем по тому же точечному пути, по которому он был сериализован.
  5. Значения конкурентности по умолчанию агрессивны. 10/10 приведут к лимитам скорости у большинства провайдеров. Начните с 2/2.
  6. CLI жёстко завязан на Anthropic. uv run darwinian_evolver <problem> обращается к ANTHROPIC_API_KEY и использует Claude Sonnet. Чтобы использовать любого другого провайдера, напишите драйвер, например parrot_openrouter.py.
  7. AGPL. Никогда не используйте from darwinian_evolver import ... внутри ядра VibeOS. Пользовательские скрипты-драйверы в ~/.vibeos/skills/... находятся на стороне пользователя и допустимы.
  8. Нет пакета на 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"

Ссылки​