4.4 技能库与工具调用:从抽象指令到原子动作 LLM 说「抓起杯子」,机器人怎么真去抓?中间需要一个「翻译层」——把抽象语义指令映射到具体的关节运动。这个翻译层就是技能库(Skill Library),它是 LLM 大脑与执行器手脚之间的桥梁。 4.4.1 为什么需要技能库 直接让 LLM 输出关节角度是不现实的: LLM 不知道机械臂的运动学。 每个新任务都要重新学,无法复用。 失败时无法归因到具体技能。 技能库(Skill Library) 把常用动作封装为可调用的「原语」: LLM 只需选择和组合这些技能,不需要关心底层关节怎么动。这是层次化抽象的胜利。 4.4.
LLM 说「抓起杯子」,机器人怎么真去抓?中间需要一个「翻译层」——把抽象语义指令映射到具体的关节运动。这个翻译层就是技能库(Skill Library),它是 LLM 大脑与执行器手脚之间的桥梁。
直接让 LLM 输出关节角度是不现实的:
技能库(Skill Library) 把常用动作封装为可调用的「原语」:
skill.goto(position) # 移动到位置 skill.grasp(object_name) # 抓取物体 skill.place(object, loc) # 放置物体 skill.open_gripper() # 张开夹爪 skill.pour(source, target) # 倾倒
LLM 只需选择和组合这些技能,不需要关心底层关节怎么动。这是层次化抽象的胜利。
| 层级 | 抽象程度 | 实现方式 | LLM 介入 |
|---|---|---|---|
| 任务层 | 最高(自然语言) | LLM 规划 | 是 |
| 技能层 | 高(语义动作) | 学习型策略 / 脚本 | 偶尔 |
| 原语层 | 中(参数化动作) | 传统规划 / RL | 否 |
| 运动层 | 低(轨迹) | 第 6 章运动规划 | 否 |
| 关节层 | 最低(力矩) | 第 6 章控制器 | 否 |
LLM 通常操作「技能层」,必要时(如 Code-as-Policies)直接操作「原语层」。技能库就是这两层的封装。
每个技能是一个传统程序:调用运动规划、力控、感知模块,按预设流程执行。
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 模型就是学习型技能的代表。
无论手工还是学习型,技能都要有清晰的接口。一个好的技能接口包含:
| 字段 | 含义 | 例子 |
|---|---|---|
| 名称 | 唯一标识 | 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.1 节的 SayCan:它对每个技能维护一个 affordance 概率。这个概率其实就是「在当前状态下,这个技能的前置条件是否满足、执行能否成功」:
def affordance(skill, state): # 检查前置条件 if not check_precondition(skill, state): return 0.0 # 学习型模型预测成功率 return learned_model.predict_success(skill, state)
技能库不仅提供「能做什么」,还提供「能不能做」——这是 SayCan 范式的根基。
手工设计技能库费时费力,研究者提出技能发现(Skill Discovery):
| 方法 | 思路 | 代表 |
|---|---|---|
| 频繁子序列挖掘 | 从大量轨迹中找频繁出现的子序列作为技能 | Option Discovery |
| 基于目标 | 以可达成目标为技能边界 | Goal-Conditioned RL |
| 基于聚类 | 轨迹嵌入聚类,每类对应一技能 | Skill Clustering |
| LLM 启发式提议 | LLM 提议可能的技能,机器人验证 | RoboGen、Eureka |
💡 RoboGen 思路:让 LLM 提议「打开抽屉」「按压按钮」这样的技能,自动生成仿真环境,训练 RL 策略,验证后加入技能库。这是「LLM 提议 + 自动验证」的技能发现范式,被认为是规模化扩充技能库的方向。
更结构化的任务分解用层次化任务网络(Hierarchical Task Network, HTN):
做早餐 (复合任务) ├── 煎蛋 (复合任务) │ ├── 拿蛋 (原子技能) │ ├── 撞碗 (原子技能) │ └── 倒蛋 (原子技能) ├── 烤面包 (复合任务) │ ├── 拿面包 (原子技能) │ └── 放入烤面包机 (原子技能) └── 倒牛奶 (原子技能)
HTN 明确定义:
LLM + HTN 的结合是当前研究方向:LLM 提供灵活分解,HTN 提供结构化保证。代表工作如 LLM+P(LLM 做 Planning)把 HTN 规划器与 LLM 串联,LLM 把自然语言任务翻译为 HTN 输入,传统 HTN 规划器给出保证正确的执行序列。
生产级技能库的工程要点:
| 要点 | 说明 |
|---|---|
| 统一接口规范 | 所有技能遵循同一接口(输入参数、前置/后置条件、返回值) |
| 可观测性 | 每次调用记录输入、输出、耗时、失败原因 |
| 可回滚 | 关键技能支持失败回滚(如抓取失败时复位机械臂) |
| 参数化 | 技能参数可调(速度、力度、阈值),适应不同物体 |
| 版本管理 | 技能更新时保留旧版本,便于回退 |
| 测试覆盖 | 每个技能在仿真中有回归测试 |
| 资源调度 | 技能间共享资源(相机、夹爪)的互斥管理 |
⚠️ 生产箴言:技能库是机器人系统最容易腐化的模块。每加一个新任务,工程师就加一个新技能,久而久之技能库充斥重复、互斥、过时的技能。定期重构、合并、归档是必要的运维工作。
在 LLM Agent 时代,技能库演化为工具调用(Tool Use / 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 机器人最主流的集成方式。
最后讨论一个根本问题:既然 VLA 端到端模型(第 5 章)可以一口气从图像指令到动作,为什么还要技能库?
| 维度 | 技能库 + LLM | VLA 端到端 |
|---|---|---|
| 模块化 | 高 | 低 |
| 可解释 | 高 | 低 |
| 数据效率 | 高(技能可单独学) | 低(端到端学全部) |
| 长程任务 | 强 | 弱(依赖高层规划) |
| 精细操作 | 取决于技能实现 | 强(端到端优化) |
| 泛化 | 取决于技能库覆盖 | 强(数据驱动) |
| 调试 | 易 | 难 |
| 计算成本 | 低(小技能模型) | 高(大 VLA) |
💡 当前共识:技能库与 VLA 互补,不是替代关系。
- 高层用 LLM + 技能库(或 LLM + VLA)做长程规划。
- 底层用 VLA 做精细操作(特别是泛化要求高的抓取、装配)。
- 传统控制做安全约束(碰撞检测、力限制)。
纯端到端 VLA 在长程任务上仍不可靠,纯技能库在泛化上仍受限。分层融合是 2025-2026 年的主流。
把第 4 章所有概念综合,看一条完整链路:
这就是「LLM 大脑 + VLM 眼睛 + 技能库手脚」协作的完整图景。
至此第 4 章结束。你已经理解了具身智能的「大脑」一面:LLM 任务规划、VLM 场景对齐、记忆反思、技能库。下一章《第 5 章 VLA 模型与端到端策略》将进入大脑的另一面——把感知、语言、动作融合为一个端到端模型的革命性范式。