用 HTN 与进化搜索做规划

Build~75 minutesPython (stdlib)先修要求: Phase 14 · 02 (ReWOO and Plan-and-Execute)
符号规划处理计划可证明正确的情形。进化代码搜索处理适应度函数可机器检查的情形。ChatHTN(2025)和 AlphaEvolve(2025)展示了二者与 LLM 结合时各自解锁了什么。
学习目标
  • 解释分层任务网络:任务、方法、算子、前置条件、效果。
  • 描述 ChatHTN 的混合循环——符号搜索加 LLM 回退分解。
  • 解释 AlphaEvolve 的进化循环,以及它为什么只在有程序化评估器时有效。
  • 用标准库实现一个玩具 HTN 规划器和一个玩具进化搜索。

问题

ReWOO(第 02 课)、Plan-and-Execute 和 ReAct 覆盖了多数 Agent 规划。有两种情况它们覆盖得不好:

  1. 需要可证明正确性的计划。 调度、飞行路径、合规工作流——计划必须在构造上就是可靠的。一个流利的 LLM 计划偶尔幻觉出一个步骤,是不可接受的。
  2. 具有机器可检查适应度函数的优化。 矩阵乘法、调度启发式、编译器 pass——目标不是「一个正确的计划」,而是「最好的计划」。

HTN 规划和 AlphaEvolve 解决这两个不同的问题。两者都把 LLM 当作放大器,而不是替代品。

概念

分层任务网络

一个 HTN 包含:

  • 任务 —— 复合任务(待分解)和原语任务(可直接执行)。
  • 方法 —— 把复合任务分解为子任务的方式,带前置条件。
  • 算子 —— 带前置条件和效果的原语动作。
  • 状态 —— 一组事实。

规划:给定一个目标任务和一个初始状态,找到一个分解,使其中的原语算子按顺序满足各自的前置条件。

HTN 比 LLM 更古老,至今仍是可证明正确计划的参考。

ChatHTN(Gopalakrishnan 等,2025)

ChatHTN(arXiv:2505.11814)把符号 HTN 与 LLM 查询交错起来:

  1. 尝试用已有方法分解当前的复合任务。
  2. 如果没有方法适用,问 LLM:「在状态 s 下,你会如何分解 task?」
  3. 把 LLM 的回应翻译成候选子任务。
  4. 对照算子 schema 做校验;拒绝非法分解。
  5. 递归。

论文的核心主张:产出的每个计划都可证明可靠,因为 LLM 建议只作为候选分解进入,从不直接编辑计划。符号层负责正确性;LLM 扩展方法库。

在线方法学习(OpenReview gwYEDY9j2x,2025 年后续工作)增加了一个学习器,通过回归泛化 LLM 产生的分解——把 LLM 查询频率最多降低 75%。

AlphaEvolve(Novikov 等,2025)

AlphaEvolve(arXiv:2506.13131,DeepMind,2025 年 6 月)是另一类东西:由 Gemini 2.0 Flash/Pro 集成编排的进化代码搜索。

循环:

  1. 从种子程序 + 程序化评估器开始(返回适应度分数)。
  2. LLM 集成提出变异。
  3. 让变异通过评估器。
  4. 保留最好的;再次变异。

已公布的成绩:

  • 56 年来首次改进 4x4 复数矩阵乘法的 Strassen 算法(48 次标量乘法)。
  • 通过 Borg 调度启发式回收了 0.7% 的 Google 算力。
  • 在前沿负载上实现 32% 的 FlashAttention 加速。

硬约束:适应度函数必须可机器检查。对散文答案做进化搜索不会收敛。

何时用哪个

问题类别使用原因
带硬约束的调度HTN + ChatHTN可证明的可靠性
编译器优化AlphaEvolve适应度可机器检查
多步任务执行ReAct / ReWOOLLM 在环,无形式化保证
带测试的代码改进AlphaEvolve测试就是评估器
策略约束的自动化HTN前置条件编码策略

这个模式会在哪里出错

  • 没有算子的 HTN。 没有前置条件/效果 schema,可靠性主张就会崩塌。ChatHTN 的「LLM 建议分解」要求 schema 能拒绝非法动作。
  • 没有真实评估器的 AlphaEvolve。 「问 LLM 代码是不是更好」不是适应度函数。评估器必须是确定性的且快速。
  • 过度工程。 多数 Agent 任务两者都不需要。先考虑 ReAct 或 ReWOO。
htn-tree-expand静态版本未包含此交互图

构建它

code/main.py 实现了两个玩具:

  • 一个标准库 HTN 规划器,带算子、方法、前置条件、效果,以及当没有方法匹配复合任务时启用的 LLMFallback。「LLM」是一个脚本化分解器,因此规划器可离线运行。
  • 一个标准库进化搜索,作用于算术程序:生长表达式,使其输出在测试集上最小化 |f(x) - target|。评估器是确定性的。

运行它:

python3 code/main.py

运行轨迹展示 HTN 规划器分解一个复合任务(中途有一次 LLM 回退),以及进化循环收敛到一个目标表达式。

使用它

  • HTN 规划器 —— pyhop、SHOP3,或为领域特定的策略执行自建一个。
  • ChatHTN —— 研究代码;该模式(符号 + LLM 回退)可以干净地移植到任何 HTN 规划器。
  • AlphaEvolve —— DeepMind 论文;该模式(集成 + 评估器)可复现。OpenEvolve 及类似开源分支正在出现。
  • Agent 框架 —— 尚无框架内置 HTN 或 AlphaEvolve。把它作为子 Agent 或后台 worker 来构建。

交付它

outputs/skill-hybrid-planner.md 生成混合规划器脚手架(HTN 或进化),并明确界定 LLM 的角色。

练习

  1. 给 HTN 规划器增加回溯:当某个算子的后置条件在运行时失败,回滚并尝试下一个方法。
  2. 给 ChatHTN 增加 LLM 方法缓存:当 LLM 在状态模式 P 下分解任务 T 时,存储结果。下次调用时先重新检查方法库。
  3. 把进化搜索的评估器换成真实测试套件。进化一个能通过 20 个测试用例的排序函数;报告收敛所需的代数。
  4. 阅读 AlphaEvolve 的评估器设计说明。为你关心的领域设计一个评估器(SQL 查询优化、测试套件最小化、部署 YAML)。
  5. 组合:用 HTN 把复合任务分解为子任务,再对每个子任务的原语算子做进化搜索。它在哪里出彩,在哪里过度工程?

关键术语

术语人们怎么说实际含义
HTN「分层规划器」用算子、前置条件、效果做任务分解
方法(Method)「分解规则」把复合任务拆成子任务的方式
算子(Operator)「原语动作」带前置条件和效果的具体步骤
ChatHTN「LLM + HTN」没有方法匹配时,符号规划器询问 LLM
AlphaEvolve「进化代码搜索」LLM 集成变异代码;确定性评估器选择
适应度函数「评估器」对输出做确定性、可机器检查的评分
在线方法学习「缓存的 LLM 分解」存储并泛化 LLM 计划以降低查询成本

延伸阅读

示意图共 1 张

htn-vs-evolve diagram
htn-vs-evolve

“Stay hungry, stay foolish.”

— Steve Jobs

esc
↑↓切换↵打开esc关闭