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 — скопируйте, отредактируйте, запустите.
Нужно определить три вещи:
-
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 и т.п.). Жизнеспособный организм с нулевой оценкой допустим — он просто получит меньший вес при отборе родителей.
-
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, чтобы не упираться в rate limit |
--evaluator_concurrency | 10 | аналогично — оценщик тоже обращается к LLM |
--batch_size | 1 | повысьте до 3–5, когда мутатор умеет обрабатывать несколько ошибок |
--verify_mutations | выкл | включите, если мутатор тратит много (по данным Imbue, экономия >10× на поздних запусках) |
--midpoint_score | p75 | не трогайте, если оценки не кластеризуются |
--sharpness | 10 | не трогайте |
Подводные камни
Начальный организм должен быть жизнеспособным— ставьтеis_viable=TrueвEvaluationResultдаже для нулевого seed. Цикл отказывается от нежизнеспособных организмов, потому что им не от чего эволюционировать.- Контент-фильтры провайдеров обрывают запуск. Модели Azure через OpenRouter
отклоняют фразы вроде «ignore previous instructions» с 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(ещё одни pickle-байты). Для десериализации классOrganismдолжен быть доступен по тому же dotted-пути, под которым был сериализован. - Дефолтный параллелизм агрессивен. 10/10 упрётся в rate limit у большинства провайдеров. Начинайте с 2/2.
- CLI жёстко привязан к Anthropic.
uv run darwinian_evolver <problem>берётANTHROPIC_API_KEYи использует Claude Sonnet. Чтобы работать с другим провайдером — пишите драйвер по образцуparrot_openrouter.py. - AGPL. Никогда не делайте
from darwinian_evolver import ...внутри ядра Hermes. Кастомные драйверы в~/.hermes/skills/...находятся на стороне пользователя — это нормально. - Нет пакета на 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"