跳转到内容

正在加载搜索…

skill 与 prompt pack

skill 是模型的程序可以调用的东西。prompt pack 是模型被告知的关于它们的内容。两者 遵循同一个开关:agent 开启 skill,所需服务缺失的 skill 会被移除,prompt 也随之移除它的文档, 因此模型永远不会读到它无法调用的 API。

skills/<name>/
├── skill.toml name, summary, layer, exports, what it needs
└── __init__.py a mixin class with the methods
name = "pointing"
summary = "Open-vocabulary pointing and 3D localization from one or more cameras."
layer = "base"
mixin = "skills.pointing:Pointing"
exports = ["point_to", "localize", "localize_3d"]
needs_any = ["pointer", "vlm"]
order = 30

skill 运行在其 embodiments 所列的 embodiment 类型上(默认 ["robot"];目前所有 skill 都是机器人的)。kernel 的 session 类是该 embodiment 的 session 加上该类型所有 skill 的 mixin,因此一个 skill 的方法可以使用另一个 skill 的方法(pick 使用 segment_text、 move_eef、holding)。已启用的 skill 只决定程序能看到哪些名称。不同类型的 skill 可以导出 相同的名称(例如每种类型都有自己的 finish):它们永远不会同时启用。skill.toml 的键见 配置参考;skill 本身及其函数见 skill 参考。

  1. 请求的:agent 的 [skills] names = [...],或者针对该次运行的 embodiment 类型、其 接口层的 skill:所有 base skill,加上这些层开启时的 learned(vla、wam)、 reactive、handlers(默认:learned 关闭,reactive 和 handlers 开启)。不能在该类型 上运行的指名 skill 会被移除(“does not run on the desktop embodiment”)。optional skill 不属于任何层的集合:用 enable = [...] 添加它。再减去 disable = [...]。在 conflicts 中互相列出对方的两个 skill(它们导出部分相同的名称,例如 eef 和 manipulation)永远不会同时启用:同时请求两者会报错。
  2. 可用的服务:当配置中有 segmenter、pointer、vlm 和 verifier 这些角色或服务且机器上运行 着它们时,这些服务可用;当配置中有学习型策略或世界模型时,policy 和 world_model 可用。
  3. 解析:当一个 skill 的 needs 中某种服务缺失、其 needs_any 中没有任何一个可用,或者 它 requires 的某个 skill 被移除时,该 skill 被移除;重复这一过程直到不再变化。一个无法 运行的 required skill(core、geometry、kinematics、grasping、memory、verify、motion) 会报错。

harness config 显示结果以及每个被移除 skill 的原因:

skill on why
pointing no needs one of the services pointer, vlm
segmentation no no segmenter service
eef no no segmenter service
reactive no not in this configuration

已启用的 skill 以及被移除的 skill 及其原因都是配置 lock 的一部分,因此在缺少某个服务的机器 上运行会有另一个 identity(配置与 identity)。

一个 pack 是一个目录,例如 prompts/robodojo/,其 pack.toml 按顺序列出各个 section; 带有 skills 的 section 在其中某个 skill 启用时被包含:

# Prompt pack of the dual-arm ARX X5 on RoboDojo (runtime/prompts.py). Sections in
# order; a section with `skills` is included when one of them is enabled.
sections = [
{ file = "core.md" },
{ file = "learned.md", skills = ["vla", "wam"] },
{ file = "reactive.md", skills = ["reactive"] },
{ file = "reflexes.md", skills = ["reflexes"] },
{ file = "events.md" },
{ file = "handlers.md", skills = ["handlers"] },
{ file = "mcp.md", skills = ["mcp"] },
{ file = "method.md", skills = ["eef"] },
{ file = "rules.md" },
{ file = "rules_learned.md", skills = ["vla"], optional = true },
{ file = "rules_reactive.md", skills = ["reactive"], optional = true },
{ file = "rules_handlers.md", skills = ["handlers"], optional = true },
]
# Names the skills export that the prompt does not describe (direct-control programs
# use fingertip_of; models compute fingertips with link6_for_tip instead).
undocumented = ["fingertip_of"]

在一个 section 内部,标记只在其指名的每个 skill 或 feature 都开启时保留文本:

<!-- if: segmentation -->
segment_text(observation, prompt, camera="cam_head") -> [Mask] instance masks, best first, or []
...
<!-- end -->

(prompts/robodojo/core.md;<!-- else --> 分支给出 skill 关闭时的文本。)

标记可以嵌套;标记行永远不会到达模型。除了 skill 之外,机器人连接的两个 feature 也会选择 文本:measured_gripper(夹爪读数是测量得到的开度)和 step_limit(会报告 episode 的步数 上限)。两者在原生契约下都成立,在 XPolicyLab 的契约下都不成立 (通过 XPolicyLab 评测)。

测试会针对可选 skill 的每种组合检查每个 pack:已启用 skill 的每个公开函数都必须以调用的形式 出现在 prompt 中(列为 undocumented 的名称除外),已禁用 skill 的函数都不得出现,并且不得 残留任何标记。

Pack 使用者
prompts/robodojo/ RoboDojo 上的 agent 和程序消融(R2、R3)
prompts/robotwin/ RoboTwin 上的 agent(有自己的 core.md,其他 section 共用)
prompts/robodojo_direct*.md R0 和 R1(是文件,不是 pack)
prompts/robodojo_tasks/ 任务描述(runtime.task_descriptions)

一个 pack 描述一种 embodiment:它的坐标系、可达范围、时间和数值(“a 15 cm move takes about 33 ticks”)。skill 的代码对每种 embodiment 都相同。skill 参考为每个 skill 展示了 RoboDojo pack 给模型的文本。