介绍如何通过程序化的智能体编写工作流,弥合令人印象深刻的演示与真实环境中可靠、可重复机器人部署之间的差距。
AI translation, not an official translation. Refer to the original for technical details.
Adapted from @zeonsystems# 代码即策略:西西弗斯已上线 最近,代码即策略(code-as-policy)以及更广泛的"机器人使用智能体"概念引发了大量讨论:通用模型学习操控机器人,其方式与它们已经操控浏览器、终端和计算机的方式大体相同[1]。 这一领域的进展令人瞩目。GPT-6 Astra 能够通过摄像头视图和末端执行器指令控制 YAM 机械臂,在简单的"将积木放入碗中"任务上 20 次中成功 19 次,但在精度要求更高的拼图块插入任务上,20 次中仅成功 2 次[2]。Anthropic 也在多种机器人和控制接口上探索了同样的宏观思路[3]。 然而,机器人能在大多数时候完成令人印象深刻的任务,与机器人能每天完成具有经济价值的工作,两者之间存在巨大差距。生产级机器人工程活在"九个九"的行进中:从 90% 的可靠性提升到 99%,再到 99.9%,并持续消除那些只有在数百次乃至数千次运行后才会出现的罕见故障。 一个十次中成功九次的行为,可以成就一场精彩的演示,但若第十次失败需要人工干预,它便毫无实用价值。这一点在科学实验室(我们的部署场景)中尤为关键。倾倒一支试管或移动一个物体,与运行一项实验并不是同一回事。真实的实验是由相互依赖的步骤组成的漫长链条,可靠性必须贯穿其全部步骤,而非仅仅体现在最引人注目的操作上。一旦某个行为可以稳定运行,让它具备可重复性便具有巨大价值。 实现这一目标意味着要在模型外围构建一套框架:更完善的工具、对物理世界的显式表征、行为验证机制,以及工作流开发完成后的确定性执行。智能体仍可在发生意外时重新介入,但无需在每一次成功运行中都全程参与循环。 为此,我们长期以来一直押注于这一思路的更具程序化的版本:使用智能体来编写操控机器人的策略和工作流。 我们的偏好是尽快将机器人部署到真实环境中,完成有用且高价值的工作。这促使我们转向那些能够在生产中被测试、被信任和被重复的系统。 大约一年前我们参加 YC 时,从相当基础的拾取与放置演示起步。此后,我们将同一思路大幅推进。我们现在拥有一套工具包,能够将机器人部署在科学实验室内,构建相当复杂的工作流,并举办黑客马拉松——让多位参与者能够在数小时内独立使用智能体对机器人进行编程。 在此过程中,我们积累了大量关于如何真正让大语言模型和编码智能体在机器人领域发挥作用的经验。最重要的教训是:代码即策略的效果极为出色——但前提是你必须围绕它构建正确的系统。 ## 什么是代码即策略? 目前,基础模型在机器人领域的应用大致可分为三种方式。 **视觉-语言-动作模型(VLA)** 通过学习策略将视觉信息和语言信息直接映射为机器人动作。π0.5 等模型采用的便是这一方法[4]。 **在线大语言模型控制** 将通用模型直接置于控制循环中:模型观察场景并反复决定下一步机器人动作。 **代码即策略** 将模型提升到更高层级。模型编写可执行代码,调用感知、规划和控制 API,由该程序驱动机器人[5]。 对我们来说,代码在生产环境中的优势在于:它为我们提供了明确且模块化的东西,可以对其进行检查、测试、修补,并使其具有确定性。对于学习型策略,故障往往更难隔离,修复一种行为可能会影响另一种行为。学习型策略和在线控制在有用的地方仍然可以嵌入系统,而代码则提供更宏观的编排层。 ## 代码即策略在什么情况下适用? 我们作为一家公司的目标是实现科学的自动化。 事实证明,这与代码即策略的理念高度契合:工作具有重复性,且环境的表示足够清晰,使智能体能够对其所构建的内容进行测试和验证。对于我们所处理的问题类型,代码即策略可以轻松应对我们遇到的约95%的任务。 通过有意聚焦于这一领域,我们避免了所谓的"祖母的杯子问题":要求一个机器人走进祖母家,打开一个从未见过的任意橱柜,识别一个任意的杯子,理解那个橱柜和杯子的行为方式,并成功地对它们进行操控。通用机器人必须解决这种开放性的情况。而通过选定一个特定领域,我们得以利用已经存在的结构。 科学实验室的约束要多得多。物体的种类更少。设备往往放在已知的位置。工作流程反复重复。明天的培养板还是培养板。离心机的门、转子和控制装置一如既往。移液器仍然遵循相同的规则运作。 这种结构为我们提供了巨大的杠杆效应。我们无需要求模型从零开始对整个物理世界进行推理,而是可以为其提供一个已知的环境,以及一套与之交互的工具。 ## 将大语言模型直接接入机器人在生产环境中是个坏主意 所谓"直接接入",是指将通用模型置于在线控制回路中:原始传感器状态输入进来,模型随即不断输出下一个机器人动作。 这些模型已经能够观察场景、对需要发生的事情进行推理,并以极少的外围结构产生有用的机器人行为。对于演示和简单的抓取放置任务,这种方式可以奏效得出奇地好。 但生产级机器人技术的门槛要高得多。对于大多数商业应用场景而言,一个不可靠的机器人系统算不上真正的工具,它只是一个玩具。 模型在空间推理和物理交互方面仍存在薄弱环节。它们可能难以推理机构如何铰接运动、各运动之间如何相互约束,以及一个单独看来合理的动作如何导致机器人陷入不良构型。 语言模型可能完全理解离心机盖需要打开。但这并不意味着它能直觉地理解铰链的几何结构、盖子的扫掠体积、机器人手肘在开盖过程中的最终位置,或者夹爪能否在整个运动过程中保持接触。 这些细节在机器人技术中至关重要。 这一区别在当前关于机器人使用智能体的讨论中同样重要。关于机器人应该做什么的推理正变得愈发强大,而低层级控制、动力学、接触和灵巧操作仍是截然不同的问题。Anthropic同样发现,相比直接求解控制问题,使用Python控制器和更高层级机器人能力时,相同模型的表现明显更好\[3\]。 这一点深刻影响了我们思考这类系统的方式。我们发现,将大语言模型视为在机器人系统内部运作的程序员,远比将其视为机器人系统本身更为有效。 将大语言模型置于在线控制环路中,会将其随机性直接计入你的可靠性预算。而将其视为程序员,则把随机性转移到了编写阶段——在那里代价很低:编写程序、在仿真中测试,然后以确定性方式运行已验证的行为。 ## 要让"代码即策略"奏效,你需要什么? 我们的实现方式大致如下。 1. 为大语言模型构建一个仿真世界 我们为模型提供一套环境表示,使其能够对正在创建的工作流进行推理和测试。在我们的系统中,这是一个已保存的三维世界,包含结构化文本表示,涵盖物体、位姿、碰撞信息及关节状态。这为智能体提供了一个可以自由试验的空间,而不会让每一次失误立即演变为物理故障(参见 zeon 文档)。(https://readme.zeonsystems.app/docs/building-a-world) 2. 使仿真世界与现实保持一致 仿真的实用性在很大程度上取决于它与实际实验室的契合程度。我们花费了大量时间构建感知与定位系统,以保持仿真世界与现实的对齐。实验室中的物理对象会被定位并与其仿真对应物进行匹配,从而使同一项目和工作流能够在云端仿真与实体机器人之间无缝切换(参见 zeon 文档)。(https://readme.zeonsystems.app/docs/key-concepts) 3. 使对象支持显式标注 每个对象均以文本形式表示,并可暴露有用的位姿和交互点:机器人应在何处抓取它、物体应插入何处,或机器人应从哪个方向靠近它。 这是我们向智能体传递关于该对象物理知识的方式。模型无需每次重新探索相同的几何信息,而是可以直接基于我们显式定义的交互几何进行工作(参见 zeon 文档)。(https://readme.zeonsystems.app/docs/skill-authoring-patterns) 4. 为大语言模型提供机器人原语 我们暴露了可复用的机器人原语,使模型能够操控对象、安全移动并与环境交互。这些都是普通的 Python 函数,构成了模型用于构建更复杂行为的词汇表。需要以更高速度或更高一致性运行的底层控制器,可作为智能体调用的原语加以暴露(参见 zeon 文档)。(https://readme.zeonsystems.app/docs/authoring-a-skill) 5. 允许将这些原语以 Python 形式进行组合 这正是"代码即策略"特别有价值之处。智能体可以生成包含循环、函数、条件判断、计算以及机器人工具包调用的普通 Python 代码。这样既获得了通用编程语言的表达能力,又无需让模型直接生成底层机器人指令。生成的程序同样具有可检查性:你可以阅读、修改、版本控制、测试并重复运行它(参见 zeon 文档)。(https://readme.zeonsystems.app/docs/authoring-a-skill) 6. 为智能体提供验证和仿真自身工作的工具 生成程序只是问题的一半。智能体还需要工具来帮助它判断所生成的内容是否真正有效。我们为其提供了检查执行情况、简化计算、验证假设以及应对物理执行实际情况的手段。同一底层项目既可在仿真中运行,也可在实体硬件上执行(参见 zeon 文档)。(https://readme.zeonsystems.app/docs/running-a-workflow-on-real-hardware) 这创造了一个更接近普通软件开发的开发循环:使用智能体进行构建,在云端仿真中进行检查,手动或借助智能体对行为进行迭代,然后在实体机器人上运行已验证的程序。 ## 机器人学习在其中扮演什么角色? 有的——但我们认为并非所有事情都需要通过学习来实现。 代码、几何与确定性机器人原语在结构化任务中表现极为出色,但在某些场景下,这种表达方式开始出现局限。 可变形物体就是一个很好的例子。与纸张、薄膜或其他柔性材料的交互极难进行显式建模。接触、摩擦或形变上的细微差异,都可能彻底改变最终结果。 对于此类动作,我们可以使用一个经过微调的模型来执行工作流中的某个单独节点,同时保持更宏观的工作流是确定性的。经过学习的策略只需成为程序在显式建模变得困难时可以调用的另一个原语即可。 我们目前的判断是采用混合方式:能用确定性方法的地方就用确定性方法,需要学习的地方再引入学习。代码即策略为我们提供了一个有用的编排层,因为经过学习的策略可以像其他任何机器人原语一样,嵌入同一个工作流之中。 ## 我们目前的立场 我们对代码即策略的看法,与最初入门时相比已经发生了相当大的转变。 最初,令人兴奋的是大语言模型能够编写一些代码并让机器人动起来。这依然很酷,但现在感觉这已经是其中最不有趣的部分了。 更有趣的是,智能体正在成为一种真正实用的机器人编程方式。如果你为它们提供对世界的良好表征、有用的原语、仿真环境,以及围绕执行构建的充足工具,它们就能构建出出人意料的复杂机器人行为。 在物理交互的许多方面,这些模型仍然面临挑战,但其进步速度实在难以忽视。 一年前,我们还在为大语言模型能让机械臂抓取物体而感到兴奋。如今,分布在全国各地的科学家们已经能够在我们的系统上独立设计并运行真实的、经过验证的实验。 现在,"对机器人编程变得像对计算机编程一样普通"这件事,感觉越来越有可能成真。 参考文献: [1] https://web.mit.edu/phillipi/www/writing/robot-use-agents.html [2] https://openai.robocurve.org/gpt-6-astra/ [3] https://www.anthropic.com/research/claude-plays-robotics (https://www.anthropic.com/research/claude-plays-robotics?utm_source=chatgpt.com) [4] https://www.physicalintelligence.company/download/pi05.pdf [5] https://code-as-policies.github.io/