地址:Code as Policies: Language Model Programs for Embodied Control
摘要
針對代碼補全任務訓練的大型語言模型(LLMs)已被證實能夠從文檔字符串(docstrings)中合成簡單的 Python 程序。研究發現,這些具備代碼編寫能力的 LLM 可被重新賦能,在給定自然語言指令的情況下生成機器人策略代碼。具體而言,策略代碼能夠表示處理感知輸出(例如來自目標檢測器的輸出)并對控制原語 API 進行參數化的函數或反饋循環。當向 LLM 輸入若干個以注釋格式呈現的自然語言指令示例及其對應的策略代碼(通過少樣本提示實現)后,LLM 可接收新的指令并自主重組 API 調用,分別生成新的策略代碼。通過鏈接經典邏輯結構并引用第三方庫(如 NumPy、Shapely)執行算術運算,此類用法下的 LLM 能夠生成具備以下能力的機器人策略:(i)展現空間幾何推理;(ii)泛化到新指令;(iii)根據上下文(即行為常識)為模糊描述(如 “更快”)指定精確值(如速度)。本文提出 “代碼即策略(Code as Policies, CaP)”:一種以機器人為中心的語言模型生成程序(Language Model Programs, LMPs)形式化方案,該方案可表示反應式策略(如阻抗控制器)以及基于路徑點的策略(視覺引導的拾取放置、基于軌跡的控制),并在多個真實機器人平臺上完成驗證。該方法的核心是 “提示分層代碼生成(prompting hierarchical code-gen)”—— 遞歸定義未定義函數,這不僅能生成更復雜的代碼,還能將 HumanEval基準測試的問題解決率提升至 39.8%(當前最優水平)。相關代碼與視頻可在https://code-as-policies.github.io獲取。
一、概述
1. 研究背景與問題
機器人需將自然語言 “接地(grounded)” 到物理世界,以建立語言、感知與動作的關聯。傳統方法存在兩大局限:
- 經典方法(如詞匯分析提取語義表示)難以處理未見過的指令;
- 端到端學習方法(語言直接映射到動作)需大量真實機器人訓練數據,成本高昂。
現有 LLM 在機器人領域的應用僅局限于 “規劃技能序列”,無法直接參與感知 - 動作反饋循環,導致難以實現:①感知 - 動作模式的泛化(如從 “把蘋果放在橙子上” 到 “看到橙子就放下蘋果”);②控制常識的表達(如 “更快移動”“更用力推”);③空間關系理解(如 “把蘋果往左移一點”)。
2. 核心方法:代碼即策略(CaP)
將具備代碼生成能力的 LLM(如 Codex)重新賦能,通過少樣本提示生成機器人策略代碼(即 LMPs),直接作為可執行的機器人策略。LMPs 通過以下方式實現感知 - 控制閉環:
- 輸入:自然語言指令(格式化為代碼注釋);
- 生成:調用感知 API(如目標檢測、位置獲取)和控制原語 API(如速度設置、拾取放置)的 Python 代碼;
- 關鍵創新:分層代碼生成—— 遞歸定義未定義函數,逐步積累函數庫,提升代碼復雜度與泛化能力。
3. 核心貢獻
- 提出 “代碼即策略(CaP)” 方案:將 LLM 生成的代碼直接作為機器人策略,實現語言 - 感知 - 動作的深度關聯;
- 分層代碼生成方法:在機器人代碼生成與通用代碼生成(HumanEval)中均突破當前最優,HumanEval 的 P@1 達 39.8%;
- 構建機器人專屬代碼生成基準(RoboCodeGen):包含空間推理、幾何推理、控制等 37 個任務,用于評估 LLM 在機器人領域的代碼生成能力;
- 驗證泛化能力與縮放定律:CaP 在未見過的指令 / 目標上表現優異,且 LLM 模型規模越大,性能越好。
4. 實驗結果
實驗場景 | 關鍵結論 |
---|---|
代碼生成基準(RoboCodeGen) | 分層方法在各模型上均優于扁平方法,Codex davinci 模型分層方法通過率達 95%; |
通用代碼基準(HumanEval) | 分層方法 P@1 達 39.8%,優于扁平方法(34.9%)及現有工作 [1,11,58]; |
真實機器人驗證(UR5e、移動機器人) | 完成桌面操作、白板繪圖、廚房移動操作,支持空間推理(如 “畫更小的金字塔”)與長序列任務; |
仿真桌面操作對比 | 面對未見過的屬性 / 指令,CaP 成功率(62%-97.6%)顯著優于 CLIPort(0%-36.8%)與自然語言規劃器(64%-88%); |
5. 局限性
- 依賴感知 API 與控制原語:無法處理感知 API 無法描述的屬性(如軌跡 “顛簸”)或未定義的控制原語;
- 指令復雜度限制:難以處理遠超示例抽象層級或長度的指令(如 “用積木建房子”);
- 可行性假設:默認指令可執行,無法預先判斷生成代碼的正確性;
- 跨具身魯棒性不足:雖能適配不同機器人 API,但對差異過大的 API 適配能力較弱。
二、研究動機
1. 傳統語言 - 機器人控制方法的 “泛化能力不足” 問題
傳統機器人語言控制方法分為兩類,均存在泛化短板:
- 經典語義解析方法(如詞匯分析提取語義表示 [5]-[7]):需預先定義語言與動作的映射規則,無法處理未見過的指令(如未訓練 “將積木排成對角線”,則無法執行該指令);
- 端到端學習方法(語言直接映射到動作 [8]-[10]):需在真實機器人上收集大量訓練數據(如數萬次 “拾取 - 放置” 演示),數據獲取成本極高,且跨場景泛化能力弱(如桌面操作模型無法遷移到移動導航)。
論文通過 “代碼即策略(CaP)” 方案,利用 LLM 的少樣本泛化能力,僅需少量指令 - 代碼示例即可生成新任務策略,無需額外訓練數據,解決泛化與數據成本的矛盾。
2. 現有 LLM 機器人應用的 “感知 - 動作閉環缺失” 問題
現有 LLM 在機器人領域的應用僅局限于 “高層級技能序列規劃”(如 “拿起蘋果→移動到桌子→放下”[14],[17],[18]),無法直接參與感知 - 動作反饋循環,導致三大關鍵需求無法滿足:
- 感知 - 動作模式泛化:無法從 “靜態指令”(如 “把蘋果放在橙子上”)擴展到 “動態反饋指令”(如 “看到橙子就放下蘋果”);
- 控制常識表達:無法為模糊自然語言描述(如 “更快移動”“更用力推”)分配精確控制參數(如速度值、力值);
- 空間幾何推理:無法處理需數值計算的空間指令(如 “將積木排成 20cm 長的豎直線”“在金字塔左側畫更小的金字塔”)。
論文通過讓 LLM 生成直接調用感知 API(如目標檢測、位置獲取)與控制 API(如速度設置、拾取放置)的代碼,構建語言 - 感知 - 動作的直接閉環,解決上述需求。
3. 機器人策略的 “可解釋性與靈活性不足” 問題
傳統機器人策略(如端到端神經網絡、預定義技能庫)存在兩大缺陷:
- 可解釋性差:端到端模型的決策過程黑箱化,難以調試(如 “為何未將蘋果放入碗中” 無法追溯原因);
- 靈活性低:預定義技能庫需覆蓋所有可能動作(如 “左移 1cm”“左移 2cm” 需分別定義),無法動態調整邏輯(如 “直到看到蘋果才停止移動” 需額外開發反饋邏輯)。
論文以 “代碼” 作為機器人策略載體,代碼邏輯透明可追溯(可解釋性),且通過循環、條件等邏輯結構實現動態反饋(靈活性),解決上述缺陷。
三、方法架構
1. 設計方法:LMPs 的生成與執行框架
CaP 的核心是 “語言模型程序(LMPs)”—— 由 LLM 生成、可在機器人上直接執行的代碼,其生成與執行分為 3 個關鍵步驟:
(1)提示工程:構建 LMP 生成的輸入
提示(Prompt)包含兩類核心元素,確保 LLM 理解 API 用法與指令 - 代碼映射規則:
- 提示語(Hints):告知 LLM 可用 API 與類型提示,如導入第三方庫(NumPy、Shapely)或機器人專屬 API(
get_pos
、put_first_on_second
); 示例:import numpy as np; from utils import get_pos, put_first_on_second
- 示例(Examples):指令 - 代碼對的少樣本演示,格式為 “自然語言注釋 + 對應代碼”,讓 LLM 學習映射邏輯; 示例:
# 把紫色碗往左移;target_pos = get_pos('purple bowl') + [-0.3, 0]; put_first_on_second('purple bowl', target_pos)
(2)分層代碼生成:提升代碼復雜度與泛化
通過 “遞歸定義未定義函數” 實現分層生成,核心流程:
- 高層 LMP 生成調用未定義函數的代碼(如
stack_objs_in_order(obj_names)
); - 解析抽象語法樹(AST),識別未定義函數;
- 調用專用 LMP 生成未定義函數的實現(如
def stack_objs_in_order(obj_names): ...
); - 深度優先遞歸執行上述步驟,直至所有函數均定義,形成完整代碼庫。
該方法本質是 “函數式編程風格的思維鏈(Chain of Thought)”,既降低單步代碼生成復雜度,又支持代碼復用。
(3)LMP 執行:安全檢查與作用域管理
為確保機器人執行安全,LMP 執行前需經過兩步處理:
- 安全檢查:禁止包含
import
、__
開頭的特殊變量、exec
/eval
調用,避免惡意代碼或環境污染; - 作用域管理:通過兩個字典定義執行作用域:
globals
:存儲所有可用 API(感知、控制);locals
:空字典,執行中動態存儲生成的變量與函數;
- 執行:調用 Python 的
exec
函數執行 LMP 代碼,若需返回值則從locals
中提取。
2. 設計內容:LMPs 的核心組成與層級示例
LMPs 通過 “邏輯結構 + 庫調用 + 分層設計” 實現復雜機器人任務,分為低層級與高層級兩類:
(1)低層級 LMP:基礎功能實現
聚焦 “感知輸出處理” 與 “控制原語參數化”,依賴第三方庫與基礎 API:
- 算術與坐標計算:基于 NumPy 處理空間坐標,如計算中心點、最左點; 示例:中心點計算?
ret_val = np.mean(pts_np, axis=0)
;最左點計算?ret_val = pts_np[np.argmin(pts_np[:, 0]), :]
- 語言推理:關聯自然語言描述與目標(如 “海藍色積木”→“藍色積木”); 示例:
# 海藍色積木;ret_val = 'blue block'
- 一階 API 調用:直接調用機器人感知 / 控制 API,如移動指定目標; 示例:
# 把紅色積木往右移一點;target_pos = get_pos('red block') + [0.1, 0]; put_first_on_second('red block', target_pos)
(2)高層級 LMP:復雜行為與控制流
通過控制結構(循環、條件)與函數嵌套,實現反應式策略與長序列任務:
- 控制流(循環 / 條件):構建反饋策略,如 “直到看到蘋果才停止右移”; 示例:
while not detect_object("apple"): robot.set_velocity(x=0, y=0.1, z=0)
- 函數嵌套:調用其他 LMP(如
parse_obj
)解析復雜語言描述,如 “最左側的積木”; 示例:block_name = parse_obj('the left most block'); while block_name == 'red block': ...
- 反應式控制器:生成 PD 控制、阻抗控制等低層級控制器,如倒立擺平衡; 示例:PD 控制函數生成
(3)LMP 的核心特性
特性 | 描述 |
---|---|
感知 - 控制接地 | 直接調用感知 API(如 MDETR/ViLD 目標檢測)與控制 API,建立語言到物理世界的映射; |
常識嵌入 | 基于 LLM 訓練數據中的代碼與注釋,為模糊描述(如 “更快”)分配精確值(如速度 - 0.2); |
人機交互能力 | 通過robot.say(text) ?API 實現對話與問答(如 “解釋為何停止移動”); |
跨平臺適配 | 僅需替換感知 / 控制 API,即可適配 UR5e 機械臂、Everyday Robots 移動機器人等; |
3. 設計原理:為何 “代碼即策略” 可行?
(1)LLM 代碼生成能力的遷移性
代碼補全 LLM(如 Codex)在數十億行代碼與注釋上訓練,具備:
- 理解自然語言與代碼的映射關系(從注釋生成代碼);
- 掌握 Python 語法、第三方庫(NumPy/Shapely)用法,可直接用于空間幾何推理;
- 少樣本學習能力:通過少量指令 - 代碼示例,泛化到新任務。
(2)“代碼” 作為策略的天然優勢
相比傳統機器人策略(如端到端模型、預定義技能庫),代碼策略具備:
- 可解釋性:代碼邏輯透明,便于調試與修改;
- 靈活性:通過邏輯結構(循環、條件)實現動態反饋,無需預定義所有技能;
- 精確性:支持數值計算(如 “20cm 長的豎直線”),解決自然語言規劃器的模糊性問題。
(3)分層代碼生成的性能提升原理
- 復雜度分解:將復雜任務(如 “堆疊積木到空碗”)拆解為子函數(
is_empty
、stack_objects
),降低單步生成難度; - 知識積累:生成的函數可被后續 LMP 引用,逐步構建專屬函數庫,提升長任務處理能力;
- 符合 LLM 輸入長度限制:分層生成避免單條提示過長,適配 LLM 的 token 長度約束。
四、數據集
1. LMP 生成依賴的 LLM 預訓練數據集
本文用于生成機器人策略代碼(LMPs)的大語言模型(LLM)均為復用現有預訓練模型,未自行構建預訓練數據集,模型及對應預訓練數據來源如下:
- OpenAI Codex(code-davinci-002、code-cushman):預訓練數據為互聯網規模的代碼庫與自然語言文本,包含數十億行 Python 代碼、注釋及文檔字符串,覆蓋第三方庫(如 NumPy、Shapely)用法、編程邏輯(循環、條件控制)等,具備從自然語言注釋生成代碼的能力 [1];
- GPT-3(6.7B 參數)與 InstructGPT(175B 參數):預訓練數據為互聯網文本(含部分代碼),用于對比不同模型規模對代碼生成性能的影響 [12,22];
- PaLM Coder:預訓練數據包含大規模代碼與文本,用于 HumanEval 基準對比 [11]。
上述預訓練數據集均為模型原有訓練數據,本文未對其進行額外補充或修改,僅通過 “提示工程(Prompt Engineering)” 引導模型生成機器人相關代碼。
2. 實驗驗證數據集
本文實驗分為代碼生成基準測試與機器人任務驗證,兩類實驗的數據集來源不同,具體如下:
(1)代碼生成基準數據集
用于評估 LMPs 的代碼生成性能,包含兩個公開基準與一個自定義基準:
- HumanEval [1]:公開通用代碼生成基準,包含 164 個 Python 函數生成任務,覆蓋字符串處理、數組操作、數學計算等通用場景,用于驗證分層代碼生成方法在通用代碼任務上的性能;
- RoboCodeGen(自定義):本文構建的機器人專屬代碼生成基準,包含 37 個函數生成任務,聚焦機器人領域核心需求,具體任務類型及數據來源如下:
- 空間推理任務:如 “計算點集中最近點”“生成兩點間插值點”,基于機器人操作中的坐標計算需求設計;
- 幾何推理任務:如 “判斷一個邊界框是否包含另一個”“生成指定半徑的圓形”,依賴 Shapely 庫與目標檢測邊界框(bbox)處理邏輯設計;
- 控制任務:如 “PD 控制器實現”“末端阻抗控制函數生成”,基于機器人低層級控制算法設計;
- 數據特點:無顯式文檔字符串或類型提示,要求 LLM 通過函數名與任務描述推斷邏輯,支持調用未定義函數(分層生成)與第三方庫(NumPy/Shapely)。
(2)機器人任務驗證數據集
用于在真實 / 仿真機器人上驗證 CaP 的有效性,數據集均為自定義場景配置,無公開數據集依賴,具體如下:
- 桌面操作場景(真實 + 仿真):
- 物體集:10 個彩色積木(紅、藍、綠等)+10 個彩色碗(對應顏色),物體屬性(顏色、位置)隨機采樣;
- 任務集:分為 “長序列任務”(如 “將積木放入匹配顏色的碗”)與 “空間幾何任務”(如 “將積木排成 20cm 長的豎直線”),任務指令模板及屬性(如 “<block>”“<direction>”)分為 “已見(Seen)” 與 “未見(Unseen)”,用于測試泛化能力;
- 數據來源:仿真環境復用 [16,18] 的 UR5e 機械臂 + Robotiq 2F85 夾爪仿真場景,真實環境基于 UR5e 機械臂 + Intel Realsense D435 深度相機搭建,物體位置通過 MDETR [2](真實)/ 腳本化檢測器(仿真)獲取。
- 白板繪圖場景(真實):
- 場景配置:UR5e 機械臂 + 白板 + 干擦筆,額外物體(如藍色積木)用于參考定位;
- 任務集:自定義繪圖指令(如 “畫 5cm 六邊形”“在金字塔左側畫更小的金字塔”), Waypoint 坐標通過 LMPs 調用 NumPy 計算生成。
- 移動操作場景(真實):
- 場景配置:Everyday Robots 移動機器人(帶 7DoF 機械臂)+ 辦公室廚房環境,物體(水瓶、可樂罐、水果)隨機放置;
- 任務集:導航任務(如 “繞辦公椅走 3m×2m 矩形”)與操作任務(如 “將可樂罐放入回收箱”),物體位置通過 ViLD [3] 目標檢測獲取,導航坐標基于機器人自身定位系統。
五、實驗設計
1. 代碼生成基準實驗對照組(RoboCodeGen + HumanEval)
(1)模型規模對照組
用于驗證 “縮放定律(larger models perform better)”,即 LLM 模型規模對代碼生成性能的影響,選擇 4 個不同規模 / 類型的 LLM:
- GPT-3(6.7B 參數):純文本 LLM,代碼生成能力較弱,作為基礎對照;
- InstructGPT(175B 參數):大參數量文本 LLM,具備更好的語言理解能力;
- Codex cushman:小型代碼專用 LLM,訓練數據以代碼為主;
- Codex davinci:大型代碼專用 LLM(規模大于 cushman),代碼生成能力最優 [1];
- 控制變量:均采用 “扁平代碼生成(Flat)” 或 “分層代碼生成(Hierarchical)” 方法,提示結構一致。
(2)代碼生成方法對照組
用于驗證 “分層代碼生成” 的優勢,針對同一 LLM(如 Codex davinci)設置兩種方法:
- 扁平代碼生成(Flat):禁止調用未定義函數,要求 LLM 一次性生成完整代碼,無分層拆解;
- 分層代碼生成(Hierarchical,CaP 核心):允許調用未定義函數,通過遞歸提示生成子函數,逐步構建完整代碼;
- 控制變量:模型參數、提示中的示例數量 / 格式、任務輸入一致。
(3)通用代碼生成基準對照組
在 HumanEval 基準中,對比 CaP 與現有代碼生成方法的性能:
- code-davinci-001 [11]:早期 Codex 模型,無分層生成能力;
- PaLM Coder [11]:Google 大參數量代碼 LLM;
- Flat CodeGen + No Prompt:直接使用 Codex davinci 生成代碼,無額外提示;
- Flat CodeGen + Flat Prompt:使用扁平提示(含 2 個示例)生成代碼,無分層邏輯;
- 控制變量:HumanEval 任務集一致,評估指標(通過率)計算方式相同。
2. 機器人任務實驗對照組(仿真 + 真實)
(1)仿真桌面操作對照組
用于驗證 CaP 在結構化任務中的泛化能力,選擇 2 類主流機器人控制方法:
- CLIPort [36]:語言條件下的端到端模仿學習方法,需 30k 條演示數據訓練,分為兩個子對照:
- CLIPort(oracle termination):使用仿真環境 “先知信息”,任務完成時自動停止策略執行(優化性能上限);
- CLIPort(no oracle):無先知信息,固定執行 10 步動作后評估(模擬真實場景);
- NL Planner(自然語言規劃器):基于 LLM 的任務規劃方法,僅輸出 “技能序列”(如 “拿起可樂罐→右移→放下”),依賴預定義技能庫 [14,17,18];
- 控制變量:仿真環境(UR5e 機械臂 + 10 積木 + 10 碗)、任務指令模板、物體初始位置采樣方式一致。
(2)真實機器人任務
- 任務設計:包含 “已見指令 / 屬性”(如 “將積木放入匹配顏色的碗”)與 “未見指令 / 屬性”(如 “將積木放入不匹配顏色的碗”);
- 驗證邏輯:若 CaP 在未見任務上的成功率顯著高于 “需預訓練的 CLIPort” 與 “依賴預定義技能的 NL Planner”,則證明其泛化優勢;
- 控制變量:真實機器人硬件(UR5e、Everyday Robots)、感知 API(MDETR/ViLD)、控制原語 API 一致。
3. 空間幾何推理對照組(Code vs. 自然語言)
用于驗證 “代碼推理” 相比 “自然語言推理” 的精確性優勢,設計 2 類自然語言推理方法:
- Vanilla NL(純自然語言推理):直接輸入場景描述(如物體位置列表)與問題,LLM 輸出自然語言答案(如 “紅色積木”);
- Chain of Thought(CoT)[47]:提示 LLM 分步推理(如 “先列出所有積木的 y 坐標→找出 y 最大的積木”),輸出自然語言推理過程與答案;
- 控制變量:推理任務集(28 個物體選擇任務 + 23 個位置選擇任務)、場景上下文(物體位置、屬性)一致,均使用 Codex davinci 模型。
六、評價指標
1. 代碼生成基準指標(RoboCodeGen + HumanEval)
(1)通過率(% Pass Rate)
- 定義:通過單元測試的任務數占總任務數的百分比,核心指標,反映代碼生成的正確性;
- 示例:HumanEval 中,CaP 分層方法的 Greedy 通過率為 53.0%,P@1 為 39.8%[]。
(2)泛化類型通過率(基于 [23] 的 5 類泛化)
- 定義:評估代碼生成在不同泛化場景下的性能,細分 5 類泛化:
- Systematicity(系統性):重組示例中的代碼片段(如 “將‘左移’邏輯重組為‘右移’”);
- Productivity(擴展性):生成比示例更長 / 邏輯層級更多的代碼(如 “從‘2 個積木堆疊’到‘5 個積木堆疊’”);
- Substitutivity(替代性):替換示例中的同義詞 / 同類詞(如 “‘碗’替換為‘容器’”);
- Localism(局部性):將示例中的局部概念用于新場景(如 “將‘計算中心點’用于‘計算邊界框中心’”);
- Overgeneralization(過度泛化):使用示例中未出現的 API / 語法(如 “示例用 NumPy,生成用 Shapely”);
- 計算方式:對每類泛化場景,單獨統計通過率,分析分層方法的優勢領域(如 Productivity 提升最顯著 [])。
2. 機器人任務評價指標
(1)任務成功率(Task Success Rate)
- 定義:完成指定任務的實驗次數占總實驗次數的百分比,核心指標;
- 任務完成條件(細分場景):
- 桌面操作:物體最終位置滿足指令要求(如 “積木放入碗中” 則積木中心與碗中心距離 < 2cm);
- 繪圖任務:生成形狀與指令偏差 <1cm(如 “5cm 六邊形” 的邊長偏差 < 0.5cm);
- 移動任務:導航軌跡與指令路徑偏差 < 0.3m,操作任務中物體成功放置到目標位置;
- 示例:仿真中 “UA-UI 空間幾何任務”,CaP 成功率為 62.0%,而 CLIPort 僅為 0.01%[]。
(2)泛化能力指標(未見任務 / 屬性成功率)
- 定義:在 “未見指令” 或 “未見屬性” 任務上的成功率,反映 CaP 的泛化優勢;
- 計算方式:分別統計 “SA-SI”“UA-SI”“UA-UI” 三類任務的成功率,對比 CaP 與對照組(如 CLIPort 在 UA-SI 長序列任務中成功率 36.8%,CaP 達 97.6%[])。
3. 空間幾何推理評價指標
(1)推理正確率(Reasoning Accuracy)
- 定義:正確完成推理任務的數量占總任務數的百分比;
- 細分維度:
- 物體選擇正確率:如 “找出離藍色碗最近的積木”,答案與標注一致則正確;
- 位置選擇正確率:如 “插值 3 個點”,所有點坐標與真值誤差 < 1cm 則正確;
- 示例:位置選擇任務中,LMP 正確率 100%,CoT 為 48%,Vanilla NL 為 30%。
(2)位置誤差(Position Error)
- 定義:僅用于位置選擇任務,量化推理結果的精確性;
- 評價標準:誤差 <1cm 視為正確,統計平均誤差與最大誤差(LMP 平均誤差 < 0.5cm,自然語言推理平均誤差> 3cm )。
七、創新點分析
1. 方法創新:提出 “代碼即策略(Code as Policies, CaP)” 的形式化方案
(1)核心思想:將 LLM 生成的代碼直接作為可執行的機器人策略
突破 “LLM 僅用于規劃” 的傳統定位,將具備代碼生成能力的 LLM(如 Codex)重新賦能為 “機器人策略生成器”:
- 輸入:自然語言指令(格式化為 Python 注釋,如
# 把紅色積木往左移5cm
); - 輸出:可直接執行的 Python 代碼(即 LMPs,Language Model Programs),代碼中調用:
- 感知 API:如
get_pos(obj_name)
(獲取物體位置,基于 MDETR [2]/ViLD [3] 目標檢測)、detect_object(obj_name)
(檢測物體是否存在); - 控制 API:如
put_first_on_second(obj1, obj2)
(拾取 obj1 并放置到 obj2)、robot.set_velocity(x, y, z)
(設置機器人速度);
- 感知 API:如
- 優勢:無需預定義技能庫,代碼邏輯直接關聯語言、感知與動作,實現 “語言指令→代碼策略→機器人動作” 的端到端閉環。
(2)策略表示能力:覆蓋反應式與路徑點兩類核心機器人策略
CaP 生成的 LMPs 可靈活表示機器人領域兩類關鍵策略,無需修改框架:
-
反應式策略:通過循環、條件控制實現實時反饋,如 PD 控制器、阻抗控制器,示例為倒立擺平衡的 PD 控制函數:
def keep_pole_upright_with_pd_control(x, x_dot, theta, theta_dot):kp = 1 # 比例增益kd = 1 # 微分增益error = theta # 擺桿角度誤差error_dot = theta_dot # 擺桿角速度誤差control = kp * error + kd * error_dot # PD控制量計算direction = 1 if control >= 0 else 0 # 1=右移,0=左移return direction
-
基于路徑點的策略:通過第三方庫(NumPy/Shapely)計算空間坐標,生成路徑點序列,如白板繪圖的 Waypoint 生成:
import numpy as np # 生成5cm六邊形的Waypoint def generate_hexagon_pts(center, radius):angles = np.linspace(0, 2*np.pi, 6, endpoint=False) # 6個頂點角度x = center[0] + radius * np.cos(angles)y = center[1] + radius * np.sin(angles)return np.column_stack((x, y)) # 輸出6個頂點坐標
2. 技術創新:提出 “分層代碼生成(Hierarchical Code-Gen)” 方法
(1)核心邏輯:遞歸定義未定義函數,突破代碼生成復雜度限制
針對 “復雜任務難以一次性生成完整代碼” 的問題,設計分層生成流程:
- 高層代碼生成:輸入任務指令,生成調用 “未定義函數” 的框架代碼,如 “堆疊積木到空碗” 的高層代碼:
# 堆疊積木到空碗 empty_bowl = find_empty_bowl(bowl_names) # 未定義函數 stack_objs([empty_bowl] + block_names) # 未定義函數
- 未定義函數識別:解析代碼抽象語法樹(AST),定位
find_empty_bowl
、stack_objs
等未定義函數; - 遞歸生成子函數:針對每個未定義函數,生成專屬提示并調用 LLM 生成實現代碼,如:
# 定義find_empty_bowl函數 def find_empty_bowl(bowl_names):for bowl in bowl_names:if is_empty(bowl): # 進一步遞歸生成is_emptyreturn bowl
- 作用域管理:生成的子函數存儲于執行環境的
locals
字典,供后續代碼調用,逐步構建 “機器人專屬函數庫”。
(2)性能突破:刷新代碼生成基準的當前最優水平
- HumanEval 基準:分層方法將通用代碼生成的 P@1(單次生成正確率)提升至 39.8%,優于扁平生成(34.9%)及現有工作 [1],[11],[58];貪心解碼(溫度 = 0)通過率達 53.0%,同樣為當前最優 ;
- RoboCodeGen 基準:在機器人專屬代碼生成任務中,分層方法的通過率顯著提升,如 Codex davinci 模型的通過率從扁平生成的 81% 提升至 95%,且模型規模越大,分層方法的優勢越顯著;
- 泛化能力:分層方法對 “擴展性(Productivity)” 泛化的提升最顯著 —— 可生成比示例更長、邏輯層級更多的代碼(如從 “2 個物體堆疊” 擴展到 “10 個物體堆疊”),而這是扁平生成無法實現的。
3. 應用創新:構建 “零訓練成本、跨平臺適配” 的機器人控制框架
(1)零訓練成本:無需真實機器人數據,僅依賴少樣本提示
CaP 無需任何機器人訓練數據,僅通過 2-5 個 “指令 - 代碼” 示例(少樣本提示)即可泛化到新任務,具體優勢體現在:
- 未見指令泛化:如訓練 “將積木放入匹配顏色的碗”,可泛化執行 “將積木放入不匹配顏色的碗”;
- 未見物體泛化:如訓練 “紅色 / 藍色積木操作”,可泛化到 “粉色 / 青色積木”;
- 實驗驗證:在仿真桌面操作中,面對 “未見屬性 - 未見指令” 任務,CaP 成功率達 62.0%-80.0%,而端到端方法 CLIPort 僅為 0.01%-0.0%。
(2)跨平臺適配:僅需替換 API,適配多類機器人
CaP 的核心邏輯與機器人硬件無關,僅需替換感知 / 控制 API 即可適配不同平臺,論文已驗證三類機器人:
- UR5e 機械臂:用于桌面操作(拾取 - 放置)與白板繪圖(生成 Waypoint),感知 API 基于 MDETR [2];
- Everyday Robots 移動機器人:用于辦公室廚房的導航(如 “繞椅子走矩形”)與移動操作(如 “分類回收垃圾”),感知 API 基于 ViLD [3];
- 仿真 UR5e 機械臂:用于大規模泛化實驗,感知 API 為腳本化目標檢測器;
- 適配示例:跨機器人執行 “移動目標” 任務,僅需替換控制 API(機械臂用
put_first_on_second
,移動機器人用goto_pos + pick_obj
),核心代碼邏輯不變。
(3)人機交互增強:支持自然語言對話與常識問答
通過在控制 API 中加入robot.say(text)
接口,CaP 具備人機對話能力,可解釋決策過程:
- 示例 1:輸入指令
# 告訴我為什么停止移動
,生成代碼robot.say("I stopped moving because I saw a banana.")
; - 示例 2:輸入問題
# 桌子上有多少個水果
,生成代碼調用get_obj_names
統計水果數量,并通過robot.say
反饋結果; - 優勢:突破傳統機器人 “僅執行、不解釋” 的局限,提升人機協作安全性與易用性。
4. 驗證創新:構建機器人專屬代碼生成基準(RoboCodeGen)
為填補 “機器人領域缺乏代碼生成評估基準” 的空白,論文設計 RoboCodeGen 基準,包含 37 個機器人專屬函數生成任務,具備以下特點:
- 任務類型聚焦:覆蓋空間推理(如 “計算點集中最近點”)、幾何推理(如 “判斷邊界框包含關系”)、控制算法(如 “PD 控制器實現”)三大機器人核心需求;
- 評估難度適配:無顯式文檔字符串或類型提示,要求 LLM 通過函數名與任務描述推斷邏輯,更貼近真實機器人應用場景;
- 支持分層生成:允許調用未定義函數,可評估分層代碼生成的性能;
- 實用價值:為后續 LLM 在機器人領域的代碼生成研究提供統一評估標準,避免 “各方法自定數據集、無法對比” 的問題。
八、相關工作
1. 領域一:語言驅動機器人控制(傳統方法)
傳統語言驅動機器人控制方法聚焦 “語言到動作的映射”,但存在泛化能力弱或數據成本高的局限,論文將其分為三類:
(1)高層級語言解釋(語義解析與規劃)
- 核心思路:通過 lexical analysis(詞匯分析)、semantic parsing(語義解析)將自然語言指令轉化為結構化表示(如邏輯規則、任務序列),再映射到機器人動作;
- 代表性工作:
- Tellex et al. [4]:提出 “語言接地” 概念,通過語義解析建立語言與物理世界實體的關聯,為后續語言 - 機器人控制奠定理論基礎;
- Kollar et al. [25]、Thomason et al. [28,32]:開發基于對話的語義解析系統,讓機器人通過人機交互修正指令理解誤差,但依賴預定義的語義規則庫;
- 局限性:需手動設計語義映射規則,無法處理未見過的指令(如未定義 “對角線排列” 的語義,則無法執行該指令);
- 與本論文的差異:本論文無需預定義語義規則,通過 LLM 生成代碼直接關聯語言與動作,泛化能力更強。
(2)端到端語言 - 動作映射(模仿學習 / 強化學習)
- 核心思路:通過大量機器人演示數據(模仿學習)或獎勵信號(強化學習),訓練端到端模型直接將語言指令映射到動作(如關節角度、末端速度);
- 代表性工作:
- Lynch et al. [8]、Jang et al. [9]:提出語言條件模仿學習方法,需收集數萬次真實機器人 “語言 - 動作” 演示數據,成本極高;
- Mees et al. [15](Calvin 基準):構建長序列語言控制任務數據集,但模型僅在特定場景(如廚房操作)中有效,跨場景泛化差;
- Jiang et al. [43]、Misra et al. [46]:基于強化學習設計語言引導的機器人策略,需大量環境交互采樣,訓練周期長;
- 局限性:依賴海量真實機器人數據,跨場景泛化能力弱,且模型決策過程黑箱化,難以調試;
- 與本論文的差異:本論文(CaP)無需任何機器人訓練數據,僅通過少樣本提示生成代碼策略,且代碼邏輯透明可解釋。
(3)低層級語言條件策略(模型 - based / 力控)
- 核心思路:針對特定控制任務(如抓取、軌跡跟蹤),設計語言條件的低層級控制器,直接輸出控制量(如力矩、速度);
- 代表性工作:
- Sharma et al. [40]:通過自然語言反饋修正機器人軌跡,但需預訓練軌跡優化模型;
- Bobu et al. [56]:基于人類查詢學習感知概念(如 “紅色物體”“圓形區域”),但僅適用于簡單拾取任務;
- 局限性:僅針對單一控制任務,無法組合成復雜行為(如 “導航 + 拾取 + 放置” 長序列任務);
- 與本論文的差異:本論文通過代碼的邏輯結構(循環、條件、函數調用)組合低層級控制 API(如 PD 控制、拾取放置),可實現復雜長序列任務,且無需預訓練控制模型。
2. 領域二:LLM 在機器人中的應用(現有 LLM 相關工作)
近年來 LLM(如 GPT-3、PaLM)在機器人領域的應用逐步興起,但均局限于 “高層級規劃”,無法直接參與感知 - 動作閉環,論文將其分為三類:
(1)LLM 作為任務規劃器(技能序列生成)
- 核心思路:利用 LLM 的語言理解與推理能力,將自然語言指令分解為 “預定義技能序列”(如 “pick→move→place”),再調用預訓練的技能執行;
- 代表性工作:
- Huang et al. [14](Language Models as Zero-Shot Planners):首次證明 LLM 可零樣本生成機器人任務序列,但依賴預定義的技能庫(如 “grasp”“stack”);
- Ahn et al. [17](SayCan):結合 LLM 規劃與技能可用性(affordance)評估,生成可行的技能序列,但仍需預訓練技能模型(如行為克隆、強化學習訓練的 “pick” 技能);
- Huang et al. [18](Inner Monologue):通過 “成功檢測器” 反饋修正 LLM 規劃結果,提升長序列任務魯棒性,但未改變 “LLM 僅規劃、不控制” 的定位;
- 局限性:LLM 不直接調用感知 API 與控制 API,無法參與感知 - 動作反饋循環,導致無法處理動態指令(如 “看到橙子就放下蘋果”)、模糊控制描述(如 “更快移動”);
- 與本論文的差異:本論文讓 LLM 生成直接調用感知 / 控制 API 的代碼,構建 “語言 - 感知 - 動作” 閉環,可處理動態反饋與精確數值控制,無需預定義技能庫。
(2)LLM 結合多模態感知(視覺 - 語言融合)
- 核心思路:將 LLM 與視覺語言模型(如 CLIP、VL-BERT)結合,用視覺信息補充 LLM 的物理世界認知,提升規劃準確性;
- 代表性工作:
- Zeng et al. [16](Socratic Models):通過視覺語言模型(如 ViLD)獲取物體位置信息,代入 LLM 提示生成規劃,但 LLM 僅輸出技能序列,不直接生成控制邏輯;
- Shah et al. [30](LM-nav):結合 LLM 與視覺導航模型,讓機器人根據語言指令生成導航路徑,但控制邏輯仍由預定義導航模塊實現;
- 局限性:視覺信息僅用于 “修正規劃”,未融入控制環節,LLM 仍無法輸出精確控制參數(如 “20cm 位移”“0.2m/s 速度”);
- 與本論文的差異:本論文將視覺感知 API(如 MDETR/ViLD 的目標位置輸出)直接嵌入 LLM 生成的代碼中,實時處理感知數據并調整控制參數,實現感知 - 控制閉環。
3. 領域三:LLM 代碼生成與程序合成
LLM 代碼生成與程序合成研究為 “代碼即策略(CaP)” 提供了技術基礎,論文重點分析了兩類相關工作:
(1)LLM 代碼生成基準與方法
- 核心思路:研究 LLM 在通用代碼生成任務(如函數實現、腳本編寫)中的能力,建立評估基準(如 HumanEval);
- 代表性工作:
- Chen et al. [1](Evaluating Large Language Models Trained on Code):提出 HumanEval 基準,首次系統驗證代碼補全 LLM(如 Codex)的函數生成能力,為本論文選擇 LLM 模型(Codex davinci-002)提供依據;
- Chowdhery et al. [11](PaLM)、Austin et al. [48]:證明大參數量 LLM(如 PaLM Coder)在代碼生成任務中具備零樣本泛化能力,但未將其應用于機器人控制;
- 與本論文的差異:本論文將通用 LLM 代碼生成能力遷移到機器人領域,提出 “分層代碼生成” 方法,不僅提升通用代碼生成性能(HumanEval P@1 達 39.8%),還實現了機器人專屬代碼(如 PD 控制器、空間幾何計算)的生成。
(2)程序合成在機器人中的初步應用
- 核心思路:通過程序合成(program synthesis)生成結構化程序(如有限狀態機、簡單腳本),作為機器人策略;
- 代表性工作:
- Ellis et al. [49](Dreamcoder)、Tian et al. [50]:提出基于貝葉斯程序學習的程序合成方法,可生成簡單繪圖、2D 任務的控制程序,但需手動設計程序語法模板;
- Trivedi et al. [51]:將程序合成用于 2D 機器人任務(如推塊),但程序結構固定,無法處理 3D 真實機器人場景;
- 局限性:依賴預定義程序語法模板,無法生成復雜邏輯(如遞歸函數、第三方庫調用),且不支持自然語言輸入;
- 與本論文的差異:本論文無需預定義程序模板,通過自然語言指令直接生成調用第三方庫(NumPy/Shapely)、支持遞歸的 Python 代碼,可適配 3D 真實機器人場景。
4. 本論文與相關工作的核心差異總結
相關工作類別 | 核心方法 | 數據依賴 | 泛化能力 | 控制深度(感知 - 動作閉環) |
---|---|---|---|---|
傳統語義解析 | 預定義語義規則 | 無(人工規則) | 弱(僅支持已知指令) | 無(僅輸出任務序列) |
端到端語言 - 動作映射 | 模仿學習 / 強化學習 | 海量真實數據 | 弱(僅支持訓練場景) | 有(但黑箱化) |
LLM 作為任務規劃器(SayCan 等) | 生成預定義技能序列 | 無(LLM 預訓練) | 中(支持未知指令但依賴技能庫) | 無(不參與控制) |
本論文(CaP) | LLM 生成代碼直接作為策略 | 無(少樣本提示) | 強(支持未知指令 / 物體) | 有(代碼透明,實時反饋) |