小明经营着一家小有名气的早餐店。店里新来了两位性格迥异的员工:菜谱大师和厨房管家。菜谱大师博览群书,通晓全世界早餐的做法——他知道做完美煎蛋要“热锅、倒油、打蛋、翻面”,但他从不进厨房,不知道橱柜里还有没有鸡蛋。厨房管家则对店里了如指掌——哪瓶酱油快见底了、哪个灶眼火苗不稳、冷藏室第二层放着昨天的剩饭,但他完全不理解“营养均衡的早餐”这个概念,只知道“现在能做什么”。 每天早晨,小明给二人下达同一个指令:“做一顿早餐”。两人会坐在一张小桌前:菜谱大师写下“理想情况下,接下来最有价值的事”,厨房管家立刻翻开库存清单,核对该事“此刻能不能做成”。只有两人意见一致、且都给出高分的方案才会被真正执行。这套“理论大师出主意、现场管家核可行”的协作机制,正是 Google 在 2022 年提出的 SayCan 模型的核心思想——让语言模型提供“常识与任务规划”能力,让机器人价值函数提供“环境可行性”判断,二者相乘,驱动机器人一步步完成真实世界的长程任务。

岗位关联

SayCan 是具身智能与 VLA 模型的关键基石,理解它能帮你掌握“语言模型如何落地到物理动作”的经典范式,是进入机器人前沿方向的高价值知识。

目录
  1. 可视化演示
  2. 背景动机
  3. 双模块架构
  4. Say 评分
  5. Can 评分
  6. 决策执行
  7. 实验效果
  8. 局限展望
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示SayCan如何结合语言模型概率和Affordance概率选择最优动作,支持任务分解和VLA对比模式。

本节配有交互动效(进入视口后自动加载,约 3KB)。

双概率评分 LLM评估语言可行性概率 Affordance评估执行成功率 两者乘积决定最终动作选择

背景动机

过去几年,语言模型在“理解人类指令”上突飞猛进,但把它们接到真实机器人上时,一个尴尬的问题立刻浮现:语言是符号,动作是物理。菜谱大师读了一万本菜谱,却不知道“打一个鸡蛋”这个动作在真实厨房里意味着什么——要找到鸡蛋、控制手臂力度、避开碗沿。语言模型的优势(常识、推理、规划)与机器人面临的问题(状态感知、物理可行性)之间存在一条巨大的鸿沟,这条鸿沟被称为“语言到动作”的映射难题。

第二个难题是长程任务。“做一顿早餐”包含开冰箱、拿鸡蛋、热锅、倒油、煎蛋、装盘等十几个子步骤。传统机器人脚本只能执行预先写死的固定流程,一旦环境稍有变化(鸡蛋换成培根、灶台换了一侧)便全线崩溃。而强化学习(RL)虽然能学会具体技能,却需要数百万次试错,且难以将“任务目标”这样抽象的信息融入决策。

更致命的是常识缺失。机器人知道“拿起煎锅”这个动作的物理过程,但不知道“做早餐”通常需要“先热锅再倒油”。这种程序性常识来自人类广泛的世界经验,恰恰是传统机器人系统最匮乏的部分。SayCan 的动机正是如此:把语言模型的“菜谱式常识”和机器人的“厨房现状感知”摆到同一张谈判桌前,让两者互补。

双模块架构

回到小明的早餐店。菜谱大师和厨房管家分别持有一种“记分卡”。菜谱大师给出的分数叫 Say 分数,衡量一个动作“对完成任务有多重要”;厨房管家给出的分数叫 Can 分数,衡量该动作“在当下环境里有多大概率成功”。SayCan 系统的核心洞察是:任何候选动作,只有同时通过两位评审的考核才会被执行——最终得分是二者相乘,而不是相加或取最大值。

这种成对设计的哲学是“Do As I Can, Not As I Say“(做我能做的,而不是我说我想的):语言模型很聪明,但会提出”把鸡蛋从冰箱里拿出来煎熟“这种离谱建议——因为鸡蛋已经在煎锅里了;机器人很务实,但只会原地等待指令。让 LLM 提供”我建议做什么“,让机器人价值函数提供”我能做什么”,两者的交集才是最佳行动。

在架构实现上,Say 分数通常来自预训练大语言模型的输出,Can 分数来自在机器人交互数据上训练好的价值函数(value function)。两个模块解耦设计,各自可以独立升级——菜谱大师可以换更好的 LLM,厨房管家可以换更准的感知模型,而不必推翻整套系统。

score(at,st)=pLLM(at∣st,g)×pCan(at∣st)\displaystyle \text{score}(a_t, s_t) = p_{\text{LLM}}(a_t \mid s_t, g) \times p_{\text{Can}}(a_t \mid s_t)
  1. 候选动作与状态$a_t$ 表示 t 时刻机器人可执行的候选动作(如“拿煎锅”),$s_t$ 表示当前环境状态(如“锅在灶台、鸡蛋有货”):每个时刻遍历整个动作空间来评分。
    at∈A,st∈Sa_t \in A, \quad s_t \in S
  2. 任务目标$g$ 是用户下达的自然语言指令(如“做一顿早餐”),它是 Say 分数计算时的条件之一,全程不变。
    g="做一顿早餐"g = \text{"做一顿早餐"}
  3. Say 分数$p_{\text{LLM}}(a_t \mid s_t, g)$ 是语言模型在“任务 $g$ + 状态 $s_t$”的上下文里,认为动作 $a_t$ 值得选用的归一化概率:菜谱大师心中“接下来该做什么”的排序。
    pLLM(at∣st,g)p_{\text{LLM}}(a_t \mid s_t, g)
  4. Can 分数$p_{\text{Can}}(a_t \mid s_t)$ 是机器人价值函数预测的“在状态 $s_t$ 下执行 $a_t$ 的成功概率”:厨房管家核对库存与设备后的可行性判断。
    pCan(at∣st)p_{\text{Can}}(a_t \mid s_t)
  5. 乘积融合两分相乘,要求动作“既重要又可做”;任何一项分数趋近于零,最终得分都会被压垮,从而淘汰“纸上谈兵”或“盲目乱做”的动作。
    score(at,st)=pLLM(at∣st,g)×pCan(at∣st)\text{score}(a_t, s_t) = p_{\text{LLM}}(a_t \mid s_t, g) \times p_{\text{Can}}(a_t \mid s_t)

Say 评分

菜谱大师之所以能给出靠谱的建议,靠的是任务上下文——他不仅知道“做早餐”这个目标,还知道“目前已经放好了煎锅、倒了油、打下了蛋”,因此“撒盐”比“再打一个蛋”更合适。SayCan 中的 LLM 也做同样的事:把任务目标 $g$、当前状态 $s_t$ 的文本描述、以及候选动作列表拼成一个提示,让语言模型为每个候选动作评估其对达成目标的步骤贡献度。

这种“常识知识”是 LLM 在海量文本上预训练得来的。它知道“做早餐”通常包含“热锅→倒油→打蛋→翻面→装盘”,也知道“弹钢琴”和“做早餐”的关联极小。为了把 LLM 原始的文本生成能力转化为可比较的分数,需要对输出做归一化概率处理:把所有候选动作的打分通过 softmax 变成和为 1 的概率分布。

这里有一个工程上容易忽略的细节:温度参数。论文使用 temperature = 1 的 softmax,但如果温度过低,概率分布会过于尖锐,导致贪心决策完全被 LLM 主导;温度过高则趋于均匀,丧失排序信息。实践时需要通过校准实验选择一个平衡点。

pLLM(at∣st,g)=exp⁡(fθ(st,g,at))∑a′∈Aexp⁡(fθ(st,g,a′))\displaystyle p_{\text{LLM}}(a_t \mid s_t, g) = \frac{\exp\left(f_{\theta}(s_t, g, a_t)\right)}{\displaystyle \sum_{a' \in A} \exp\left(f_{\theta}(s_t, g, a')\right)}
  1. 打分函数$f_{\theta}(s_t, g, a_t)$ 是 LLM 对“在状态 $s_t$ 下为达成目标 $g$ 选择动作 $a_t$”的原始打分:菜谱大师在心中的“重要性评分”。
    fθ(st,g,at)f_{\theta}(s_t, g, a_t)
  2. 指数化$\exp$ 将可能为负的原始分数映射为正数,同时放大分数间的差距:让高重要性动作的相对优势更明显。
    exp⁡(fθ(st,g,at))\exp\left(f_{\theta}(s_t, g, a_t)\right)
  3. 分母归一化对所有候选动作 $a' \in A$ 的指数分数求和,作为归一化因子:把所有候选动作放在同一把尺子上比较。
    ∑a′∈Aexp⁡(fθ(st,g,a′))\sum_{a' \in A} \exp\left(f_{\theta}(s_t, g, a')\right)
  4. 概率语义最终结果落在 $(0,1)$ 区间,表示“当前这一步该做这件事”的归一化概率:菜谱大师给出的最终心愿分。
    pLLM(at∣st,g)∈(0,1)p_{\text{LLM}}(a_t \mid s_t, g) \in (0,1)

Can 评分

菜谱大师的建议再完美,也需要厨房管家“验收”。管家手里的记分卡叫 affordance——这是心理学与机器人学中的重要概念,直译为“环境提供给你的行动可能性”:一把摆在桌面上的煎锅“允许”你抓取,而锁在柜子里的煎锅则不具备这种 affordance。SayCan 用机器人的价值函数来量化 affordance:给定当前状态 $s_t$ 和候选动作 $a_t$,模型预测执行该动作的成功概率。

这个分数不是凭空想象的——它来自机器人过去在仿真或真实环境中的交互经验。SayCan 使用强化学习或行为克隆训练一个状态-动作价值函数 $Q(s_t, a_t)$,再将其输出归一化到 $[0, 1]$ 区间,作为 Can 分数。注意,Can 分数刻意不依赖任务目标——厨房管家只回答“这件事物理上能不能做成”,至于“该不该做”是菜谱大师的职责,两者各司其职。

在实践中,Can 分数也可以通过“语言条件下的价值函数”实现,即让同一个价值函数接受自然语言状态描述。这时价值函数不仅能感知物理状态,还能理解部分语义信息,例如“牛奶打翻了”这类文字描述的场景。但无论如何,Can 分数的本源始终是机器人与环境交互的数据。

pCan(at∣st)=Qϕ(st,at)max⁡a′∈AQϕ(st,a′)\displaystyle p_{\text{Can}}(a_t \mid s_t) = \frac{Q_{\phi}(s_t, a_t)}{\displaystyle \max_{a' \in A} Q_{\phi}(s_t, a')}
  1. 价值函数$Q_{\phi}(s_t, a_t)$ 是参数为 $\phi$ 的神经网络输出的状态-动作价值:管家对“现在执行这个动作能积累多少回报”的估计。
    Qϕ(st,at)Q_{\phi}(s_t, a_t)
  2. 最大值归一化取动作空间里价值最高的动作作为分母,把各动作的价值映射到 $[0, 1]$ 的相对成功率:管家给出的“可行性百分比”。
    max⁡a′∈AQϕ(st,a′)\max_{a' \in A} Q_{\phi}(s_t, a')
  3. 可行性语义$p_{\text{Can}}$ 越接近 1,表示该动作在当前环境下越有把握成功;接近 0 表示几乎不可能成功(如鸡蛋已用完还要拿鸡蛋)。
    pCan(at∣st)∈[0,1]p_{\text{Can}}(a_t \mid s_t) \in [0, 1]

决策执行

两位评审的分数乘在一起后,小明一天的工作就变成了一个简单的循环:看分数,选最高,去执行。SayCan 的决策策略是贪心选择(greedy selection)——每一步只选当前乘积得分最高的动作执行,而不去做全局的树搜索。这看似短视,实则聪明:真实世界的状态不断变化,“完美规划”在每一步执行后都可能作废,不如走一步看一步。

这种“观察-评分-执行-再观察”的循环被称为逐步重规划(closed-loop replanning)。每执行完一个动作,机器人重新感知环境状态,再次让 LLM 和价值函数为剩余动作评分。如此循环往复,直到语言模型输出一个特殊的终止信号——“任务完成”。终止判断通常也是 LLM 的能力:当任务目标中的所有关键要素都被满足,LLM 在动作序列末尾自动追加“完成”标志。

贪心策略还有一个隐性的好处:错误容忍。因为每次只执行一步,即使某一步选得不理想,下一步重规划时还能纠正;而如果像传统任务规划一样一次性生成整条动作链,中间任何一环出错都会导致全盘崩溃。当然,贪心并非没有代价——它可能陷入局部最优,比如机器人反复擦同一个盘子而不去处理另一个区域的杂物。因此论文中也讨论了结合 beam search 等轻量搜索的扩展方案,以在“实时性”和“全局性”之间取得平衡。

π(st)=arg⁡max⁡at∈A  pLLM(at∣st,g)×pCan(at∣st)\displaystyle \pi(s_t) = \arg\max_{a_t \in A} \; p_{\text{LLM}}(a_t \mid s_t, g) \times p_{\text{Can}}(a_t \mid s_t)
  1. 策略函数$\pi(s_t)$ 表示在状态 $s_t$ 下机器人应该采取的动作:小明的“决策红宝书”。
    π(st)\pi(s_t)
  2. 最大化操作$\arg\max$ 遍历动作空间 $A$,选出使乘积得分最大的那个动作:在所有候选方案中挑出两位评审的一致首推。
    arg⁡max⁡at∈A\arg\max_{a_t \in A}
  3. 乘积项$p_{\text{LLM}} \times p_{\text{Can}}$ 是综合得分,既不允许“重要但做不了”,也不允许“能做但不重要”。
    pLLM(at∣st,g)×pCan(at∣st)p_{\text{LLM}}(a_t \mid s_t, g) \times p_{\text{Can}}(a_t \mid s_t)

实验效果

理论说得再好,也要上灶台见真章。PaLM-SayCan(Google 将 540B 参数的 PaLM 语言模型接入 SayCan 框架)在位于加州山景城的 Everyday Robots 真实厨房中进行了大规模部署测试。机器人要在真实的厨房环境里执行 101 条多样化指令,涵盖“把红苹果放进碗里”“帮我拿一杯健怡可乐”“把薯片袋合上”等日常任务。结果显示,SayCan 在多数任务上能达到约八成的整体成功率,且能处理包含多步、需要常识推理的复杂指令。

更关键的是消融实验——逐一拆除系统组件来验证每个设计的必要性。论文对比了三种变体:只保留 Say 分数(完全听菜谱大师的)、只保留 Can 分数(完全听厨房管家的)、以及两者相乘的完整 SayCan。结果非常清晰:只靠 Say 分数,机器人会频繁尝试物理上不可能的动作(比如在鸡蛋用完后要求“拿鸡蛋”);只靠 Can 分数,机器人完全失去任务导向,只会反复执行机器人擅长的动作(比如一直擦桌子);只有 Say×Can 的完整版本才能既理解任务又尊重现实。

实验还揭示了一个值得注意的现象:模型的规模确实影响 Say 分数的质量。PaLM-540B 要比小规模语言模型更少产生“幻觉动作”——即提出完全不在机器人动作空间里的指令(比如“去菜市场买葱”)。这印证了在具身智能系统中,语言模型的常识能力是“天花板”,而机器人的价值函数则是“地板”,两者共同决定系统的实际表现。

局限展望

尽管 SayCan 成果亮眼,它的短板也相当明显。最大瓶颈是仿真依赖:Can 分数依赖高质量的机器人交互数据,而真实机器人数据极其昂贵,当前主要靠仿真环境大规模采集。这意味着价值函数的可靠性被“仿真与真实之间的差距”(sim-to-real gap)所制约——厨房管家在仿真店里学到的经验,搬到真实厨房可能失灵(比如仿真里从没出现过“酱油瓶倒了”这种突发状况)。

其次是安全对齐问题。语言模型有幻觉倾向,可能提出危险步骤(如“把刀放在火上烤”)。SayCan 在架构上并没有内置安全机制,只能依赖 LLM 本身的判断和预定义动作空间做软约束。论文中通过“动作空间白名单”来规避:候选动作只能是机器人预先掌握的那些技能,LLM 再神通广大也选不出名单外的动作——这是第一道安全闸门。但更细粒度的安全,比如“擦桌子时不要把花瓶碰倒”,尚无法保证。

面向未来,SayCan 指出了通往 VLA 模型(Vision-Language-Action,视觉-语言-动作统一模型)的路径。既然 Say 和 Can 各自由独立模块实现,能否把“语言理解、视觉感知、动作生成”统一到一个端到端模型中?这正是 RT-1、PaLM-E 等后续工作的方向。对研究者而言,SayCan 的意义不止于一套方法,更是一堂关于“如何让知识与现实握手”的示范课——菜谱大师和厨房管家不一定要合并成一个人,但让两个人高效协作,往往比培养一个全能超人更快见到成效。

AI 应用场景

家庭服务机器人中的多步任务规划

阶段:任务规划与决策(Say 评分 + Can 评分)

解决的问题:传统家用机器人只能执行“扫地”“充电”等预置脚本,无法理解“帮我把客厅的遥控器拿到卧室”这种需要常识和步骤拆解的指令;且对“柜门没开、地毯上有个杯子”等现场障碍缺乏应对。

具体案例:一家养老院试点部署了基于 SayCan 的辅助机器人。老人说“帮我准备吃药”,Say 模块根据医学常识排出“取药盒→接水→送药→确认服用”的步骤;Can 模块实时检查药盒位置、水杯是否干净、老人是否正坐在桌边,每步只在确认可行时执行。遇到“药盒被杂物压住”的情况,机器人会调整步骤为“先挪开杂物再取药盒”。

工业柔性装配中的动态工序调度

阶段:在线重规划与执行(贪心选择 + 逐步重规划)

解决的问题:传统装配产线的工序顺序固定,一旦某个工位缺料或设备故障,整条产线需人工停线调整。SayCan 的“走一步看一步”范式让装配顺序随现场状态动态自适应。

具体案例:某汽车零部件工厂使用 SayCan 式调度:装配机器人接收自然语言目标“完成变速箱壳体组装”。Say 模块按工艺手册排出“装密封圈→装轴承→上紧螺栓”的重要性顺序;Can 模块实时查询物料传感器——若密封圈缺货,该动作 Can 分骤降,系统自动调整为先完成轴承装配,待补料后再回头装密封圈,产线利用率提升约 15%。

仓储物流中的目标导向分拣

阶段:环境感知与决策融合(affordance 评估)

解决的问题:分拣机器人面对密集货架时,“知道要取哪个包裹”不难,“知道先取哪个、哪个够得着”才是难点。Can 分数天然适合评估“手臂能否触达”“包裹是否被压住”这类物理可行性。

具体案例:某电商仓库部署 SayCan 式分拣策略。系统收到“把高价值包裹优先装车”的指令,Say 模块对每个待拣包裹按价值排序;Can 模块通过三维感知判断每个包裹的抓取可行性,两者乘积决定实际拣选顺序。实验表明,相比固定优先级策略,动态加权方案减少了 23% 的机械臂空转时间。

Python 演示

python67 行
"""SayCan 简化决策循环:LLM 常识评分 × 机器人 affordance 评分"""class SayCanPlanner:    def __init__(self, lang_model, affordance_model, action_space):        self.lang_model = lang_model        self.affordance_model = affordance_model        self.action_space = action_space     def say_score(self, action, goal):        return self.lang_model.action_probability(action, goal)     def can_score(self, action, state):        return self.affordance_model.success_probability(action, state)     def choose_action(self, state, goal):        best_action, best_score = None, -1.0        for action in self.action_space:            score = self.say_score(action, goal) * self.can_score(action, state)            print("  {:<5s} say={:.2f} can={:.2f} prod={:.3f}".format(                action, self.say_score(action, goal),                self.can_score(action, state), score))            if score > best_score:                best_action, best_score = action, score        return best_action, best_score  class MockLangModel:    def __init__(self):        self.table = {            "做早餐": {"拿煎锅": 0.82, "拿鸡蛋": 0.74, "弹钢琴": 0.06, "开冰箱": 0.58},            "收拾房间": {"扫地": 0.80, "看电视": 0.05, "整理床铺": 0.72, "开冰箱": 0.20}        }     def action_probability(self, action, goal):        return self.table[goal][action]  class MockAffordanceModel:    def __init__(self):        self.table = {            "正常": {"拿煎锅": 0.91, "拿鸡蛋": 0.15, "弹钢琴": 0.95, "开冰箱": 0.72},            "拥挤": {"扫地": 0.60, "看电视": 0.98, "整理床铺": 0.85, "开冰箱": 0.20}        }     def success_probability(self, action, state):        return self.table[state][action]  def main():    planner = SayCanPlanner(        MockLangModel(), MockAffordanceModel(),        ["拿煎锅", "拿鸡蛋", "弹钢琴", "开冰箱"])    state, goal = "正常", "做早餐"    print("goal={} state={}".format(goal, state))    action, score = planner.choose_action(state, goal)    print("chosen={} score={:.3f}".format(action, score))     state, goal = "拥挤", "收拾房间"    planner2 = SayCanPlanner(        MockLangModel(), MockAffordanceModel(),        ["扫地", "看电视", "整理床铺", "开冰箱"])    print("\ngoal={} state={}".format(goal, state))    action, score = planner2.choose_action(state, goal)    print("chosen={} score={:.3f}".format(action, score))  if __name__ == "__main__":    main()
目的:用两个模拟模型复现 SayCan 的乘积评分与贪心决策流程,展示“重要度 × 可行性”如何在给定目标与环境状态下选出最终动作。
  1. score = self.say_score(action, goal) * self.can_score(action, state)核心公式:Say 分与 Can 分相乘,一步实现双模块融合。
  2. if score > best_score贪心选择逻辑,遍历动作空间并保留当前最高分动作。
  3. self.table[goal][action]在模拟语言模型中用二维表存储“任务-动作”的归一化概率,模拟 LLM 输出。
  4. self.table[state][action]模拟 affordance 模型在不同环境状态下对每个动作的成功概率预测。
  5. state, goal = "正常", "做早餐"设置场景参数,对应论文中真实厨房实验的“当前状态 + 用户指令”。

常见误区

误区“SayCan 里的语言模型就像 ChatGPT 一样,直接告诉机器人'抬手臂 30 度、往左移 10 厘米',机器人就照做了。”

正解语言模型在整个系统中只负责一件事:对候选动作的文本标签进行重要性打分。它从不输出关节角度、力矩等底层控制指令,也看不到真实图像。真正决定“手往哪伸、用多大力”的是底层运动控制器和价值函数。正如菜谱大师永远不会碰锅铲,他只是口头排序,掂勺的是厨房管家。

为何常见:因为 LLM 能生成详细的文本指令,人们天然以为“能说就能做”,忽略了语言符号与物理控制之间的鸿沟正是 SayCan 要填补的。

误区“Can 分数就是让机器人在仿真里把每个动作做一万次,统计成功的次数除以总次数。”

正解Can 分数来自价值函数的估计,不是直接统计频率。价值函数是在交互数据上训练的神经网络,它输出的是“期望回报”的预测,再经过归一化变成成功概率的近似。既然是估计,就有误差——尤其当环境偏离训练分布(比如仿真里从没出现过“鸡蛋用完”)时,Can 分数会非常不可靠。管家对库存的记忆可能过时,这正是闭环重规划存在的原因之一。

为何常见:“概率”这个词容易让人联想到频率统计,而忽略了它本质上是函数逼近器的输出。

误区“既然 LLM 提供了免费常识,价值函数也是现成的,整个 SayCan 系统装好就能在家干活。”

正解两个模块各自都需要训练:LLM 需要大规模预训练(PaLM-540B 本身就是海量算力的产物),Can 分数对应的价值函数需要在机器人交互数据上通过强化学习或行为克隆训练,且部署到新环境时往往还需要微调校准。即便是论文中的实机实验,也经过了充分的仿真预训练和真实环境适配。说“不用训练”就像说“米其林大厨的菜谱网上都有,你照着做就能开餐厅”——忽略了大厨从业二十年的事实。

为何常见:新闻报道常强调“零样本泛化”这类听感惊艳的词,让人误以为整个系统无需任何训练数据。

误区“Say×Can 只偏爱两个分数都高的动作,会不会漏掉某个 Say=0.6、Can=0.6 但综合更合理的选项?”

正解乘积本质上是“交集”的连续化建模,它在数学上并不会“漏掉”任何动作——所有动作都会得到分数并被排序。真正的问题是:乘法比加法更严格,它要求动作在两个维度上都不能有明显短板。比如 action_A(say=0.82, can=0.91)得分 0.746,action_B(say=0.9, can=0.8)得分 0.72,A 胜出——因为它“两条腿都站得稳”。若改用加法,B 可能因单维度极高而胜出,但 B 的 can=0.8 在实际中往往意味着更高的失败风险。乘积偏保守,这在安全敏感的机器人领域恰恰是优点。

为何常见:直觉上觉得加法更“公平”,但忽略了加法允许一个极高分数完全掩盖另一维度的缺失,而缺失项在物理世界可能导致灾难。

面试题

Q1. SayCan 中“Say 分数”由哪个模块产生?

单选题 · easy

  • A.大语言模型← 正确答案
  • B.视觉感知模型
  • C.机器人价值函数
  • D.动作执行控制器

答案:A。Say 分数由 LLM 根据任务目标和当前状态为候选动作打重要性分,对应“菜谱大师”的职责。价值函数负责 Can 分数,感知模型负责状态读取,控制器负责底层执行,均不产生 Say 分。

Q2. SayCan 中“Can 分数”评估的是动作的什么属性?

单选题 · easy

  • A.语言表达的流畅性
  • B.环境中的可执行概率← 正确答案
  • C.计算资源的消耗率
  • D.电池续航的剩余量

答案:B。Can 分数由价值函数输出,衡量在给定状态下执行该动作的成功概率,即“厨房管家”的可行性评估。语言流畅性、资源消耗、电量都与 affordance 无关。

Q3. "affordance"在机器人学中最接近的含义是?

单选题 · easy

  • A.环境提供给主体的动作可能性← 正确答案
  • B.物体表面的颜色纹理
  • C.机器人的电池容量大小
  • D.语言模型的参数量级

答案:A。affordance 源于生态心理学,指环境“允许”主体采取的行动可能,如台面上的煎锅可被拿起、锁在柜里的则不可。颜色是感知属性,电池是硬件属性,参数量是模型属性,均与 affordance 无关。

Q4. SayCan 的最终动作得分是怎样计算的?

单选题 · mid

  • A.Say 分数加上 Can 分数
  • B.Say 分数减去 Can 分数
  • C.Say 分数乘以 Can 分数← 正确答案
  • D.取 Say 与 Can 的最大值

答案:C。核心公式是 score = say × can。乘法要求动作“既重要又可做”,任何一项过低都会压低总分;加法会被单维度高分主导,最大值则完全忽略另一维度,都不符合“交集”语义。

Q5. 关于 LLM 在 SayCan 中的输出,下列说法正确的是?

单选题 · mid

  • A.直接输出机械臂的关节角度
  • B.输出候选动作的归一化概率← 正确答案
  • C.输出环境的三维点云数据
  • D.输出底层 PID 控制参数

答案:B。LLM 对候选动作打分后经 softmax 归一化为概率分布,表示步骤的重要性排序。它不接触关节空间、点云或控制参数,这些分别属于感知和底层控制模块。

Q6. 当某动作 Say 分很高但 Can 分极低(如鸡蛋用完还要拿鸡蛋),最终会发生什么?

单选题 · mid

  • A.乘积被压低,动作被否决← 正确答案
  • B.因 Say 高所以照常执行
  • C.系统报错并终止任务
  • D.自动切换到仿真模式运行

答案:A。乘积评分机制下,can≈0 会把整个乘积压到接近 0,该动作排到队尾被否决,系统转而去选下一个“既重要又可做”的动作。这正是 SayCan 相比纯 LLM 排序的核心优势。

Q7. 下列哪些是 SayCan 相比传统固定脚本机器人的优势?

多选题 · mid

  • A.利用 LLM 常识适应开放任务← 正确答案
  • B.保证所有动作绝对安全无风险
  • C.通过逐步重规划应对环境变化← 正确答案
  • D.完全不需要任何机器人数据

答案:AC。LLM 提供任务常识让系统理解开放指令,逐步重规划让系统每步根据最新状态调整动作,两者都是脚本系统缺乏的。但安全仍需预置约束,且 Can 分数必须用机器人交互数据训练,并非零数据。

Q8. 在 PaLM-SayCan 的消融实验中,去掉 Can 分数会导致什么?

多选题 · mid

  • A.机器人频繁尝试物理上不可能的动作← 正确答案
  • B.机器人彻底失去任务导向← 正确答案
  • C.机器人只重复执行擅长的动作
  • D.机器人表现基本不受影响

答案:AB。去掉 Can 分数后系统只听 LLM 的,会提出并尝试“拿鸡蛋”这类不可行动作(选 A)。完全相反地,去掉 Say 分数后系统失去任务导向,只会重复擅长动作(这是不含选项中的另一情况)。可见 B 应改为对应去掉 Say 的情况,本题目的是区分两种消融后果——去掉 Can 对应“纸上谈兵”,去掉 Say 对应“原地打转”。

Q9. 关于 SayCan 的贪心决策策略,下列说法正确的是?

单选题 · hard

  • A.每步只选当前乘积得分最高的动作← 正确答案
  • B.一次性规划整条动作链再逐步执行
  • C.随机采样动作后离线重排优先级
  • D.用蒙特卡洛树搜索全局最优路径

答案:A。SayCan 每步根据当前状态重新评分并贪心选择最高分动作,执行后再感知、再评分,即闭环重规划。它不做全局树搜索,也不一次性规划完整动作链,因此对单步错误有天然容忍度。

Q10. SayCan 中价值函数(Can 分数)主要通过什么方式获得?

单选题 · hard

  • A.强化学习或行为克隆训练← 正确答案
  • B.从纯文本语料直接推理
  • C.手动编写全部规则硬编码
  • D.在线问答社区的众包标注

答案:A。Can 分数来自价值函数,它需要在机器人交互数据上通过强化学习或行为克隆训练,仿真环境是主要数据来源。文本语料不含物理交互,规则硬编码无法覆盖开放环境,众包标注与机器人控制无关。