24 外部规划器集成:当 LLM 遇到符号逻辑——LLM+P、LLM-DP 与 PDDL 转换的混合架构
阅读提示:本文约 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 太多,模型注意力涣散了。citeweb_search:3#11
那么,有没有一种方法,能让 LLM 只做它最擅长的事(理解自然语言),而把「搭积木的精确步骤」交给一个永远不会犯糊涂的数学机器?
这就是我们今天要一起探索的 外部规划器集成(External Planner Integration),核心代表是 LLM+P 和 LLM-DP。别急,听起来抽象对吧?我们一步一步来。
1. 宏观视角:混合架构到底在解决什么问题?
1.1 先画一张大地图
如果把 LLM 的规划能力看成「从 A 点到 B 点的导航方式」,那么目前的主流方法可以画成下面这张图。注意看,LLM+P 和 LLM-DP 占据了一个非常独特的生态位:
我们怎么理解这张图?
- 纯 LLM 规划 是「凭直觉开车」:没有地图,靠记忆和猜测,容易迷路,容易绕圈。
- ToT / AoT 是「在脑子里画地图」:好一些,但地图存在 LLM 的参数里,不精确,容易「幻觉」出根本不存在的路。
- LLM+P 是「让翻译官问路,让导航仪指路」:LLM 把自然语言翻译成精确的坐标(PDDL),然后交给 GPS(符号规划器)算出最优路径。
- LLM-DP 是「实时更新地图的导航」:不仅翻译,还能在行驶中根据路况(环境变化)重新翻译、重新规划。
- 纯符号规划 是「专业司机走固定路线」:最稳,但需要人类提前把整个世界写成规则书。
1.2 核心洞察:LLM 是「自然语言 ↔ 形式语言」的桥梁
混合架构的底层假设非常清晰:LLM 擅长理解模糊、开放、充满隐含信息的自然语言;符号规划器擅长在精确、封闭、逻辑严密的形式语言里做搜索。两者结合,各取所长。
换句话说,LLM 不需要学会「如何搭积木」——它只需要学会「如何把『搭一座 ABC 塔』这句话翻译成符号逻辑」。搭积木的具体步骤,交给已经在国际规划竞赛(IPC)上跑了二十年的 Fast Downward 求解器。citeweb_search:5#4
在上图里,纯 LLM 规划像是一个「没有驾照的人在开手动挡」;而 LLM+P 像是一个「翻译官 + 专业司机」的组合——翻译官负责听懂乘客要去哪,司机负责安全送达。
2. 中观视角:LLM+P 与 LLM-DP 的齿轮结构
现在我们已经了解了混合架构的「整体功能定位」——让 LLM 当翻译,让符号规划器当求解引擎。接下来我们把它拆开,看看内部到底由哪些齿轮咬合而成。
别急,我们不会直接扔定义。先问你一个问题:如果你要把一份中文菜谱翻译成法文,然后让一位法国大厨按菜谱做菜,你会怎么组织流程?
大概率你会这样安排:
- 翻译阶段:把「红烧排骨」翻译成「Côtes de porc braisées」,同时标注好每一步的火候、时间、调料克数;
- 执行阶段:法国大厨按翻译好的菜谱精确执行,因为菜谱已经标准化了,不会出现「少许盐」这种模糊表述;
- 回译阶段:如果食客问「这道菜怎么做的」,你再把大厨的执行步骤翻译回中文讲给食客听。
LLM+P 的架构设计,本质上就是把这套「翻译-执行-回译」流程编码成 LLM Agent 的模块协议。
根据 Liu et al. (2023) 的原始论文,LLM+P 可以拆成三个相互咬合的组件。我们用一个「玩具示例」来把它们具象化。citeweb_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 那样「硬来」。citeweb_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 像一道防火墙,挡住了所有非法动作。citeweb_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 不负责「规划」,只负责「翻译」。 它不需要理解 unstack 和 stack 的先后顺序,只需要把「B 在 A 上面」翻译成 (on B A),把「机械手是空的」翻译成 (handempty)。citeweb_search:5#4
这听起来像是一个「降维打击」——把原本需要深度推理的任务,降级为「格式转换」任务。而格式转换,正是 LLM 最擅长的。
齿轮 2:Symbolic Planner(符号规划器)
问题驱动:PDDL 文件有了,谁来解?
符号规划器(如 Fast Downward、FF、LPG)是 AI 规划领域跑了几十年的成熟工具。它们的核心算法是 启发式搜索(如 A*、GBFS),在状态空间里寻找从初始状态到目标状态的最短路径。citeweb_search:7#4
与 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 的语法是「声明式」的,不是「命令式」的。你不需要告诉规划器「先做这个再做那个」,你只需要声明「世界是什么样」和「世界允许什么操作」。规划器自己会去算最优顺序。citeweb_search:7#4
这就像 SQL 和 Python 的区别:SQL 是声明式(「给我所有年龄大于 18 的用户」),Python 是命令式(「遍历列表,检查 age 字段,如果大于 18 就加入结果」)。LLM 翻译 PDDL,本质上是在做「从自然语言到声明式查询」的转换——这比「从自然语言到命令式代码」更容易,因为声明式语言更接近人类的「描述性思维」。
3.2 LLM 的「翻译契约」:Few-shot 示例设计
在 LLM+P 的原始论文中,翻译质量严重依赖 few-shot 示例的设计。一个好的示例需要包含:
- 完整的 Domain 模板:展示 predicates 和 actions 的语法;
- Problem 的对应关系:展示如何把自然语言状态映射到
(predicate object); - 错误示范与修正:展示常见的翻译错误(如忘记
handempty)及如何修正。
实验表明,GPT-4 在这种 few-shot 设置下,PDDL 翻译的准确率可以达到 95% 以上。但一旦进入「神秘版 Blocksworld」(Mystery Blocksworld,所有谓词名被随机替换为无意义字符串),准确率会断崖式下跌——这说明 LLM 的翻译能力很大程度上依赖语义线索,而非纯粹的语法规则。citeweb_search:7#1
4. LLM-DP:当世界会动的时候
4.1 从静态到动态:为什么需要 LLM-DP?
LLM+P 假设世界是「静态」的——你把 PDDL 文件交给规划器,规划器给你一个计划,你按计划执行,完事。但现实世界是动态的:你刚拿起积木 B,一只猫跳上桌子把积木 C 推到了地上。原来的计划失效了。
LLM-DP(Dynamic Planning with a LLM)就是为解决这种情况而生的。 citeweb_search:5#3
根据 Dagan et al. (2023) 的论文,LLM-DP 在 LLM+P 的基础上增加了三个关键能力:
- 信念状态维护(Belief State):LLM 维护一个对世界状态的「概率分布」,而不是一个确定状态;
- 观察集成(Observation Integration):每次执行动作后,把新的观察结果(如「C 不在桌上了」)整合进信念状态;
- 触发重规划(Re-planning Trigger):当信念状态与计划假设严重偏离时,自动生成新的 PDDL problem 文件,重新调用规划器。citeweb_search:7#3
4.2 玩具示例:带「猫干扰」的 Blocksworld
让我们扩展之前的例子。假设在执行到第三步「拿起 C」时,观察发现 C 不在桌上了——猫把它推到了地上。
LLM-DP 的处理流程:
关键区别:LLM+P 是「一次性翻译+一次性求解」;LLM-DP 是「翻译→求解→执行→观察→(可能)重翻译→重求解」的循环。后者更像 ReAct,但中间的「求解」步骤交给了符号规划器,而不是 LLM 自己瞎猜。citeweb_search:7#3
4.3 实验结果:AlfWorld 上的碾压
在 AlfWorld(一个基于文本的具身智能体环境)上,LLM-DP 取得了惊人的成绩:
- 成功率:96%(对比 ReAct 的 53%)
- 平均步数:13.16 步(对比 ReAct 的 18.69 步)
- PDDL 目标翻译准确率:97%
这意味着 LLM-DP 不仅更稳,还更高效——因为它不会陷入 ReAct 那种「拿起→放下→拿起」的无效循环。符号规划器给出的计划,在逻辑上就是最优或近优的。citeweb_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 重翻译)处理异常。citeweb_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 可能有三种错误:citeweb_search:5#3
- 语法错误:漏掉括号、拼错关键字。→ 用 PDDL 解析器捕获,反馈给 LLM 修正。
- 语义错误:predicates 定义正确,但初始状态或目标状态翻译错了。→ 用规划器的「无解」信号触发重翻译。
- 领域错误:action 的 precondition/effect 描述不完整。→ 最难发现,需要领域专家或自动验证工具。
后续工作如 PDDLEGO 和 Guan et al. (2023) 的框架,进一步引入了迭代修正机制:当规划器报告失败时,不是简单地让 LLM「再试一次」,而是把错误信息(如「precondition 不满足」)结构化地反馈给 LLM,指导它有针对性地修改 PDDL。citeweb_search:5#3
7. 变体与演进:从 LLM+P 到 LLM-Modulo
7.1 原始 LLM+P 的局限性
别急,原始 LLM+P 并不是万能的。它有两个主要痛点:
- 领域模板依赖:如果问题涉及一个全新的领域(如「太空站维修」),而你没有现成的 PDDL domain 模板,LLM 需要从零生成整个 domain 文件——包括所有 predicates 和 actions。这对 LLM 来说非常困难,实验表明成功率会大幅下降。citeweb_search:5#16
- 完全可观测假设:LLM+P 假设初始状态是完全已知的。但在真实机器人场景中,你可能只知道「桌上有一些积木」,但不知道具体是哪几块、怎么摆放的。
7.2 LLM-Modulo:更松耦合的混合框架
2024 年,Kambhampati 等人提出了 LLM-Modulo 框架,把 LLM 和符号验证器的关系从「翻译-求解」升级为「生成-验证-迭代」。citeweb_search:5#3
在这个框架里,LLM 可以直接生成动作计划(像纯 LLM 规划一样),但每一步都要经过一个「符号验证器」的审查。如果计划违反了某个 precondition,验证器生成具体的错误信息,LLM 根据反馈修正。这比 LLM+P 更灵活——LLM 不需要生成完整的 PDDL,只需要生成「候选计划」,验证器负责把关。
7.3 视觉-语言扩展:Image2PDDL
2025 年的 Image2PDDL 工作把 LLM+P 扩展到了多模态场景:不再接收文本描述,而是接收图片(如一张积木桌的照片),用 Vision-Language Model(VLM)直接生成 PDDL problem 文件。citeweb_search:5#10
这消除了「文本描述不准确」的问题——VLM 直接「看到」了积木的摆放方式,而不是依赖人类(或另一个 LLM)的文字描述。
8. 这意味着什么?训练与实际使用
8.1 对 Prompt 工程师的启示
- Few-shot 示例必须包含「完整对应关系」:不要只展示 PDDL 语法,要展示「自然语言句子 → PDDL 表达式」的逐句映射。比如「A 在桌上」对应
(ontable A),「B 在 A 上面」对应(on B A)。 - Domain 模板是「类型系统」:如果领域固定(如总是 Blocksworld),把 domain 文件作为系统提示的一部分,只让 LLM 生成 problem 文件。这大大降低了翻译难度。
- 错误反馈要结构化:当 PDDL 验证失败时,不要只给 LLM 一句「错了」,而要给出具体的错误类型和位置,如「Syntax error: line 15, missing closing parenthesis in :precondition」。
8.2 对系统架构师的启示
在实际系统中,混合架构最适合「需要逻辑完备性保证」的高风险场景:
- 工业机器人操作(不能撞坏设备)
- 医疗流程规划(不能跳过关键步骤)
- 航天器任务规划(燃料有限,必须最优)
对于「容错性高、创造性要求高」的任务(如写作、设计),纯 LLM 规划仍然更合适。
8.3 对研究者的启示
混合架构揭示了一个深刻的趋势:LLM 正在从「端到端求解器」退化为「接口层」——连接自然语言用户和形式化工具的生态位。未来的方向可能包括:
- 自动 Domain 生成:让 LLM 从少量示例中自动归纳出 PDDL domain 文件,而不是依赖人工模板;
- 神经-符号联合优化:用神经网络学习启发式函数,加速符号规划器的搜索;
- 多模态 PDDL:把图像、视频、传感器数据直接编码进 PDDL 的初始状态,实现「感知-规划」闭环。
9. 闭环总结:一张图带走所有知识点
让我们用最后一张图,把今天探索的所有内容收束起来:
记住这个闭环:自然语言 → LLM 翻译为 PDDL → 符号规划器求解 → 动作序列 → LLM 回译为自然语言。如果世界变了,LLM-DP 会更新 Problem 文件并重新求解。这就是混合架构的精髓。
10. 延伸阅读与参考文献
如果你想继续深入,以下是我为你精选的国外核心文献,按阅读顺序排列:
-
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. citeweb_search:5#4 —— LLM+P 的奠基论文,包含完整的 Blocksworld 实验、PDDL 翻译流程与准确率分析。
-
Dagan, G., Keller, F., & Lascarides, A. (2023). Dynamic Planning with a LLM. arXiv:2308.06391. citeweb_search:7#3 —— LLM-DP 的原始论文,包含 AlfWorld 上的 96% 成功率实验与信念状态维护机制。
-
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. citeweb_search:5#3 —— 系统性地提出 LLM-Modulo 框架,把 LLM 定位为「生成器」而非「求解器」。
-
Guan, L., Valmeekam, K., Sreedharan, S., & Kambhampati, S. (2023). LLMs as World Models: Generating PDDL Models with External Feedback. citeweb_search:5#3 —— 展示如何用外部验证器和人类反馈迭代修正 LLM 生成的 PDDL。
-
Valmeekam, K., Stechly, K., & Kambhampati, S. (2024). On the Planning Abilities of Large Language Models: A Critical Investigation. citeweb_search:7#1 —— 批判性评估 LLM 的规划能力,为混合架构的必要性提供了实证基础。
-
Zhang, Y., et al. (2024). PDDLEGO: Iterative PDDL Refinement with Sub-goal Fallback. citeweb_search:5#3 —— 提出迭代式 PDDL 修正策略,当规划失败时自动回退到子目标重新生成。
写在最后:
我们今天的旅程,从一座反复倒塌的积木塔开始,穿过纯 LLM 规划的幻觉迷雾、ReAct 的上下文膨胀沼泽,最终抵达了「神经-符号混合」这片高地。希望你已经感受到:LLM 不需要做所有事,它只需要做好「翻译」——把人类的模糊意图翻译成机器的精确语言,然后把重活累活交给那些已经跑了几十年的符号引擎。
下次当你面对一个需要「逻辑完备性保证」的规划任务时,不妨先问自己:「这个问题能被写成 PDDL 吗?如果能,就让 LLM 当翻译官,让 Fast Downward 当建筑师。」你的成功率、可解释性和用户信任度,都会大幅提升。
全文完。如有疑问,欢迎带着具体的领域描述来讨论如何为你的场景设计 PDDL 翻译 prompt。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)