4.4 技能库与工具调用:从抽象指令到原子动作


文档摘要

4.4 技能库与工具调用:从抽象指令到原子动作 LLM 说「抓起杯子」,机器人怎么真去抓?中间需要一个「翻译层」——把抽象语义指令映射到具体的关节运动。这个翻译层就是技能库(Skill Library),它是 LLM 大脑与执行器手脚之间的桥梁。 4.4.1 为什么需要技能库 直接让 LLM 输出关节角度是不现实的: LLM 不知道机械臂的运动学。 每个新任务都要重新学,无法复用。 失败时无法归因到具体技能。 技能库(Skill Library) 把常用动作封装为可调用的「原语」: LLM 只需选择和组合这些技能,不需要关心底层关节怎么动。这是层次化抽象的胜利。 4.4.

4.4 技能库与工具调用:从抽象指令到原子动作

LLM 说「抓起杯子」,机器人怎么真去抓?中间需要一个「翻译层」——把抽象语义指令映射到具体的关节运动。这个翻译层就是技能库(Skill Library),它是 LLM 大脑与执行器手脚之间的桥梁。

4.4.1 为什么需要技能库

直接让 LLM 输出关节角度是不现实的:

  • LLM 不知道机械臂的运动学。
  • 每个新任务都要重新学,无法复用。
  • 失败时无法归因到具体技能。

技能库(Skill Library) 把常用动作封装为可调用的「原语」:

skill.goto(position) # 移动到位置 skill.grasp(object_name) # 抓取物体 skill.place(object, loc) # 放置物体 skill.open_gripper() # 张开夹爪 skill.pour(source, target) # 倾倒

LLM 只需选择和组合这些技能,不需要关心底层关节怎么动。这是层次化抽象的胜利。

4.4.2 技能的三层抽象

层级 抽象程度 实现方式 LLM 介入
任务层 最高(自然语言) LLM 规划
技能层 高(语义动作) 学习型策略 / 脚本 偶尔
原语层 中(参数化动作) 传统规划 / RL
运动层 低(轨迹) 第 6 章运动规划
关节层 最低(力矩) 第 6 章控制器

LLM 通常操作「技能层」,必要时(如 Code-as-Policies)直接操作「原语层」。技能库就是这两层的封装。

4.4.3 技能的两大设计范式

范式一:手工脚本技能

每个技能是一个传统程序:调用运动规划、力控、感知模块,按预设流程执行。

def grasp(object_name): # 1. 视觉定位 pos = vision.find(object_name) # 2. 运动规划到物体上方 planner.goto(pos + offset_above) # 3. 下探 planner.move_straight_to(pos) # 4. 闭合夹爪,力反馈停止 gripper.close_until_force(threshold=2.0) # 5. 抬起 planner.move_straight_to(pos + offset_above) return success_check()
  • 优点:可解释、可调试、参数可控。
  • 缺点:场景泛化差(物体位置/形状变了就失效)、需大量人工。

范式二:学习型技能

每个技能是一个学习型策略(如 VLA、扩散策略),从数据中学会执行。

def grasp(object_name): # 学习型策略:图像 + 物体名 → 动作 image = camera.capture() action_chunk = vla_policy(image, object_name) return controller.execute(action_chunk)
  • 优点:泛化好、能处理新物体新场景。
  • 缺点:数据需求大、可解释性差。

💡 当前趋势:手工脚本技能用于结构化、确定性操作(如 USB 插拔、按钮按压),学习型技能用于非结构化、泛化需求强操作(如抓取任意物体、折叠衣物)。第 5 章 VLA 模型就是学习型技能的代表。

4.4.4 技能接口设计

无论手工还是学习型,技能都要有清晰的接口。一个好的技能接口包含:

字段 含义 例子
名称 唯一标识 grasp
描述 LLM 看的自然语言说明 "Grasp an object and lift it"
输入参数 类型化参数 object_name: str
前置条件 执行前必须满足 gripper_is_open AND object_visible
后置条件 执行后保证 object_in_gripper
返回值 执行结果 success: bool, error_msg: str
成本估计 时间/能量代价 duration: 5s, energy: low

这种结构化接口让 LLM 能像调用 API 一样选择技能,也让上层规划器能做成本-效益权衡

4.4.5 SayCan 中的技能与 Affordance

回顾 4.1 节的 SayCan:它对每个技能维护一个 affordance 概率。这个概率其实就是「在当前状态下,这个技能的前置条件是否满足、执行能否成功」:

def affordance(skill, state): # 检查前置条件 if not check_precondition(skill, state): return 0.0 # 学习型模型预测成功率 return learned_model.predict_success(skill, state)

技能库不仅提供「能做什么」,还提供「能不能做」——这是 SayCan 范式的根基。

4.4.6 技能发现与自动构建

手工设计技能库费时费力,研究者提出技能发现(Skill Discovery)

方法 思路 代表
频繁子序列挖掘 从大量轨迹中找频繁出现的子序列作为技能 Option Discovery
基于目标 以可达成目标为技能边界 Goal-Conditioned RL
基于聚类 轨迹嵌入聚类,每类对应一技能 Skill Clustering
LLM 启发式提议 LLM 提议可能的技能,机器人验证 RoboGen、Eureka

💡 RoboGen 思路:让 LLM 提议「打开抽屉」「按压按钮」这样的技能,自动生成仿真环境,训练 RL 策略,验证后加入技能库。这是「LLM 提议 + 自动验证」的技能发现范式,被认为是规模化扩充技能库的方向。

4.4.7 层次化任务网络(HTN)

更结构化的任务分解用层次化任务网络(Hierarchical Task Network, HTN)

做早餐 (复合任务) ├── 煎蛋 (复合任务) │ ├── 拿蛋 (原子技能) │ ├── 撞碗 (原子技能) │ └── 倒蛋 (原子技能) ├── 烤面包 (复合任务) │ ├── 拿面包 (原子技能) │ └── 放入烤面包机 (原子技能) └── 倒牛奶 (原子技能)

HTN 明确定义:

  • 复合任务:可继续分解。
  • 原子任务:不可再分,对应一个技能。
  • 分解方法:复合任务的多种分解方案(不同情境选不同方案)。

LLM + HTN 的结合是当前研究方向:LLM 提供灵活分解,HTN 提供结构化保证。代表工作如 LLM+P(LLM 做 Planning)把 HTN 规划器与 LLM 串联,LLM 把自然语言任务翻译为 HTN 输入,传统 HTN 规划器给出保证正确的执行序列。

4.4.8 技能库的工程实践

生产级技能库的工程要点:

要点 说明
统一接口规范 所有技能遵循同一接口(输入参数、前置/后置条件、返回值)
可观测性 每次调用记录输入、输出、耗时、失败原因
可回滚 关键技能支持失败回滚(如抓取失败时复位机械臂)
参数化 技能参数可调(速度、力度、阈值),适应不同物体
版本管理 技能更新时保留旧版本,便于回退
测试覆盖 每个技能在仿真中有回归测试
资源调度 技能间共享资源(相机、夹爪)的互斥管理

⚠️ 生产箴言:技能库是机器人系统最容易腐化的模块。每加一个新任务,工程师就加一个新技能,久而久之技能库充斥重复、互斥、过时的技能。定期重构、合并、归档是必要的运维工作。

4.4.9 工具调用:技能库的现代形态

在 LLM Agent 时代,技能库演化为工具调用(Tool Use / Function Calling)

  • 技能包装为 JSON Schema 描述的工具。
  • LLM 通过 function calling 协议选择并调用工具。
  • 工具执行后返回结构化结果。

OpenAI、Anthropic、Google 的 function calling API 已经标准化这一过程。一个机器人技能的工具定义示例:

{ "name": "grasp", "description": "Grasp an object and lift it. Use when the user wants the robot to pick something up.", "parameters": { "object_name": { "type": "string", "description": "Name or description of the object to grasp, e.g. 'red cup'" }, "grasp_force": { "type": "number", "description": "Grasp force in Newtons, default 5N" } }, "returns": { "success": "boolean", "message": "string" } }

LLM 在生成响应时可以选择调用这个工具,工具执行后结果返回给 LLM 继续推理。这是当前 LLM 机器人最主流的集成方式。

4.4.10 技能库 vs VLA 端到端:路线之争

最后讨论一个根本问题:既然 VLA 端到端模型(第 5 章)可以一口气从图像指令到动作,为什么还要技能库?

维度 技能库 + LLM VLA 端到端
模块化
可解释
数据效率 高(技能可单独学) 低(端到端学全部)
长程任务 弱(依赖高层规划)
精细操作 取决于技能实现 强(端到端优化)
泛化 取决于技能库覆盖 强(数据驱动)
调试
计算成本 低(小技能模型) 高(大 VLA)

💡 当前共识:技能库与 VLA 互补,不是替代关系。

  • 高层用 LLM + 技能库(或 LLM + VLA)做长程规划。
  • 底层用 VLA 做精细操作(特别是泛化要求高的抓取、装配)。
  • 传统控制做安全约束(碰撞检测、力限制)。

纯端到端 VLA 在长程任务上仍不可靠,纯技能库在泛化上仍受限。分层融合是 2025-2026 年的主流。

4.4.11 一个完整的「指令→执行」链路

把第 4 章所有概念综合,看一条完整链路:

这就是「LLM 大脑 + VLM 眼睛 + 技能库手脚」协作的完整图景。

本节小结

  • 技能库是 LLM 抽象指令与底层执行之间的翻译层。
  • 技能有五层抽象:任务→技能→原语→运动→关节,LLM 通常操作技能层。
  • 两大设计范式:手工脚本(可解释)与学习型(泛化好),互补使用。
  • 好的技能接口包含名称、描述、参数、前置/后置条件、返回值、成本估计。
  • 技能发现(RoboGen 等)用 LLM 提议 + 自动验证规模化扩充技能库。
  • HTN 提供结构化任务分解,与 LLM 结合是当前方向。
  • 工具调用(function calling)是技能库的现代形态,已成为 LLM Agent 标配。
  • 技能库与 VLA 端到端互补,分层融合是主流。

至此第 4 章结束。你已经理解了具身智能的「大脑」一面:LLM 任务规划、VLM 场景对齐、记忆反思、技能库。下一章《第 5 章 VLA 模型与端到端策略》将进入大脑的另一面——把感知、语言、动作融合为一个端到端模型的革命性范式。


发布者: 作者: 灏天文库 转发
评论区 (0)
U