阅读提示:本文约 1.3 万字,包含 6 张 Mermaid 架构图与 2 段结构化伪代码。如果你曾被 LLM 在 Blocksworld 上的「幻觉循环」折磨得怀疑人生——明明只差一步就能搭好积木塔,模型却开始反复拿起放下同一块积木——那这篇文章就是为你写的。我们会一起探索一种「让 LLM 当翻译官,让符号规划器当建筑师」的混合范式。


0. 从一个抓狂的瞬间说起

想象你正在玩经典的 Blocksworld(积木世界)。桌上有三块积木:A、B、C。初始状态是 A 在桌上,B 在 A 上面,C 在桌上。你的目标是:让 C 在 B 上面,B 在 A 上面,A 在桌上——搭成一座 ABC 塔。

选手 A:纯 LLM(GPT-4 + CoT)
它开始推理:「要让 C 在 B 上面,我得先拿起 C。但 C 在桌上,可以直接拿。等等,B 在 A 上面,A 在桌上……让我先拿起 B,放到 A 旁边,然后拿起 C,放到 B 上面,再把 B 放回 A 上面……不对,这样 B 就不在 A 上面了。让我重新想……」

五分钟后,它陷入了「拿起 B → 放下 B → 拿起 B → 放下 B」的无限循环。像不像你收拾房间时,把东西从左边搬到右边,再从右边搬回左边,房间却越来越乱?

选手 B:ReAct
它稍微聪明一点,每走一步都会「观察」当前状态。但问题是——它观察到的状态是用自然语言描述的,而自然语言有歧义。「B 在 A 上面」和「A 支撑着 B」在 LLM 看来可能是两回事。更糟的是,当积木数量从 3 块增加到 10 块时,ReAct 的上下文像滚雪球一样膨胀,最终在一次「思考」中把「拿起 B」写成了「拿起 C」,因为 token 太多,模型注意力涣散了。citeweb_search:3#11

那么,有没有一种方法,能让 LLM 只做它最擅长的事(理解自然语言),而把「搭积木的精确步骤」交给一个永远不会犯糊涂的数学机器?

这就是我们今天要一起探索的 外部规划器集成(External Planner Integration),核心代表是 LLM+PLLM-DP。别急,听起来抽象对吧?我们一步一步来。


1. 宏观视角:混合架构到底在解决什么问题?

1.1 先画一张大地图

如果把 LLM 的规划能力看成「从 A 点到 B 点的导航方式」,那么目前的主流方法可以画成下面这张图。注意看,LLM+P 和 LLM-DP 占据了一个非常独特的生态位:

规划范式光谱

纯 LLM 规划
CoT / ReAct

思维树
ToT

算法思维
AoT

LLM+P
静态 PDDL 转换

LLM-DP
动态重规划

完全符号规划
Fast Downward 等

我们怎么理解这张图?

  • 纯 LLM 规划 是「凭直觉开车」:没有地图,靠记忆和猜测,容易迷路,容易绕圈。
  • ToT / AoT 是「在脑子里画地图」:好一些,但地图存在 LLM 的参数里,不精确,容易「幻觉」出根本不存在的路。
  • LLM+P 是「让翻译官问路,让导航仪指路」:LLM 把自然语言翻译成精确的坐标(PDDL),然后交给 GPS(符号规划器)算出最优路径。
  • LLM-DP 是「实时更新地图的导航」:不仅翻译,还能在行驶中根据路况(环境变化)重新翻译、重新规划。
  • 纯符号规划 是「专业司机走固定路线」:最稳,但需要人类提前把整个世界写成规则书。

1.2 核心洞察:LLM 是「自然语言 ↔ 形式语言」的桥梁

混合架构的底层假设非常清晰:LLM 擅长理解模糊、开放、充满隐含信息的自然语言;符号规划器擅长在精确、封闭、逻辑严密的形式语言里做搜索。两者结合,各取所长。

换句话说,LLM 不需要学会「如何搭积木」——它只需要学会「如何把『搭一座 ABC 塔』这句话翻译成符号逻辑」。搭积木的具体步骤,交给已经在国际规划竞赛(IPC)上跑了二十年的 Fast Downward 求解器。citeweb_search:5#4

LLM+P 的解耦架构

自然语言问题

LLM 翻译为 PDDL

符号规划器求解

保证: 满足所有前置条件
动作序列逻辑完备

LLM 翻译回自然语言

人类可读的计划

纯 LLM 规划的困境

自然语言问题

LLM 直接生成动作序列

幻觉: 违反前置条件
如: 拿起被压住的积木

失败或循环

在上图里,纯 LLM 规划像是一个「没有驾照的人在开手动挡」;而 LLM+P 像是一个「翻译官 + 专业司机」的组合——翻译官负责听懂乘客要去哪,司机负责安全送达。


2. 中观视角:LLM+P 与 LLM-DP 的齿轮结构

现在我们已经了解了混合架构的「整体功能定位」——让 LLM 当翻译,让符号规划器当求解引擎。接下来我们把它拆开,看看内部到底由哪些齿轮咬合而成。

别急,我们不会直接扔定义。先问你一个问题:如果你要把一份中文菜谱翻译成法文,然后让一位法国大厨按菜谱做菜,你会怎么组织流程?

大概率你会这样安排:

  1. 翻译阶段:把「红烧排骨」翻译成「Côtes de porc braisées」,同时标注好每一步的火候、时间、调料克数;
  2. 执行阶段:法国大厨按翻译好的菜谱精确执行,因为菜谱已经标准化了,不会出现「少许盐」这种模糊表述;
  3. 回译阶段:如果食客问「这道菜怎么做的」,你再把大厨的执行步骤翻译回中文讲给食客听。

LLM+P 的架构设计,本质上就是把这套「翻译-执行-回译」流程编码成 LLM Agent 的模块协议。

根据 Liu et al. (2023) 的原始论文,LLM+P 可以拆成三个相互咬合的组件。我们用一个「玩具示例」来把它们具象化。citeweb_search:5#4

2.1 玩具示例:3 块积木的简化 Blocksworld

假设问题被简化成:

  • 自然语言描述:「桌上有积木 A、B、C。A 在桌上,B 在 A 上面,C 在桌上。请把 C 放到 B 上面。」
  • 目标状态:C 在 B 上面,B 在 A 上面,A 在桌上。

LLM+P 不会立刻去「思考」怎么搬积木。它会先进入「翻译模式」,生成两个 PDDL 文件。

文件 1:Domain(领域文件)

这个文件描述「积木世界」的通用规则——就像一本《积木世界物理定律》:

(define (domain blocksworld)
  (:requirements :strips)
  (:predicates
    (ontable ?x)      ;; x 在桌上
    (on ?x ?y)        ;; x 在 y 上面
    (clear ?x)        ;; x 顶部是空的
    (handempty)       ;; 机械手是空的
    (holding ?x)      ;; 机械手拿着 x
  )

  ;; 动作 1: 从桌上拿起积木
  (:action pick-up
    :parameters (?x)
    :precondition (and (clear ?x) (ontable ?x) (handempty))
    :effect (and (holding ?x) 
                 (not (ontable ?x)) 
                 (not (clear ?x)) 
                 (not (handempty)))
  )

  ;; 动作 2: 把积木放到桌上
  (:action put-down
    :parameters (?x)
    :precondition (holding ?x)
    :effect (and (ontable ?x) 
                 (clear ?x) 
                 (handempty) 
                 (not (holding ?x)))
  )

  ;; 动作 3: 从另一块积木上拿起
  (:action unstack
    :parameters (?x ?y)
    :precondition (and (on ?x ?y) (clear ?x) (handempty))
    :effect (and (holding ?x) 
                 (clear ?y) 
                 (not (on ?x ?y)) 
                 (not (clear ?x)) 
                 (not (handempty)))
  )

  ;; 动作 4: 把积木放到另一块上
  (:action stack
    :parameters (?x ?y)
    :precondition (and (holding ?x) (clear ?y))
    :effect (and (on ?x ?y) 
                 (clear ?x) 
                 (handempty) 
                 (not (holding ?x)) 
                 (not (clear ?y)))
  )
)

注意这里发生了什么:PDDL 的每个动作都有 precondition(前置条件)effect(后置效果)。比如 pick-up 要求积木顶部是空的(clear)、积木在桌上(ontable)、机械手是空的(handempty)。如果这些条件不满足,规划器根本不会考虑这个动作。这就像法国大厨看到菜谱上写「先把排骨焯水」,如果排骨还没解冻,他会拒绝执行——而不是像 LLM 那样「硬来」。citeweb_search:7#4

文件 2:Problem(问题文件)

这个文件描述「当前这一局」的具体状态——就像一张「当前厨房快照」:

(define (problem tower-abc)
  (:domain blocksworld)
  (:objects A B C)
  (:init
    (ontable A)
    (on B A)
    (ontable C)
    (clear B)
    (clear C)
    (handempty)
  )
  (:goal
    (and (on C B) (on B A) (ontable A))
  )
)

现在,这两个文件被喂给符号规划器(如 Fast Downward)。规划器在 0.1 秒内输出:

(unstack B A)
(put-down B)
(pick-up C)
(stack C B)
(pick-up B)
(stack B A)

六步,逻辑完备,没有任何幻觉。这就是符号规划器的威力——它不会「忘记」B 还在 A 上面时就试图拿起 A,因为 PDDL 的 preconditions 像一道防火墙,挡住了所有非法动作。citeweb_search:5#4

2.2 三大齿轮详解

齿轮 1:LLM as Formalizer(形式化翻译器)

问题驱动:面对「把 C 放到 B 上面」这句话,LLM 怎么知道该生成哪些 predicates 和 actions?

在 LLM+P 的原始实现中,这一步被称为 NL-to-PDDL。LLM 接收:

  • 自然语言问题描述;
  • 一个 in-context example(展示如何把自然语言翻译成 PDDL domain + problem);
  • 可选的 domain 模板(如果领域已知)。

然后它输出两个 PDDL 文件。关键技巧是:LLM 不负责「规划」,只负责「翻译」。 它不需要理解 unstackstack 的先后顺序,只需要把「B 在 A 上面」翻译成 (on B A),把「机械手是空的」翻译成 (handempty)。citeweb_search:5#4

这听起来像是一个「降维打击」——把原本需要深度推理的任务,降级为「格式转换」任务。而格式转换,正是 LLM 最擅长的。

齿轮 2:Symbolic Planner(符号规划器)

问题驱动:PDDL 文件有了,谁来解?

符号规划器(如 Fast Downward、FF、LPG)是 AI 规划领域跑了几十年的成熟工具。它们的核心算法是 启发式搜索(如 A*、GBFS),在状态空间里寻找从初始状态到目标状态的最短路径。citeweb_search:7#4

符号规划器的内部

unstack(B,A)

put-down(B)

pick-up(C)

stack(C,B)

pick-up(B)

stack(B,A)

初始状态 S0
(ontable A), (on B A)...

S1: holding B, clear A...

S2: ontable B, clear B...

S3: holding C...

S4: on C B, clear C...

S5: holding B, clear A...

S6: 目标达成 ✓

与 LLM 不同,符号规划器保证

  • 如果解存在,它一定能找到(完备性);
  • 如果要求最优,它找到的一定是最短的(最优性);
  • 每一步都严格满足前置条件(合法性)。

这些保证是 LLM 无论如何微调都给不了的。

齿轮 3:LLM as Explainer(结果解释器)

问题驱动:符号规划器输出的是 (unstack B A) 这种机器语言,用户看不懂怎么办?

最后一步,LLM 把规划器输出的动作序列翻译回自然语言:

第一步:从积木 A 上拿起积木 B,现在 A 顶部空了。
第二步:把 B 放到桌上,现在 B 顶部也是空的。
第三步:拿起积木 C。
第四步:把 C 放到 B 上面,现在 C 在 B 上面了。
第五步:拿起积木 B。
第六步:把 B 放回 A 上面,塔搭好了!

这一步是可选的,但在人机交互场景里至关重要。它让符号规划的「黑盒」结果变得可解释、可验证。


3. 微观视角:PDDL 的语法结构与 LLM 的「翻译契约」

现在我们已经了解了三大齿轮。接下来进入最微妙的部分:LLM 到底是怎么学会把自然语言翻译成 PDDL 的?

3.1 PDDL 的「语法骨架」

如果把 PDDL 看成一种编程语言,它的语法骨架非常规则化——这对 LLM 来说是好事,因为规则化意味着可预测、可 few-shot 学习。

PDDL 文件结构

Domain 文件

(:requirements) 语言特性

(:types) 对象类型层次

(:predicates) 状态谓词

(:action) 动作模式
├─ :parameters
├─ :precondition
└─ :effect

Problem 文件

(:objects) 具体对象

(:init) 初始状态

(:goal) 目标条件

关键观察:PDDL 的语法是「声明式」的,不是「命令式」的。你不需要告诉规划器「先做这个再做那个」,你只需要声明「世界是什么样」和「世界允许什么操作」。规划器自己会去算最优顺序。citeweb_search:7#4

这就像 SQL 和 Python 的区别:SQL 是声明式(「给我所有年龄大于 18 的用户」),Python 是命令式(「遍历列表,检查 age 字段,如果大于 18 就加入结果」)。LLM 翻译 PDDL,本质上是在做「从自然语言到声明式查询」的转换——这比「从自然语言到命令式代码」更容易,因为声明式语言更接近人类的「描述性思维」。

3.2 LLM 的「翻译契约」:Few-shot 示例设计

在 LLM+P 的原始论文中,翻译质量严重依赖 few-shot 示例的设计。一个好的示例需要包含:

  1. 完整的 Domain 模板:展示 predicates 和 actions 的语法;
  2. Problem 的对应关系:展示如何把自然语言状态映射到 (predicate object)
  3. 错误示范与修正:展示常见的翻译错误(如忘记 handempty)及如何修正。

Few-shot 示例的层次结构

Level 1: 语法模板
展示 PDDL 的 BNF 骨架

Level 2: 语义映射
展示 '在...上面' → (on ?x ?y)

Level 3: 完整示例
一个自然语言问题 + 对应的 Domain + Problem

Level 4: 错误案例
常见错误 + 修正版本

实验表明,GPT-4 在这种 few-shot 设置下,PDDL 翻译的准确率可以达到 95% 以上。但一旦进入「神秘版 Blocksworld」(Mystery Blocksworld,所有谓词名被随机替换为无意义字符串),准确率会断崖式下跌——这说明 LLM 的翻译能力很大程度上依赖语义线索,而非纯粹的语法规则。citeweb_search:7#1


4. LLM-DP:当世界会动的时候

4.1 从静态到动态:为什么需要 LLM-DP?

LLM+P 假设世界是「静态」的——你把 PDDL 文件交给规划器,规划器给你一个计划,你按计划执行,完事。但现实世界是动态的:你刚拿起积木 B,一只猫跳上桌子把积木 C 推到了地上。原来的计划失效了。

LLM-DP(Dynamic Planning with a LLM)就是为解决这种情况而生的。 citeweb_search:5#3

根据 Dagan et al. (2023) 的论文,LLM-DP 在 LLM+P 的基础上增加了三个关键能力:

  1. 信念状态维护(Belief State):LLM 维护一个对世界状态的「概率分布」,而不是一个确定状态;
  2. 观察集成(Observation Integration):每次执行动作后,把新的观察结果(如「C 不在桌上了」)整合进信念状态;
  3. 触发重规划(Re-planning Trigger):当信念状态与计划假设严重偏离时,自动生成新的 PDDL problem 文件,重新调用规划器。citeweb_search:7#3

4.2 玩具示例:带「猫干扰」的 Blocksworld

让我们扩展之前的例子。假设在执行到第三步「拿起 C」时,观察发现 C 不在桌上了——猫把它推到了地上。

LLM-DP 的处理流程:

LLM-DP 动态重规划循环

偏差 > 阈值

偏差 ≤ 阈值

初始计划
Plan0: unstack→put-down→pick-up→stack...

执行: unstack(B,A)

观察: B 被拿起, A 顶部空了 ✓

执行: put-down(B)

观察: B 在桌上 ✓

执行: pick-up(C)

观察: C 不在桌上!
信念状态更新: (ontable C) = false

偏差检测

触发重规划
生成新 Problem 文件

符号规划器求解
Plan1: pick-up(C_from_floor)→...

执行新计划

继续执行原计划

关键区别:LLM+P 是「一次性翻译+一次性求解」;LLM-DP 是「翻译→求解→执行→观察→(可能)重翻译→重求解」的循环。后者更像 ReAct,但中间的「求解」步骤交给了符号规划器,而不是 LLM 自己瞎猜。citeweb_search:7#3

4.3 实验结果:AlfWorld 上的碾压

在 AlfWorld(一个基于文本的具身智能体环境)上,LLM-DP 取得了惊人的成绩:

  • 成功率:96%(对比 ReAct 的 53%)
  • 平均步数:13.16 步(对比 ReAct 的 18.69 步)
  • PDDL 目标翻译准确率:97%

这意味着 LLM-DP 不仅更稳,还更高效——因为它不会陷入 ReAct 那种「拿起→放下→拿起」的无效循环。符号规划器给出的计划,在逻辑上就是最优或近优的。citeweb_search:7#3


5. 结构化伪代码:混合架构的算法内核

好了,直觉和比喻已经够多了。在继续之前,让我们把 LLM+P 和 LLM-DP 的核心流程翻译成结构化伪代码。这会帮助我们把「聊天式的理解」锚定到精确的算法步骤上。

5.1 LLM+P 高层流程:静态规划

这段伪代码描述的是 LLM+P 的完整三阶段流程

Algorithm: LLM+P_Static_Planning
Input: 自然语言问题描述 Q, 可选的领域模板 Domain_Template
Output: 自然语言计划 Plan_NL

1.  // 阶段 1: 形式化翻译(LLM as Formalizer)
    Prompt<sub>formalize</sub> ← 系统指令("将自然语言规划问题翻译为 PDDL。")
    Prompt<sub>formalize</sub> ← Prompt<sub>formalize</sub> + PDDL 语法说明
    Prompt<sub>formalize</sub> ← Prompt<sub>formalize</sub> + Few-shot 示例

    if Domain_Template ≠ ∅ then
        Prompt<sub>formalize</sub> ← Prompt<sub>formalize</sub> + "使用以下领域模板:" + Domain_Template
    end

    Prompt<sub>formalize</sub> ← Prompt<sub>formalize</sub> + "问题:" + Q

    PDDL_Output ← LLM.generate(Prompt<sub>formalize</sub>)
    // PDDL_Output 包含 (define (domain ...) ...) 和 (define (problem ...) ...)

    Domain_File ← Extract_Domain(PDDL_Output)
    Problem_File ← Extract_Problem(PDDL_Output)

2.  // 阶段 2: 符号求解(Symbolic Planner)
    Plan_RAW ← Symbolic_Planner.solve(Domain_File, Problem_File)
    // Plan_RAW 格式: [(action1 params1), (action2 params2), ...]

    if Plan_RAW = ∅ then
        return "问题无解或 PDDL 翻译有误"
    end

3.  // 阶段 3: 结果解释(LLM as Explainer)
    Prompt<sub>explain</sub> ← 系统指令("将以下 PDDL 计划翻译为自然语言步骤。")
    Prompt<sub>explain</sub> ← Prompt<sub>explain</sub> + "原始问题:" + Q
    Prompt<sub>explain</sub> ← Prompt<sub>explain</sub> + "计划:" + Plan_RAW

    Plan_NL ← LLM.generate(Prompt<sub>explain</sub>)
    return Plan_NL

关键点:第 1 步和第 3 步使用 LLM,第 2 步使用确定性符号规划器。LLM 只负责「翻译」,不负责「推理」。

5.2 LLM-DP 高层流程:动态规划

这段伪代码描述的是 LLM-DP 的感知-规划-执行循环

Algorithm: LLM-DP_Dynamic_Planning
Input: 自然语言指令 I, 领域定义 Domain_Def, 环境接口 Env
Output: 执行轨迹 Trajectory

1.  // 初始化
    Belief ← Initialize_Belief(I, Domain_Def)
    // Belief 是可能世界状态的分布,基于 LLM 对初始描述的理解
    Trajectory ← []

    // 生成初始 PDDL 问题
    Problem<sub>0</sub> ← LLM.translate_to_PDDL(I, Belief, Domain_Def)
    Current_Plan ← Symbolic_Planner.solve(Domain_Def, Problem<sub>0</sub>)

2.  while 未到达目标 do
        if Current_Plan = ∅ then
            return "无法生成可行计划"
        end

        // 执行下一步
        Action ← Current_Plan.pop_front()
        Result ← Env.execute(Action)
        Trajectory ← Trajectory + [(Action, Result)]

        // 观察集成
        Observation ← Env.observe()
        Belief ← Update_Belief(Belief, Action, Observation)
        // Update_Belief 使用符号动作效果 + 新观察来更新状态

        // 偏差检测
        Deviation ← Compute_Deviation(Belief, Current_Plan.assumptions)

        if Deviation > Threshold then
            // 触发重规划
            Problem<sub>new</sub> ← LLM.translate_to_PDDL(I, Belief, Domain_Def)
            // LLM 根据更新后的信念状态生成新 Problem 文件
            Current_Plan ← Symbolic_Planner.solve(Domain_Def, Problem<sub>new</sub>)
            // 注意: Domain 文件通常不变,只有 Problem 文件更新
        end
    end

3.  return Trajectory

啊哈时刻来了:注意第 2 步里的 Update_Belief——它不是纯 LLM 操作,而是符号推理 + LLM 补全的混合。符号部分用 PDDL action 的 effect 来更新确定状态;LLM 部分用来处理「观察中超出符号模型的新信息」(如「猫出现了」)。这是一种「双系统」架构:Fast System(符号更新)处理常规变化,Slow System(LLM 重翻译)处理异常。citeweb_search:7#3


6. 深入机制:为什么「翻译」比「直接规划」更靠谱?

6.1 锚定已知:如果你懂 SQL,你就懂了 LLM+P 的 70%

概念 SQL 数据库查询 LLM+P
自然语言请求 “找出所有年龄大于 18 的用户” “把 C 放到 B 上面”
形式化中间表示 SQL: SELECT * FROM users WHERE age > 18 PDDL Problem 文件
执行引擎 查询优化器 + 执行引擎 Fast Downward / FF
结果保证 结果一定满足 WHERE 条件 计划一定满足 preconditions
LLM 的角色 NL-to-SQL 翻译器 NL-to-PDDL 翻译器
错误类型 翻译错误(如把 age 写成 name) 翻译错误(如漏掉 handempty
调试方式 检查生成的 SQL 检查生成的 PDDL

顿悟时刻:LLM+P 和 Text-to-SQL 面临完全相同的挑战——LLM 的翻译可能出错。但关键在于:翻译错误比推理错误更容易检测和修复。你可以用一个 PDDL 验证器(validator)检查语法和类型错误;但你很难用一个「计划验证器」检查 LLM 生成的动作序列是否逻辑完备,因为计划验证本身就是 NP-hard 问题。

6.2 错误处理:当翻译出错时

原始论文指出,LLM 生成的 PDDL 可能有三种错误:citeweb_search:5#3

  1. 语法错误:漏掉括号、拼错关键字。→ 用 PDDL 解析器捕获,反馈给 LLM 修正。
  2. 语义错误:predicates 定义正确,但初始状态或目标状态翻译错了。→ 用规划器的「无解」信号触发重翻译。
  3. 领域错误:action 的 precondition/effect 描述不完整。→ 最难发现,需要领域专家或自动验证工具。

PDDL 翻译错误处理流水线

失败

通过

无解

有解

失败

成功

LLM 生成 PDDL

语法验证

反馈: 语法错误
LLM 重生成

规划器求解

反馈: 语义错误
LLM 重生成 Problem

执行验证

反馈: 领域错误
人工介入或迭代修正

计划可用 ✓

后续工作如 PDDLEGO 和 Guan et al. (2023) 的框架,进一步引入了迭代修正机制:当规划器报告失败时,不是简单地让 LLM「再试一次」,而是把错误信息(如「precondition 不满足」)结构化地反馈给 LLM,指导它有针对性地修改 PDDL。citeweb_search:5#3


7. 变体与演进:从 LLM+P 到 LLM-Modulo

7.1 原始 LLM+P 的局限性

别急,原始 LLM+P 并不是万能的。它有两个主要痛点:

  1. 领域模板依赖:如果问题涉及一个全新的领域(如「太空站维修」),而你没有现成的 PDDL domain 模板,LLM 需要从零生成整个 domain 文件——包括所有 predicates 和 actions。这对 LLM 来说非常困难,实验表明成功率会大幅下降。citeweb_search:5#16
  2. 完全可观测假设:LLM+P 假设初始状态是完全已知的。但在真实机器人场景中,你可能只知道「桌上有一些积木」,但不知道具体是哪几块、怎么摆放的。

7.2 LLM-Modulo:更松耦合的混合框架

2024 年,Kambhampati 等人提出了 LLM-Modulo 框架,把 LLM 和符号验证器的关系从「翻译-求解」升级为「生成-验证-迭代」。citeweb_search:5#3

LLM-Modulo 框架

不合法

合法

LLM
生成候选计划

符号验证器
检查计划合法性

生成反馈信号

输出计划

在这个框架里,LLM 可以直接生成动作计划(像纯 LLM 规划一样),但每一步都要经过一个「符号验证器」的审查。如果计划违反了某个 precondition,验证器生成具体的错误信息,LLM 根据反馈修正。这比 LLM+P 更灵活——LLM 不需要生成完整的 PDDL,只需要生成「候选计划」,验证器负责把关。

7.3 视觉-语言扩展:Image2PDDL

2025 年的 Image2PDDL 工作把 LLM+P 扩展到了多模态场景:不再接收文本描述,而是接收图片(如一张积木桌的照片),用 Vision-Language Model(VLM)直接生成 PDDL problem 文件。citeweb_search:5#10

Image2PDDL 流水线

图片: 积木桌

VLM
检测对象 + 关系

生成 Problem PDDL
(init 状态)

符号规划器

动作计划

这消除了「文本描述不准确」的问题——VLM 直接「看到」了积木的摆放方式,而不是依赖人类(或另一个 LLM)的文字描述。


8. 这意味着什么?训练与实际使用

8.1 对 Prompt 工程师的启示

  1. Few-shot 示例必须包含「完整对应关系」:不要只展示 PDDL 语法,要展示「自然语言句子 → PDDL 表达式」的逐句映射。比如「A 在桌上」对应 (ontable A),「B 在 A 上面」对应 (on B A)
  2. Domain 模板是「类型系统」:如果领域固定(如总是 Blocksworld),把 domain 文件作为系统提示的一部分,只让 LLM 生成 problem 文件。这大大降低了翻译难度。
  3. 错误反馈要结构化:当 PDDL 验证失败时,不要只给 LLM 一句「错了」,而要给出具体的错误类型和位置,如「Syntax error: line 15, missing closing parenthesis in :precondition」。

8.2 对系统架构师的启示

生产环境部署建议

是 (如 Blocksworld)

否 (开放领域)

部分可观测

用户请求

领域已知?

LLM+P 路径
固定 Domain + 动态 Problem

LLM-DP 路径
动态 Domain + 动态 Problem

Image2PDDL 路径
VLM 感知 + 符号规划

符号规划器

执行器

答案

在实际系统中,混合架构最适合「需要逻辑完备性保证」的高风险场景:

  • 工业机器人操作(不能撞坏设备)
  • 医疗流程规划(不能跳过关键步骤)
  • 航天器任务规划(燃料有限,必须最优)

对于「容错性高、创造性要求高」的任务(如写作、设计),纯 LLM 规划仍然更合适。

8.3 对研究者的启示

混合架构揭示了一个深刻的趋势:LLM 正在从「端到端求解器」退化为「接口层」——连接自然语言用户和形式化工具的生态位。未来的方向可能包括:

  • 自动 Domain 生成:让 LLM 从少量示例中自动归纳出 PDDL domain 文件,而不是依赖人工模板;
  • 神经-符号联合优化:用神经网络学习启发式函数,加速符号规划器的搜索;
  • 多模态 PDDL:把图像、视频、传感器数据直接编码进 PDDL 的初始状态,实现「感知-规划」闭环。

9. 闭环总结:一张图带走所有知识点

让我们用最后一张图,把今天探索的所有内容收束起来:

外部规划器集成总览

错误

通过

执行中观察变化

自然语言问题
如: 搭 ABC 积木塔

LLM as Formalizer
翻译为 PDDL Domain + Problem

验证

符号规划器
Fast Downward / FF

输出动作序列
(unstack B A)...

LLM as Explainer
翻译回自然语言

人类可读的计划

LLM-DP 重规划
更新 Problem → 重新求解

记住这个闭环:自然语言 → LLM 翻译为 PDDL → 符号规划器求解 → 动作序列 → LLM 回译为自然语言。如果世界变了,LLM-DP 会更新 Problem 文件并重新求解。这就是混合架构的精髓。


10. 延伸阅读与参考文献

如果你想继续深入,以下是我为你精选的国外核心文献,按阅读顺序排列:

  1. Liu, B., Jiang, Y., Zhang, X., Liu, Q., Zhang, S., Biswas, J., & Stone, P. (2023). LLM+P: Empowering Large Language Models with Optimal Planning Proficiency. arXiv:2304.11477. citeweb_search:5#4 —— LLM+P 的奠基论文,包含完整的 Blocksworld 实验、PDDL 翻译流程与准确率分析。

  2. Dagan, G., Keller, F., & Lascarides, A. (2023). Dynamic Planning with a LLM. arXiv:2308.06391. citeweb_search:7#3 —— LLM-DP 的原始论文,包含 AlfWorld 上的 96% 成功率实验与信念状态维护机制。

  3. Kambhampati, S., Valmeekam, K., Guan, L., Verma, M., Stechly, K., Bhambri, S., Saldyt, L., & Murthy, A. (2024). LLMs Can’t Plan, But Can Help Planning in LLM-Modulo Frameworks. arXiv:2402.01817. citeweb_search:5#3 —— 系统性地提出 LLM-Modulo 框架,把 LLM 定位为「生成器」而非「求解器」。

  4. Guan, L., Valmeekam, K., Sreedharan, S., & Kambhampati, S. (2023). LLMs as World Models: Generating PDDL Models with External Feedback. citeweb_search:5#3 —— 展示如何用外部验证器和人类反馈迭代修正 LLM 生成的 PDDL。

  5. Valmeekam, K., Stechly, K., & Kambhampati, S. (2024). On the Planning Abilities of Large Language Models: A Critical Investigation. citeweb_search:7#1 —— 批判性评估 LLM 的规划能力,为混合架构的必要性提供了实证基础。

  6. Zhang, Y., et al. (2024). PDDLEGO: Iterative PDDL Refinement with Sub-goal Fallback. citeweb_search:5#3 —— 提出迭代式 PDDL 修正策略,当规划失败时自动回退到子目标重新生成。


写在最后

我们今天的旅程,从一座反复倒塌的积木塔开始,穿过纯 LLM 规划的幻觉迷雾、ReAct 的上下文膨胀沼泽,最终抵达了「神经-符号混合」这片高地。希望你已经感受到:LLM 不需要做所有事,它只需要做好「翻译」——把人类的模糊意图翻译成机器的精确语言,然后把重活累活交给那些已经跑了几十年的符号引擎。

下次当你面对一个需要「逻辑完备性保证」的规划任务时,不妨先问自己:「这个问题能被写成 PDDL 吗?如果能,就让 LLM 当翻译官,让 Fast Downward 当建筑师。」你的成功率、可解释性和用户信任度,都会大幅提升。

全文完。如有疑问,欢迎带着具体的领域描述来讨论如何为你的场景设计 PDDL 翻译 prompt。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐