cs.RO · ICRA 2023

Code as Policies

Language Model Programs for Embodied Control
Jacky Liang, Wenlong Huang, Fei Xia, Peng Xu, Karol Hausman, Brian Ichter, Pete Florence, Andy Zeng  ·  Robotics at Google

将在代码上训练的大语言模型(LLM)重新用于机器人控制:给定自然语言指令,通过少样本提示(few-shot prompting)让 LLM 自动组合 API 调用,生成可在真实机器人上执行的 Python 策略代码。无需额外训练,即可完成空间推理、泛化新指令、根据上下文精确赋值等复杂任务。

arXiv 2022 · ICRA 2023 cs.RO Robotics at Google 📄 arXiv:2209.07753 Project Page
code generation language model robot policy few-shot prompting embodied control hierarchical code generation 机器人操控 自然语言指令 Python policy LLM for robotics

01 动机

机器人需要理解自然语言指令并转化为具体行为。已有方法(如 SayCan、语义解析器)要么仅输出离散动作序列,要么需要大量标注数据训练,难以泛化到新指令。能否利用 LLM 直接生成结构化的机器人控制程序,从而利用代码的逻辑表达能力实现更强的空间推理与泛化?

"We find that language models trained on code-completion can be repurposed to write robot policy code, given natural language commands (formatted as comments) and few-shot examples of language instructions followed by corresponding code."
CaP teaser: natural language instruction converted to robot policy code
图1:Code as Policies(CaP)系统概览。用户输入自然语言指令(如"Stack the blocks on the empty bowl"),LLM 直接生成对应的 Python 策略代码,调用感知 API(如 detect_objects)和控制 API(如 pick_place)来完成任务。代码包含逻辑结构(循环、条件判断)和第三方库调用(NumPy、Shapely),可表达复杂的空间推理。
4机器人平台(tabletop、whiteboard、mobile nav、mobile manipulation)
37RoboCodeGen 评测任务数量
39.8%层次化 code-gen 在 HumanEval 上的 pass@1 提升
0额外训练样本(zero-shot 场景下)

现有方法的不足

CaP 的核心洞察是:LLM 在代码补全任务上的训练赋予了它理解和生成 Python 程序的能力,而代码天然具备表达复杂逻辑的能力——这正是自然语言所缺失的。

02 方法

Code as Policies(CaP)是一种以 LLM 为核心的机器人控制框架。在 Hints 中告知可用 API,在 Examples 中提供少量语言-代码对示范,然后让 LLM 为新的自然语言指令生成对应的策略代码,并直接在机器人上执行。

CaP prompt structure and method overview
图2:CaP 的提示结构示意。一个 LMP(Language Model Program)提示由两部分组成:(1) Hints——告知 LLM 当前可用的 Python 库和 API 类型提示(type hints);(2) Examples——若干条"自然语言注释 + 对应代码"示例对,以 few-shot 方式引导 LLM 学习任务的代码风格。推理时,LLM 根据新指令生成新代码(高亮部分),代码可递归调用未定义函数,触发层次化 code-gen。

语言模型程序(Language Model Programs, LMP)

每个 LMP 是一段由 LLM 生成的 Python 函数。LMP 的输入提示格式如下:

# Place the first blue block to the left of the red block.
import numpy as np
target_pos = get_pos('red block')
place_pos  = target_pos + np.array([-0.1, 0, 0])
put_first_on_second('blue block', place_pos)

LMP 可以调用感知 API(如 detect_objects()get_pos())获取环境状态,调用控制 API(如 pick_place()put_first_on_second())执行动作。变量命名和代码结构遵循自然语言描述,使代码本身具有可读性。

层次化代码生成(Hierarchical Code Generation)

当生成的代码引用了尚未定义的函数时,系统会递归地为该函数生成新的 LMP,直至所有函数均有实现。这一机制使 CaP 能处理更复杂的指令,同时保持每层提示的简洁性。

"LMPs can be hierarchically prompted: the prompt for a high-level function e.g. parse_obj ... generates code that calls lower-level functions e.g. get_obj_bbox_area_xy, and automatically generates implementations of those lower-level functions."

层次化结构的优点:各层 LMP 专注于自身抽象层次,提示长度可控(在模型的 context window 内),同时组合产生高层行为能力。

第三方库与空间推理

CaP 允许代码导入并使用 NumPy(数值计算)、Shapely(几何计算)等标准 Python 库,从而无需专门训练即可完成精确的空间推理,例如"在四个对象的凸包内随机游走"等复杂几何任务。

支持的策略类型

CaP robot demonstrations across four domains
图3:CaP 在四类机器人平台上的演示。(a) 桌面操作(UR5e + D435 相机):码垛、颜色/形状分组、场景描述;(b) 白板绘画:绘制几何形状、变换(旋转、缩放);(c) 移动机器人导航:路径规划、凸包路径、绕障行走;(d) 移动机器人操作:对象分类、条件检索、场景问答。所有任务均由同一 few-shot 提示框架驱动,无需任何额外训练。

03 实验

作者在三个维度上评估 CaP:(i) 新提出的 RoboCodeGen benchmark(代码生成质量);(ii) TabletopManipulation 仿真任务(与 CLIPort 等基线比较成功率);(iii) 真实机器人上的定性演示。同时分析层次化 code-gen 对代码质量的提升效果。

RoboCodeGen 基准(代码生成)

作者提出 RoboCodeGen——一个包含 37 道机器人代码生成题目的评测集(对标 HumanEval 风格),涵盖 table-top manipulation 典型任务。指标为 pass@N(N 次采样中至少一次通过单元测试的比例)。

RoboCodeGen and TabletopManipulation results tables
表I(左上):RoboCodeGen 上的代码生成 pass 率(%),GPT-{112} 与 Codex-{11} 在 flat 与 hierarchical 两种 code-gen 策略下的对比。层次化策略始终优于 flat。表II(右上):TabletopManipulation 仿真任务成功率(%),CaP 与 CLIPort 基线在 Seen/Unseen 属性及 task family 上的比较。
模型Code-gen 策略pass@6pass@11
GPT-{112}Flat8490
GPT-{112}Hierarchical8495
Codex-{11}Flat8084
Codex-{11}Hierarchical8487

Table I 节选(来自论文原文):层次化代码生成在 pass@6 和 pass@11 指标上均优于或持平于 flat 策略,表明递归函数定义有效提升了代码质量。

TabletopManipulation 仿真任务

方法Seen 属性 (%)Unseen 属性 (%)P@10 (%)
CLIPort [36]53.0N/AN/A
VILD [1]0.00N/AN/A
CaP (flat)53.039.390.9
CaP (hierarchical)53.039.495

Table II 节选(来自论文原文):CaP 在 Seen 属性上与 CLIPort 持平(53.0%),但 CLIPort 无法泛化到 Unseen 属性(需要重新训练),而 CaP 无需额外训练即可处理新属性(39.3%/39.4%)。

成功率对比(Table III)

Task FamilyCLIPort [36]P@10P@100
Long-Horizon97.2877.93N/A
Spatial-Geometric0.00N/A75.33
Long-Horizon (UA)3.58N/AN/A
Spatial-Geometric (UA)0.00N/A75.93

Table III 节选:CLIPort 在 Spatial-Geometric 任务上得 0 分(无法处理空间推理),而 CaP 通过 NumPy/Shapely 代码达到 75.33%(P@100)。Long-Horizon 任务上 CLIPort 领先(97.28% vs 77.93%),说明对于已见简单序列任务,专门训练的模型更有优势。

消融实验(HumanEval)

作者在 HumanEval benchmark 上分析了层次化代码生成的效果:将未定义函数递归分解后,pass@1 从基线提升至 39.8%,优于同规模的 flat 策略。这一结果直接支持了层次化 code-gen 的有效性假设。

"Hierarchical code generation, which incrementally generates new instructions and responses to the prompt, allows later instructions to refer back to previous instructions, like 'undo the last action'."

04 局限性

注:以下局限性来自论文 Discussion and Limitations 小节(第 VI 节)的明确表述(标注为 stated),以及从系统设计可推断的约束(标注为 inferred)。
感知 API 的局限性制约了整体能力(stated)

CaP 的上限受制于所提供的感知与控制 API 质量。论文指出:"the scope of actions a robot can perform is bounded by its available APIs and skills." 如果底层检测器无法识别某类物体,或控制 API 不支持某种操作,CaP 无法弥补这一差距。

仅评估语言-策略接口,不解决感知和运动规划难题(stated)

"This work focuses on the language-to-policy interface and does not directly address the challenges of perception and motion planning." CaP 假设可靠的感知 API(如 open-vocabulary 目标检测 VILD [1])和低层控制器已就绪,而这些本身就是活跃的研究领域。

无法处理显著超出 few-shot 示例复杂度的指令(stated)

论文在 Discussion 中指出,当指令的复杂度远超 Examples 中的示例时(例如需要构建完整的 3D 场景),CaP 难以生成正确代码。"it would be difficult for LMPs to 'build a house with the blocks,' since there are no Examples on building complex 3D structures."

代码执行前无法预判响应是否可行(inferred)

生成的代码在执行前无安全验证机制——若 LLM 生成了错误的 API 调用序列或数值(如超出机器人工作空间的位置),只有在执行时才能发现错误。这对真实机器人部署是一个安全隐患。

依赖大型闭源 LLM,推理成本高(inferred)

论文实验主要使用 GPT-3 Codex(当时为 OpenAI API 付费服务),每次指令执行都需要调用大型模型进行 code-gen。在时延和成本上对实时机器人控制存在挑战,尤其是层次化递归生成时需要多次 API 调用。