Code as policy 和 VLM agent+机械臂 function calling 有什么不同
回复 群友 607 一句话:Code as policy 管的是「允许做什么」,机械臂 function calling 管的是「怎么把意图变成动作」。前者是策略层,后者是执行层,不是同一层的东西。 具体拆一下。 第一,作用对象不同。Code as policy 的输入是权限和约束条件,输出是「true 或 false、放行或抛错」,它本身不产生任何动作。VLM + 机械臂的 function calling 输入是图像和自然语言指令,输出是具体动作序列(抓取、移动、旋转,坐标和力矩),它产生的是物理动作。 第二,可靠性要求的方向不一样。Code as policy 追求确定性:同样的输入永远给同样的判定,代码里没有模型,所以不会漂移。VLM 的 function calling 天生不确定:同一个杯子,这次抓 0.31 米高,下次可能抓 0.29,光照变了可能压根识别不出来。它的价值就在于能处理代码写不出来的开放语义,代价是概率性。 第三,出错成本的性质不同。策略层判断错了,是越权或误拦,可回滚、可审计、可加测试。机械臂动作错了,是把东西打翻、撞到人,不可逆且涉及物理安全。所以工业界的实际做法正好相反于「让模型自己决定」:VLM 只做高层任务分解和语义理解,轨迹规划、碰撞检测、力矩限幅这些全部交给传统运动规划器和硬约束,模型不参与闭环控制。 第四,两者真正能结合的地方,恰好就是你说的那个方向:把安全约束写成代码,作用在 function call 的工具层。比如 LLM 输出 move_to(x y z) 这个工具调用,工具内部先跑一遍 code as policy 式的校验:目标点是否在工作空间内、速度是否超限、夹爪力是否超过物体耐受值、人是否在安全区。校验不通过就直接抛错,不让动作下发。这时模型只管「想做什么」,代码管「最多能做多狠」。 第五,时间尺度不同。策略判定通常在动作执行前完成,一次性的、低频的;机械臂 function calling 是控制回路的一部分,需要几十到几百赫兹的持续反馈。这个是硬约束,别指望用一次 LLM 调用去闭合机械臂的控制环,延迟差两个数量级。 所以差别不是「谁更先进」,是两者在栈里的位置本来就不同。实践里最有价值的组合是:VLM 负责语义的开放端,code as policy 负责物理和权限的硬边界,中间的轨迹规划交给经典控制。想拿 LLM 直接闭环控机械臂的,基本都会在安全评审那一关卡住。