用 HTN 与进化搜索进行规划
符号规划(symbolic planning)处理的是那些计划可被证明正确的情况。进化式代码搜索(evolutionary code search)处理的是那些适应度函数可被机器校验的情况。ChatHTN(2025)与 AlphaEvolve(2025)展示了二者在与 LLM 配对时各自能解锁什么能力。
类型: 构建 语言: Python(标准库) 先修要求: 第 14 阶段 · 02(ReWOO 与计划-执行(Plan-and-Execute)) 时间: 约 75 分钟
学习目标
- 解释层次任务网络(Hierarchical Task Networks,HTN):任务、方法、算子、前置条件、效果。
- 描述 ChatHTN 的混合循环——带有 LLM 回退分解的符号搜索。
- 解释 AlphaEvolve 的进化循环,以及为什么它只能在程序化评估器存在时才有效。
- 仅用标准库实现一个玩具版 HTN 规划器和一个玩具版进化搜索。
问题
ReWOO(第 02 课)、计划-执行(Plan-and-Execute)和 ReAct 覆盖了大多数智能体规划问题。但有两类情况它们处理得并不好:
- 需要可证明正确性的计划。 调度、飞行路径、合规工作流——计划必须在构造上就是可靠的。一个偶尔会幻觉出步骤的流畅 LLM 计划是不可接受的。
- 拥有可由机器校验的适应度函数的优化问题。 矩阵乘法、调度启发式、编译器处理阶段(pass)——目标不是“一个正确计划”,而是“最优计划”。
HTN 规划与 AlphaEvolve 分别解决这两种不同问题。它们都把 LLM 用作放大器,而不是替代品。
概念
层次任务网络
一个 HTN 包含:
- 任务(Tasks) —— 分为复合任务(待分解)与原始任务(可直接执行)。
- 方法(Methods) —— 带前置条件的复合任务分解方式。
- 算子(Operators) —— 带前置条件和效果的原始动作。
- 状态(State) —— 一组事实。
规划方式是:给定一个目标任务和初始状态,找到一种分解,使其最终变成一串原始算子,并且这些算子的前置条件都能按顺序满足。
HTN 比 LLM 更早出现,至今仍是可证明正确计划的参考范式。
ChatHTN(Gopalakrishnan 等,2025)
ChatHTN(arXiv:2505.11814)把符号 HTN 与 LLM 查询交错起来:
- 先尝试用现有方法分解当前复合任务。
- 如果没有适用方法,就询问 LLM:“在状态
s下,你会如何分解task?” - 把 LLM 的回答翻译成候选子任务。
- 依据算子模式(schema)进行校验;无效分解直接拒绝。
- 递归继续。
论文的核心主张是:每一个产出的计划都可以被证明是可靠的,因为 LLM 建议只作为候选分解进入系统,从不直接编辑计划。正确性由符号层负责;LLM 的作用是扩展方法库。
在线方法学习(online method learning,OpenReview gwYEDY9j2x,2025 年后续工作)又增加了一个学习器:它通过回归泛化 LLM 产出的分解,从而将 LLM 查询频率最多降低 75%。
AlphaEvolve(Novikov 等,2025)
AlphaEvolve(arXiv:2506.13131,DeepMind,2025 年 6 月)是另一种野兽:由 Gemini 2.0 Flash/Pro 集成驱动的进化式代码搜索。
循环如下:
- 从一个种子程序和一个程序化评估器开始(返回适应度分数)。
- 由一组 LLM 提出变异。
- 让这些变异经过评估器。
- 保留最好的,再继续变异。
公开成果包括:
- 56 年来首次改进 Strassen 的 4x4 复数矩阵乘法(48 次标量乘法)。
- 通过 Borg 调度启发式,回收了 0.7% 的 Google 计算资源。
- 在前沿工作负载上,让 FlashAttention 提速 32%。
其中的硬约束是:适应度函数必须可由机器校验。对自然语言答案做进化搜索是不会收敛的。
何时使用哪一种
| 问题类别 | 使用方案 | 原因 |
|---|---|---|
| 带硬约束的调度 | HTN + ChatHTN | 可证明的可靠性 |
| 编译器优化 | AlphaEvolve | 适应度可由机器校验 |
| 多步任务执行 | ReAct / ReWOO | LLM 在环中,但无形式化保证 |
| 带测试的代码改进 | AlphaEvolve | 测试就是评估器 |
| 受策略约束的自动化 | HTN | 前置条件直接编码策略 |
这种模式会在哪里出问题
- 没有算子的 HTN。 如果没有前置条件/效果模式(schema),可靠性主张就会崩塌。ChatHTN 的“LLM 建议分解”依赖这种模式来拒绝无效动作。
- 没有真实评估器的 AlphaEvolve。 “让 LLM 判断代码是否更好”不是适应度函数。评估器必须是确定性的,而且要足够快。
- 过度工程化。 大多数智能体任务根本不需要这两种方法。优先选择 ReAct 或 ReWOO。
动手构建
code/main.py 实现了两个玩具:
- 一个标准库 HTN 规划器,包含算子、方法、前置条件、效果,以及当没有方法匹配复合任务时触发的
LLMFallback。这里的 “LLM” 是脚本化分解器,因此规划器可以离线运行。 - 一个基于标准库的算术程序进化搜索:不断生长表达式,使其在测试集上的
|f(x) - target|最小。评估器是确定性的。
运行:
python3 code/main.py输出轨迹会展示 HTN 规划器如何分解一个复合任务(中途带一次 LLM 回退),以及进化循环如何收敛到目标表达式。
使用它
- HTN 规划器 ——
pyhop、SHOP3,或为特定领域的策略约束自己实现。 - ChatHTN —— 研究代码;但其模式(符号层 + LLM 回退)可以很干净地迁移到任意 HTN 规划器上。
- AlphaEvolve —— DeepMind 论文;其模式(集成 + 评估器)可复现。OpenEvolve 及类似开源分叉正在出现。
- 智能体框架 —— 目前还没有哪个框架原生提供一等的 HTN 或 AlphaEvolve。把它实现成子智能体或后台执行器(worker)即可。
交付上线
outputs/skill-hybrid-planner.md 会生成一个混合规划器脚手架(HTN 或进化式),并把 LLM 的角色明确限定好。
练习
- 给 HTN 规划器加入回溯:当某个算子的后置条件在运行时失败,就回滚并尝试下一个方法。
- 给 ChatHTN 添加一个 LLM 方法缓存:当 LLM 在状态模式
P下分解任务T时,把结果保存起来。下次调用时先重新检查方法库。 - 把进化搜索的评估器替换成真实测试套件。进化一个能通过 20 个测试用例的排序函数;报告收敛所需代数。
- 阅读 AlphaEvolve 关于评估器设计的说明。为你关心的一个领域设计评估器(SQL 查询优化、测试集最小化、部署 YAML 等)。
- 组合使用:先用 HTN 把复合任务分解成子任务,再对每个子任务的原始算子使用进化搜索。它在哪些地方闪光,在哪些地方又会过度工程化?
关键术语
| 术语 | 人们常说 | 实际含义 |
|---|---|---|
| HTN | “层次规划器” | 通过算子、前置条件和效果来做任务分解 |
| 方法(Method) | “分解规则” | 将复合任务拆成子任务的方式 |
| 算子(Operator) | “原始动作” | 具有前置条件与效果的具体步骤 |
| ChatHTN | “LLM + HTN” | 当没有匹配方法时,由符号规划器去询问 LLM |
| AlphaEvolve | “进化式代码搜索” | 一组 LLM 负责变异代码;由确定性评估器做选择 |
| 适应度函数(Fitness function) | “评估器” | 对输出给出确定性、可机器校验的分数 |
| 在线方法学习(Online method learning) | “缓存的 LLM 分解” | 存储并泛化 LLM 计划,以降低查询成本 |
延伸阅读
- Gopalakrishnan et al., ChatHTN (arXiv:2505.11814) —— 符号 + LLM 混合规划器
- Novikov et al., AlphaEvolve (arXiv:2506.13131) —— 带 LLM 变异的进化式代码搜索
- Anthropic, Building Effective Agents —— 何时该用规划器,何时只需简单循环