Darwinian Evolver

Эволюционная оптимизация промптов, регулярных выражений, SQL и кода с помощью цикла Imbue.

Метаданные навыка

ИсточникОпциональный (устанавливается по запросу) — установите командой hermes skills install official/research/darwinian-evolver
Путьoptional-skills/research/darwinian-evolver
Версия0.1.0
АвторBihruze (Asahi0x), Hermes Agent
ЛицензияMIT
Платформыlinux, macos
Тегиevolution, optimization, prompt-engineering, research
Связанные навыкиarxiv, jupyter-live-kernel

Справочник: полный SKILL.md

инфо

Ниже приведено полное определение навыка, которое Hermes Agent загружает при его активации. Именно это агент видит как инструкцию во время работы навыка.

Darwinian Evolver

Запускает darwinian_evolver от Imbue — LLM-управляемый эволюционный цикл поиска — чтобы оптимизировать промпт, регулярное выражение, SQL-запрос или небольшой фрагмент кода по функции приспособленности.

Статус: тонкая обёртка над сторонним инструментом. Навык устанавливает его, проводит агента через написание определения Problem (организм + оценщик + мутатор) и управляет циклом через CLI или небольшой кастомный Python-драйвер.

Лицензия: сторонний инструмент распространяется под AGPL-3.0. Навык вызывает его исключительно через CLI или через subprocess/uv run (простая агрегация). НЕ импортируйте классы этого пакета в ядро Hermes.

Когда использовать

  • Пользователь говорит «оптимизируй этот промпт», «подбери регулярку для 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 ~/.hermes/cache/darwinian-evolver && cd ~/.hermes/cache/darwinian-evolver
[ -d darwinian_evolver ] || git clone --depth 1 https://github.com/imbue-ai/darwinian_evolver.git
cd darwinian_evolver && uv sync

Проверка:

cd ~/.hermes/cache/darwinian-evolver/darwinian_evolver \
  && uv run darwinian_evolver --help | head -5

Быстрый старт — встроенный пример Parrot

Минимальный smoke-тест (требует ANTHROPIC_API_KEY):

cd ~/.hermes/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-лог по итерациям (путь выводится в конце)

Откройте ~/.hermes/cache/darwinian-evolver/darwinian_evolver/darwinian_evolver/lineage_visualizer.html в браузере и загрузите JSON-лог, чтобы увидеть эволюционное дерево.

Быстрый старт — OpenRouter-драйвер (без ключа Anthropic)

Навык поставляется со скриптом scripts/parrot_openrouter.py — та же задача parrot, но вызов LLM идёт через OpenRouter, так что подойдёт любой провайдер.

# Из директории, где установлен навык:
SKILL_DIR=~/.hermes/skills/research/darwinian-evolver
DE_DIR=~/.hermes/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 и т.п.). Жизнеспособный организм с нулевой оценкой допустим — он просто получит меньший вес при отборе родителей.
  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, чтобы не упираться в rate limit
--evaluator_concurrency10аналогично — оценщик тоже обращается к LLM
--batch_size1повысьте до 3–5, когда мутатор умеет обрабатывать несколько ошибок
--verify_mutationsвыклвключите, если мутатор тратит много (по данным Imbue, экономия >10× на поздних запусках)
--midpoint_scorep75не трогайте, если оценки не кластеризуются
--sharpness10не трогайте

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

  1. Начальный организм должен быть жизнеспособным — ставьте is_viable=True в EvaluationResult даже для нулевого seed. Цикл отказывается от нежизнеспособных организмов, потому что им не от чего эволюционировать.
  2. Контент-фильтры провайдеров обрывают запуск. Модели Azure через OpenRouter отклоняют фразы вроде «ignore previous instructions» с 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 (ещё одни pickle-байты). Для десериализации класс Organism должен быть доступен по тому же dotted-пути, под которым был сериализован.
  5. Дефолтный параллелизм агрессивен. 10/10 упрётся в rate limit у большинства провайдеров. Начинайте с 2/2.
  6. CLI жёстко привязан к Anthropic. uv run darwinian_evolver <problem> берёт ANTHROPIC_API_KEY и использует Claude Sonnet. Чтобы работать с другим провайдером — пишите драйвер по образцу parrot_openrouter.py.
  7. AGPL. Никогда не делайте from darwinian_evolver import ... внутри ядра Hermes. Кастомные драйверы в ~/.hermes/skills/... находятся на стороне пользователя — это нормально.
  8. Нет пакета на PyPI. pip install darwinian-evolver установит не то. Всегда устанавливайте из репозитория на GitHub.

Проверка

После установки и запуска parrot нулевой код возврата этой команды означает успех:

DE_DIR=~/.hermes/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"

Ссылки

ESC