Skip to content

用 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 覆盖了大多数智能体规划问题。但有两类情况它们处理得并不好:

  1. 需要可证明正确性的计划。 调度、飞行路径、合规工作流——计划必须在构造上就是可靠的。一个偶尔会幻觉出步骤的流畅 LLM 计划是不可接受的。
  2. 拥有可由机器校验的适应度函数的优化问题。 矩阵乘法、调度启发式、编译器处理阶段(pass)——目标不是“一个正确计划”,而是“最优计划”。

HTN 规划与 AlphaEvolve 分别解决这两种不同问题。它们都把 LLM 用作放大器,而不是替代品。

概念

层次任务网络

一个 HTN 包含:

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

规划方式是:给定一个目标任务和初始状态,找到一种分解,使其最终变成一串原始算子,并且这些算子的前置条件都能按顺序满足。

HTN 比 LLM 更早出现,至今仍是可证明正确计划的参考范式。

ChatHTN(Gopalakrishnan 等,2025)

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

  1. 先尝试用现有方法分解当前复合任务。
  2. 如果没有适用方法,就询问 LLM:“在状态 s 下,你会如何分解 task?”
  3. 把 LLM 的回答翻译成候选子任务。
  4. 依据算子模式(schema)进行校验;无效分解直接拒绝。
  5. 递归继续。

论文的核心主张是:每一个产出的计划都可以被证明是可靠的,因为 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 集成驱动的进化式代码搜索。

循环如下:

  1. 从一个种子程序和一个程序化评估器开始(返回适应度分数)。
  2. 由一组 LLM 提出变异。
  3. 让这些变异经过评估器。
  4. 保留最好的,再继续变异。

公开成果包括:

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

其中的硬约束是:适应度函数必须可由机器校验。对自然语言答案做进化搜索是不会收敛的。

何时使用哪一种

问题类别使用方案原因
带硬约束的调度HTN + ChatHTN可证明的可靠性
编译器优化AlphaEvolve适应度可由机器校验
多步任务执行ReAct / ReWOOLLM 在环中,但无形式化保证
带测试的代码改进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 规划器 —— pyhopSHOP3,或为特定领域的策略约束自己实现。
  • ChatHTN —— 研究代码;但其模式(符号层 + LLM 回退)可以很干净地迁移到任意 HTN 规划器上。
  • AlphaEvolve —— DeepMind 论文;其模式(集成 + 评估器)可复现。OpenEvolve 及类似开源分叉正在出现。
  • 智能体框架 —— 目前还没有哪个框架原生提供一等的 HTN 或 AlphaEvolve。把它实现成子智能体或后台执行器(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 负责变异代码;由确定性评估器做选择
适应度函数(Fitness function)“评估器”对输出给出确定性、可机器校验的分数
在线方法学习(Online method learning)“缓存的 LLM 分解”存储并泛化 LLM 计划,以降低查询成本

延伸阅读