跳到主要内容

Darwinian Evolver

使用 Imbue 的进化循环来优化 prompt(提示词)/正则/SQL/代码。

Skill 元数据

来源可选 — 通过 aigenlabs skills install official/research/darwinian-evolver 安装
路径optional-skills/research/darwinian-evolver
版本0.1.0
作者Bihruze (Asahi0x), AigenLabs Agent
许可证MIT
平台linux, macos
标签evolution, optimization, prompt-engineering, research
相关 skillarxiv, jupyter-live-kernel

参考:完整 SKILL.md

信息

以下是 AigenLabs 在触发此 skill 时加载的完整 skill 定义。这是 skill 激活时 agent 所看到的指令内容。

Darwinian Evolver

运行 Imbue 的 darwinian_evolver —— 一个 由 LLM 驱动的进化搜索循环 —— 用于针对适应度函数优化 prompt、正则表达式、SQL 查询 或小型代码片段

状态:对上游工具的轻量封装。该 skill 负责安装工具,引导 agent 编写 Problem 定义 (organism + evaluator + mutator),并通过上游 CLI 或一个小型自定义 Python 驱动脚本来运行循环。

许可证: 上游工具采用 AGPL-3.0 授权。该 skill 仅通过上游 CLI 或 subprocess/uv run 调用来调用它(纯聚合方式)。不得将上游类导入 AigenLabs 本身。

使用时机

  • 用户说"优化这个 prompt"、"为 X 进化一个正则"、"自动改进这段代码/SQL"、"搜索更好的指令"。
  • 你有一个评分器(精确匹配、正则通过率、单元测试、LLM 评判、运行时指标)以及一个起始候选(organism)。如果没有评分器,请先定义一个 —— 这才是难点所在。
  • 成本可接受:一次典型运行需要 50–500 次 LLM 调用。使用 gpt-4o-mini 只需几美分;使用 Claude Sonnet 可能需要几美元。

不适用的情况:

  • 优化目标可微分(请使用梯度下降 / DSPy)。
  • 只需尝试 2–3 个变体 —— 直接手写即可。
  • 适应度信号纯粹主观,没有可量化的标准。

前置条件

  • Python ≥3.11
  • gituv(或 pip
  • 以下之一:OPENROUTER_API_KEYANTHROPIC_API_KEYOPENAI_API_KEY

该 skill 附带一个小型 parrot_openrouter.py 驱动脚本,通过 OpenAI SDK 使用 OPENROUTER_API_KEY, 因此 OpenRouter 上的任何模型均可使用。上游 CLI 本身硬编码了 Anthropic,需要 ANTHROPIC_API_KEY

安装(一次性)

通过 terminal 工具运行:

mkdir -p ~/.aigenlabs/cache/darwinian-evolver && cd ~/.aigenlabs/cache/darwinian-evolver
[ -d darwinian_evolver ] || git clone --depth 1 https://github.com/imbue-ai/darwinian_evolver.git
cd darwinian_evolver && uv sync

验证:

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

快速开始 —— 内置 Parrot 示例

小型冒烟测试(需要 ANTHROPIC_API_KEY):

cd ~/.aigenlabs/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 —— 每次迭代的 pickle 序列化种群
  • /tmp/parrot_demo/<jsonl> —— 每次迭代的 JSON 日志(路径在结束时打印)

在浏览器中打开 ~/.aigenlabs/cache/darwinian-evolver/darwinian_evolver/darwinian_evolver/lineage_visualizer.html 并加载 JSON 日志,即可查看进化树。

快速开始 —— OpenRouter 驱动(无需 Anthropic Key)

该 skill 附带 scripts/parrot_openrouter.py —— 同样的 parrot 问题,但 LLM 调用通过 OpenRouter 进行,因此任何提供商均可使用。

# From wherever the skill is installed:
SKILL_DIR=~/.aigenlabs/skills/research/darwinian-evolver
DE_DIR=~/.aigenlabs/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 个按分数排名的进化 prompt 模板,最佳结果约在 0.6–0.8 之间(初始种子 Say {{ phrase }} 得分为 0.000)。

定义自定义问题

该 skill 附带 templates/custom_problem_template.py —— 复制、编辑、运行。 你必须定义三样东西:

  1. Organism —— 一个 Pydantic BaseModel 子类,持有被进化的制品(prompt_template: strregex_pattern: strsql_query: strcode_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 —— mutator 所看到的内容。包含足够的上下文(输入、期望值、实际值),以便 LLM 进行诊断。
    • holdout_failure_cases —— 对 mutator 隐藏。用于检测过拟合。
    • is_viable=True,除非 organism 完全损坏(抛出异常、返回 None 等)。得分为 0 的可行 organism 是可以的 —— 它只是在父代选择中权重较低。
  3. Mutator —— .mutate(organism, failure_cases, learning_log_entries) -> list[Organism]。 通常做法:构建一个包含当前 organism + 失败案例 + 修复请求的 LLM prompt;解析 LLM 的响应;返回一个新的 Organism。解析失败时返回 [] —— 循环会处理这种情况。

然后编写一个驱动脚本,将 Problem(initial_organism, evaluator, [mutators]) 接入 EvolveProblemLoop,并在 loop.run(num_iterations=N) 上迭代 —— 附带的 scripts/parrot_openrouter.py 是参考实现。

实际影响较大的超参数

参数默认值何时调整
--num_iterations5一旦信任 evaluator,调高至 10–20
--num_parents_per_iteration4降至 2 以进行低成本探索
--mutator_concurrency10降至 2–4 以避免速率限制
--evaluator_concurrency10同上;evaluator 也会调用 LLM
--batch_size1一旦 mutator 能处理多个失败案例,调高至 3–5
--verify_mutations关闭一旦 mutator 浪费严重时开启(据 Imbue,后续运行可节省 >10× 成本)
--midpoint_scorep75除非分数聚集,否则保持不变
--sharpness10保持不变

常见陷阱

  1. Initial organism must be viable —— 即使种子得分为 0,也要在 EvaluationResult 中设置 is_viable=True。循环拒绝不可行的 organism,因为这意味着循环没有任何可进化的起点。
  2. 提供商内容过滤会中断运行。 基于 Azure 的 OpenRouter 模型会以 HTTP 400 拒绝"ignore previous instructions"等短语。将 LLM 调用包裹在 try/except 中,并返回 f"<LLM_ERROR: {e}>" —— evolver 会将该 organism 评分为 0 并继续。
  3. loop.run() 是一个生成器 —— 调用它不会执行任何操作,直到你对其迭代。使用 for snap in loop.run(num_iterations=N):
  4. 快照是嵌套 pickle。 iteration_N.pkl 包含一个带有 population_snapshot(更多 pickle 字节)的字典。要反序列化,必须让 Organism 类在与 pickle 时相同的点分路径下可导入。
  5. 并发默认值较激进。 10/10 会在大多数提供商上触发速率限制。从 2/2 开始。
  6. CLI 硬编码为 Anthropic。 uv run darwinian_evolver <problem> 会查找 ANTHROPIC_API_KEY 并使用 Claude Sonnet。要使用其他提供商,请编写类似 parrot_openrouter.py 的驱动脚本。
  7. AGPL 协议。 永远不要在 AigenLabs 核心中使用 from darwinian_evolver import ...~/.aigenlabs/skills/... 下的自定义驱动脚本属于用户侧,没有问题。
  8. 没有 PyPI 包。 pip install darwinian-evolver 会安装错误的东西。始终从 GitHub 仓库安装。

验证

安装完成并运行一次 parrot 后,以下命令退出码为 0 即表示验证通过:

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

参考资料