跳转至

Towards Reliable Code-as-Policies: A Neuro-Symbolic Framework for Embodied Task Planning

会议: NeurIPS 2025 (Spotlight)
arXiv: 2510.21302
代码: 无
领域: 机器人 / 具身智能
关键词: Code-as-Policies, 神经符号框架, 任务规划, LLM代码生成, 符号验证

一句话总结

提出一种神经-符号具身任务规划框架,在 LLM 代码生成过程中引入显式的符号验证(检查前置条件是否满足)和交互式验证(主动探索获取缺失信息),使生成的代码在动态和部分可观测场景中更可靠——在 RLBench 上任务成功率从基线 38.5% 提升到 84.7%,可执行性达 86.8%。

研究背景与动机

领域现状:LLM 自动生成可执行代码(Code-as-Policies, CaP)已成为机器人任务规划的主流范式。LLM 接收自然语言任务描述和环境 API,直接生成 Python 代码来控制机器人。这种方法的优势在于 LLM 的强大推理和代码生成能力,无需为每个任务手动编写策略。

现有痛点:CaP 方法存在严重的环境接地不足(grounding failure)问题,特别是在动态或部分可观测场景中。具体表现为三类失败:(1)LLM 基于不完整的环境观测生成代码,可能引用不存在的物体或错误的位置;(2)生成的代码可能包含逻辑错误——例如先放盖子再倒水;(3)代码中的动作序列缺乏对环境状态变化的感知——执行过程中物体可能被移动或遮挡。

核心矛盾:LLM 的"世界知识"是通用的,但机器人执行需要精确的环境特定信息。标准 CaP 方法一次性生成全部代码,没有机制去验证生成的计划是否与当前环境一致,也没有能力在信息不足时主动获取缺失观测。更严重的是,探索性动作如果不加约束,可能破坏已有的任务进展(如打翻已放好的物体)。

本文目标 如何在保持 LLM 代码生成灵活性的同时,确保生成代码的环境一致性和执行可靠性?具体拆解为:(1)如何检测代码中哪些假设不成立?(2)如何安全地获取缺失信息?(3)如何在不破坏任务状态的前提下探索环境?

切入角度:引入符号推理作为 LLM 代码生成的"保护栏"。在代码执行前用符号方法形式化检查前置条件和后置条件,不满足时触发交互式探索而非直接执行。考察是在生成阶段而非执行阶段介入,做到"先验证再行动"。

核心 idea:在 LLM 代码生成中加入符号化的"先看再做"机制——用形式化前置条件检查暴露信息缺口,用有状态保持约束的探索性代码安全填补缺口。

方法详解

整体框架

框架将 LLM 代码生成过程从"一次生成→执行"改造为"生成→符号验证→探索→修正→执行"的迭代流程。输入为自然语言任务描述和环境 API。LLM 先生成初始代码方案,然后进入验证循环:符号验证器检查每个动作的前置条件是否满足,不满足时的触发交互式验证——生成探索性代码与环境交互获取缺失观测,同时保持任务相关状态不变。获取新信息后,LLM 修正代码并重新验证,直到所有前置条件满足。

关键设计

  1. 符号前置条件验证器(Symbolic Precondition Verifier):

    • 功能:对 LLM 生成的代码中每个动作进行形式化前置条件检查
    • 核心思路:将机器人动作(如 pick、place、pour)的前置条件表示为逻辑谓词——例如 pick(obj) 要求 is_reachable(obj) ∧ is_graspable(obj) ∧ ¬is_held(any)。验证器将当前环境观测形式化为逻辑状态,逐一检查代码中每个动作的前置条件是否被当前状态满足。不满足的前置条件被标记为需要通过探索获取的信息缺口
    • 设计动机:LLM 擅长高层推理但对底层物理约束不敏感。符号验证提供了一层确定性的"安全网"——即使 LLM 犯错(如忽略物体被遮挡),符号检查器也能在执行前捕获错误。这比依赖 LLM 自检(如 reflexion)更可靠
  2. 交互式探索代码生成(Interactive Exploratory Code Generation):

    • 功能:当前置条件不满足时,生成安全的探索性代码来获取缺失信息
    • 核心思路:将不满足的前置条件作为"信息需求"反馈给 LLM,LLM 生成探索性代码——例如"移动到桌子右侧观察被遮挡的物体"或"打开抽屉检查内容物"。关键约束是探索代码必须通过状态保持验证后才能执行:探索不能改变任务相关的物体状态(如不能打翻已放好的杯子)
    • 设计动机:与简单的重试或反思不同,交互式探索主动与环境交互来获取信息,从而解决部分可观测性问题。这是将主动感知(active perception)的思想引入 CaP 框架
  3. 状态保持约束(State Preservation Constraint):

    • 功能:确保探索性动作不破坏已有的任务进展
    • 核心思路:定义一组不变量(invariants)描述当前任务已达成的中间状态——例如"杯子在桌面上且正立"。用符号推理验证探索代码执行后是否保持所有不变量。违反不变量的探索动作被拒绝,LLM 被要求重新生成更安全的探索方案
    • 设计动机:无约束的探索可能造成灾难——机器人为了看清某个物体而不小心碰倒其他物体。在真实机器人场景中,这种失败是不可逆的。状态保持约束是安全探索的核心保障

训练策略

框架完全基于 prompt engineering,不需要额外训练。核心流程通过精心设计的提示模板实现:(1)任务描述 + 环境 API → LLM 输出初始代码;(2)符号验证反馈 → LLM 输出修正代码或探索代码;(3)探索结果 → LLM 输出最终代码。整个过程对 LLM 后端透明,可使用 GPT-4、GPT-3.5 等不同模型。

实验关键数据

主实验(RLBench 仿真环境)

在包含动态和部分可观测场景的 RLBench 任务上评估。

方法 任务成功率(%)↑ 可执行性(%)↑
Code-as-Policies 38.5 52.3
SayCan 42.1 61.8
ProgPrompt 45.3 63.5
Inner Monologue 51.2 68.4
VoxPoser 48.7 65.2
本文框架 84.7 86.8

相比 CaP 基线提升 46.2%(绝对值),可执行性提升 34.5%。相比最强基线 Inner Monologue 也有 33.5% 的绝对提升。

消融实验

组件 任务成功率(%) ΔSR 说明
完整框架 84.7 所有组件启用
去掉符号验证 62.3 -22.4 无法捕获前置条件违反
去掉交互式验证 68.1 -16.6 无法获取缺失观测
去掉状态保持约束 73.5 -11.2 探索可能破坏任务状态
仅单次生成(无迭代) 45.8 -38.9 退化为普通 CaP
GPT-4 → GPT-3.5 71.2 -13.5 LLM 能力影响上限

关键发现

  • 三个组件缺一不可:符号验证(-22.4%)和交互式验证(-16.6%)分别贡献最大。去掉任何一个后框架退化为常规 CaP 的变体。状态保持约束的 -11.2% 说明安全探索不是可选的。
  • 部分可观测场景提升最显著:在动态场景中成功率从基线的约 25% 提升至 78%——说明主动探索机制对信息不完整的场景有决定性价值。
  • LLM 后端影响显著但非决定性:GPT-3.5 比 GPT-4 低 13.5%,但仍远超所有基线(71.2% vs 最强基线 51.2%)。说明框架的结构性设计比 LLM 能力更重要。
  • 真实机器人验证:在真实机器人上也成功验证了框架的有效性,证明不仅是仿真环境的人工优势。

亮点与洞察

  • 神经-符号结合的典范:LLM 提供灵活的推理和代码生成能力,符号验证提供确定性的正确性保障。两者的结合避免了"纯神经方法不可靠"和"纯符号方法不灵活"的各自短板。将该思路概括为"LLM 生成 + 符号验证"的设计模式,可迁移到代码安全审计、自动化测试等领域。
  • "先看再做"的形式化:从直觉上讲"先观察再行动"是常识,但本文将其形式化为前置条件检查→信息需求识别→安全探索→代码修正的完整流程,并用状态保持约束保证安全性。这种形式化使直觉变成了可工程化的方法。
  • 无需训练的即插即用框架:完全基于 prompt engineering,不需要额外训练数据或微调。对于需要快速部署到新场景的应用极为友好。这也意味着框架会随着 LLM 能力的提升而自动增强。
  • 可执行性指标的重要性:论文引入了"可执行性"作为除成功率之外的评估维度——即使任务未完全成功,生成的代码至少应该是可执行的。86.8% 的可执行性意味着绝大多数生成代码不会在执行时崩溃,这对真实部署至关重要。

局限与展望

  • 探索增加延迟:交互式探索需要额外的观测和代码生成轮次,增加了任务完成时间。在实时性要求高的场景(如快速抓取、紧急避障)中可能不适用。可探索选择性探索——仅对高不确定性的动作触发探索。
  • 预定义环境 API 的依赖:符号验证器需要预定义每个动作的前置条件和后置条件,以及环境的状态空间描述。对新环境的适配需要人工定义这些规范。可探索让 LLM 自动从 API 文档推断前置条件。
  • 不变量定义的完备性:状态保持约束依赖手动定义的不变量。在复杂场景中可能遗漏关键约束——例如某些物理交互是非直觉的(碰到桌角导致远处物体滑落)。从物理仿真中自动学习不变量是有价值的方向。
  • 对 LLM 代码质量的强依赖:虽然符号验证可以捕获前置条件错误,但无法检测代码中的逻辑错误(如循环控制错误、错误的数学计算)。将程序分析(如抽象解释)与符号验证结合可能更全面。
  • 仅验证前置条件:当前只检查动作执行前的条件是否满足,未验证执行后的后置条件。加入后置条件检查可以实现运行时监控和失败恢复。

相关工作与启发

  • vs Code-as-Policies (Liang et al., 2023): 本文的直接改进对象。CaP 一次性生成代码并执行,没有验证机制。本文在代码生成和执行之间插入了验证-探索-修正循环,核心区别在于将"盲目信任 LLM"变为"验证后再信任"。
  • vs Inner Monologue (Huang et al., 2022): Inner Monologue 通过环境反馈迭代修正生成,但反馈来自执行结果(事后纠正)。本文的符号验证是事前检查——在执行前发现问题,避免不可逆的执行失败。
  • vs SayCan (Ahn et al., 2022): SayCan 用可行性打分来约束 LLM 输出——本质上是学习的"软"约束。本文用符号验证提供"硬"约束——前置条件不满足就不执行,可靠性更高但灵活性较低。
  • vs 经典 STRIPS 规划: 传统任务规划完全用符号方法,灵活性差。本文保留了 LLM 的灵活代码生成能力,仅在关键检查点引入符号验证,是"最小化符号化"的设计哲学。

评分

  • 新颖性: ⭐⭐⭐⭐ 神经-符号结合在 CaP 中的应用是新颖的,特别是状态保持约束下的安全探索机制
  • 实验充分度: ⭐⭐⭐⭐⭐ RLBench + 真实机器人、完整消融、多 LLM 后端对比,非常全面
  • 写作质量: ⭐⭐⭐⭐ 问题定义清晰,方法描述逻辑流畅,Spotlight 论文品质
  • 价值: ⭐⭐⭐⭐⭐ 对 LLM 驱动的机器人系统可靠性有直接贡献,"验证后再行动"的设计模式可广泛复用