ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Vesta 方法详解 - S-X

2026/8/11 23:10:43 拓冰建站 浏览量
Vesta 方法详解 - S-X

Vesta 方法详解:让一个 VLM 成为机器人的高层“大脑”

一句话理解 Vesta:它用一个视觉语言模型统一负责“看懂场景、回忆过去、判断进度、决定下一步”,再把自然语言子任务交给低层控制器执行。


1. 先看全貌:Vesta 到底是什么?

Vesta 是一个机器人的高层规划器

它接收三类信息:

  • 人给出的总目标;
  • 机器人现在看到的画面;
  • 机器人过去看过什么、做过什么。

然后,它输出下一步应该做的事情。

flowchart LRG["总目标<br/>找到苹果并放到桌上"] --> V["Vesta<br/>高层大脑"]C["当前画面"] --> VM["历史图像 + 已做过的子任务"] --> VV --> Z["下一步子任务<br/>打开右下抽屉"]Z --> A["低层控制器 Actor"]A --> R["机器人真正运动"]R --> C

这里最容易误解的一点是:

Vesta 不直接输出机械臂的关节角度,也不负责每一帧的运动控制。

它更像一个现场指挥者:

flowchart TBP["Vesta:想清楚下一步做什么"]A["Actor:把这一步真正做出来"]E["环境:动作后产生新画面"]P -- "拿起绿色梨" --> AA -- "连续电机动作" --> EE -- "最新相机画面" --> P

Vesta 论文主要研究的是上面的 Planner,而真实机器人实验中的低层 Actor 使用 Gr00t-N1.6。


2. Vesta 想解决什么问题?

2.1 传统方案:每种能力放一个专家模型

机器人需要很多高层能力:

  • 定位物体;
  • 理解空间关系;
  • 按语言指令导航;
  • 回答具身问题;
  • 规划长任务的下一步。

传统系统通常为每种能力准备一个模型。

flowchart LRI["机器人输入"] --> L["定位模型"]I --> N["导航模型"]I --> Q["问答模型"]I --> P["规划模型"]L --> S["复杂的多模型系统"]N --> SQ --> SP --> S

这种方案的问题是:模型多、部署复杂、推理慢,而且前一个模型出错后,错误会继续传给后面的模型。

2.2 Vesta 的做法:一个模型统一处理

Vesta 把这些能力放进同一个 VLM,并把不同任务的答案都表示成文本。

flowchart TBV["一个 Vesta"] --> L["定位<br/>输出点或框"]V --> N["导航<br/>输出前进位置、转向或停止"]V --> Q["具身问答<br/>输出自然语言答案"]V --> P["动作规划<br/>输出下一条子任务"]L --> H["统一由语言头生成"]N --> HQ --> HP --> H

例如:

任务 Vesta 的输出
“红杯子在哪里?” 一个点或框坐标
“走到浴室门口” 前方落点、左转/右转或 STOP
“现在任务做到哪了?” 自然语言进度描述
“下一步做什么?” “打开右下抽屉”

所以,Vesta 的第一条核心思想是:

让定位、导航、推理和规划共享同一个视觉语言模型,并统一成“看图后生成文本”的任务。


3. 真正关键的机制:图文混合记忆

只统一任务还不够。机器人执行长任务时,最大的困难是:当前画面并不能告诉它过去发生了什么。

3.1 为什么机器人必须记住过去?

论文使用的三个真实机器人任务很直观:

flowchart TBF["寻找物体"] --> F1["必须记住哪些抽屉已经找过"]C["数水果"] --> C1["必须记住已经放进篮子几个"]M["记住糖果颜色"] --> M1["盒子关上后,仍要记得里面糖果的颜色"]

如果模型只看当前帧,它很可能:

  • 重复打开同一个抽屉;
  • 多放或少放一个水果;
  • 盒子关上后忘记糖果颜色。

因此,Vesta 的决策不是简单的:

\[\text{下一步}=\text{模型}(\text{当前画面}) \]

而是:

\[z_t=\pi(g,o_t,\mathcal M_t) \]

其中:

  • \(g\) 是总目标;
  • \(o_t\) 是当前画面;
  • \(\mathcal M_t\) 是过去的记忆;
  • \(z_t\) 是下一条高层子任务。

3.2 Vesta 记住两种东西

Vesta 的记忆非常简单,没有专门训练一个复杂的记忆网络。

它只保存:

  1. 历史图像:过去真实看到了什么;
  2. 历史子任务文字:过去决定做过什么。
flowchart LRI["历史图像"] --> I1["保留真实视觉证据"]I --> I2["看清物体、位置和场景变化"]T["历史子任务文字"] --> T1["快速概括做过什么"]T --> T2["帮助判断任务进度"]I1 --> M["图文混合记忆"]I2 --> MT1 --> MT2 --> M

为什么两种都要?

记忆方式 问题
只有图像 模型要从很多画面里重新总结进度,容易误判
只有文字 模型容易过度相信历史日志,忽略现实是否真的变化
图像 + 文字 文字负责概括,图像负责核验,效果最好

论文的消融结果也支持这一点:图文混合记忆明显好于只用图像或只用文字。

3.3 历史图像不能无限增加

机器人运行越久,历史图片越多。如果全放进模型,上下文会越来越长,速度也会越来越慢。

Vesta 的处理方式很朴素:

  • 只保留有限数量的历史图片;
  • 第一帧始终保留,用来记住初始状态;
  • 其余图片可以均匀抽样,也可以偏向最近的图片;
  • 历史子任务继续以文字日志的形式保留。
flowchart LRH["全部历史"] --> F["始终保留第一帧"]H --> S["从其余历史中采样少量图片"]H --> T["保留过去的子任务文字"]F --> M["紧凑的记忆上下文"]S --> MT --> MM --> V["再次输入 Vesta"]

论文比较了均匀采样和近期偏置采样,两者效果接近。这说明:

记忆中同时有图像和文字,比用多复杂的采样算法更重要。

3.4 记忆构建伪代码

函数 构建记忆(历史, 图片上限 K):如果没有历史:返回空记忆历史图片 = 保留第一帧历史图片 += 从其余帧中抽取最多 K-1 张# 可以均匀抽取,也可以偏向最近的帧历史文字 = 按顺序记录过去输出的子任务# 例如:检查右上抽屉、检查左下抽屉返回 历史图片 + 历史文字

历史图片上限 \(K\) 的具体数值没有在论文中公开。

这就是 Vesta 的第二条核心思想:

用少量历史图片保存视觉证据,用子任务文字保存语义进度,再把二者重新放进下一次 prompt。


4. Vesta 每次怎样思考下一步?

动作规划时,Vesta 不直接只吐出一句动作,而是按四个阶段思考:

flowchart LRO["Observation<br/>现在看到了什么"] --> P["Progress<br/>任务做到哪了"]P --> R["Reasoning<br/>下一步为什么这样做"]R --> A["Action<br/>最终子任务"]

例如:

Observation: 当前打开的抽屉里可以看到苹果。
Progress: 搜索已经完成,但苹果还没有被取出。
Reasoning: 现在不应继续搜索,应该先取出苹果。
Action: 从抽屉里取出苹果。

四段的作用分别是:

阶段 解决的问题
Observation 防止模型忽略当前画面
Progress 强迫模型把当前状态和历史联系起来
Reasoning 判断应该继续当前动作,还是切换下一步
Action 给低层 Actor 一条明确、可执行的子任务

只有最终的 Action 会写进记忆,前三段不会不断累积。

flowchart LRO["Observation"] --> X["只用于本次推理"]P["Progress"] --> XR["Reasoning"] --> XA["Action"] --> M["写入历史子任务记忆"]A --> ACT["发给低层 Actor"]

这样做可以保留“做过什么”,又不会让冗长的推理过程把上下文撑满。


5. 模型结构:简单理解就够了

Vesta 没有提出一套全新的神经网络骨干。它从 Qwen3-VL-8B-Instruct 开始训练。

从方法层面,只需要理解三部分:

flowchart LRI["图像 / 视频"] --> V["视觉编码器<br/>看懂画面"]T["目标 / 问题 / 文字记忆"] --> L["语言模型<br/>综合推理"]V --> LL --> O["语言输出头<br/>生成答案、坐标或子任务"]

Vesta 真正的变化主要不在网络结构,而在:

  1. 用什么数据训练;
  2. 怎样把多种具身任务统一起来;
  3. 推理时怎样加入图文记忆;
  4. 怎样连接高层 Planner 和低层 Actor。

因此,不需要记住底座每层的维度,也能理解 Vesta 的方法本身。


6. Vesta 是怎样训练出来的?

6.1 训练目标:把一个通用 VLM 变成具身通才

Vesta 使用六类数据做监督微调:

pie showDatatitle Vesta 的 SFT 数据组成"空间智能" : 27.1"导航" : 21.8"定位" : 20.8"通用 VLM" : 16.2"具身推理" : 9.8"真实机器人" : 4.3

每类数据负责的能力可以简单理解为:

数据 教会模型什么
空间智能 理解方向、距离、遮挡和空间关系
导航 根据路线指令和第一视角图像决定往哪里走
定位 把语言描述对应到图像中的点或区域
通用 VLM 保留常识、语言理解和普通视觉问答能力
具身推理 判断物体能否抓、放在哪里、任务进行到哪一步
真实机器人 适应机器人视角、真实遮挡和实际操作场景
flowchart LRB["通用视觉语言能力"] --> S["空间理解"]S --> E["具身推理"]E --> P["长任务规划"]R["真实机器人数据"] --> P

Vesta 对 Qwen3-VL-8B 做的是全参数 SFT:视觉部分、连接部分和语言模型一起更新,而不是只训练一个小适配器。

6.2 为什么要特别增加“动作切换”样本?

一段操作视频里,大多数时间都在重复执行当前动作;真正需要切换到下一步的时刻很少。

timelinetitle 一段长任务里的两类时刻section 打开抽屉执行阶段 : 继续打开执行阶段 : 继续打开转场时刻 : 抽屉已打开,应该开始寻找section 取出苹果执行阶段 : 继续抓取转场时刻 : 苹果已拿到,应该放到桌上

如果直接按原视频采样,模型很容易学成“永远继续当前动作”。

所以 Vesta 将稀少的转场样本做 \(2\times\) 过采样,让模型更会判断:

  • 当前动作是否完成;
  • 什么时候应该切换;
  • 下一步应该换成什么。

这是一个很小但很重要的数据设计。

6.3 Loss:本质上就是监督模型生成正确答案

所有任务最后都变成文本生成,因此可以共用标准的自回归交叉熵:

\[\mathcal L =-\sum_j\log p_\theta(y_j\mid x,y_{<j}) \]

直观理解:

flowchart LRX["图像 + 指令 + 记忆"] --> V["Vesta"]V --> P["预测下一个 token"]Y["标准答案"] --> C["比较预测与答案"]P --> CC --> U["更新整个模型"]

无论标准答案是坐标、导航动作、自然语言答案,还是下一条子任务,都用同一种方式训练。

论文公开的训练流程是 SFT,并没有使用强化学习。


7. 推理时怎样真正运行?

7.1 机器人操作:Planner 和 Actor 循环配合

sequenceDiagramparticipant E as 机器人与环境participant V as Vesta Plannerparticipant M as 图文记忆participant A as 低层 ActorE->>V: 当前画面 + 总目标M->>V: 历史图片 + 历史子任务V->>V: 观察、判断进度、推理V->>A: 下一条自然语言子任务V->>M: 记录本次图像和子任务A->>E: 连续执行低层动作E->>V: 动作后的新画面

主论文采用同步方式:需要重新规划时,Actor 暂停,等待 Vesta 给出新子任务;得到结果后继续运动。

论文也实现了异步方式:Vesta 在后台持续规划,Actor 使用最新缓存的子任务,这样运动更连续,但规划看到的图像可能稍旧。

7.2 导航:Vesta 决定高层动作,导航后端负责走过去

导航时,Vesta 接收路线指令、当前画面和少量历史画面,然后输出三类结果:

flowchart TBV["Vesta 导航决策"] --> P["前方落点<br/>去图像中的某个位置"]V --> T["左转 / 右转序列"]V --> S["STOP<br/>认为已经到达"]P --> B["低层导航后端执行"]T --> B

Vesta 不负责每个物理仿真步,只负责高层决策。移动完成后,它再看新画面并重新判断。

循环直到任务结束:读取当前画面从历史中抽取少量画面动作 = Vesta(路线指令, 历史画面, 当前画面)如果动作是 STOP:结束否则:让导航后端执行该动作保存当前画面,进入下一轮

8. 贯穿示例:寻找抽屉里的苹果

任务:找到苹果,把它放到桌上,而且不能重复打开同一个抽屉。

第一步:刚开始搜索

当前画面:四个关闭的抽屉
历史:空Vesta 输出:
Observation: 面前有四个关闭的抽屉。
Progress: 尚未开始搜索。
Reasoning: 应先检查一个抽屉。
Action: 检查右上抽屉。

Actor 打开右上抽屉,里面没有苹果。

Vesta 把“检查右上抽屉”和当时的画面写入记忆。

第二步:避免重复搜索

flowchart TBG["目标:找到苹果并放到桌上"] --> V["Vesta"]M1["文字记忆:检查过右上抽屉"] --> VI1["历史图像:右上抽屉是空的"] --> VC["当前画面:回到抽屉柜前"] --> VV --> A["Action:检查左下抽屉"]

这里,文字记忆让 Vesta 快速知道“右上已经查过”,历史图像让它确认右上抽屉确实是空的。

第三步:发现苹果后切换动作

假设苹果出现在右下抽屉。

Observation: 右下抽屉已经打开,里面可以看到苹果。
Progress: 搜索阶段完成,但苹果还没有被取出。
Reasoning: 不需要继续搜索,下一步应该取出苹果。
Action: 从右下抽屉中取出苹果。

这一步体现了转场训练的价值:模型不再机械地“继续找”,而是发现上一阶段已经完成,并切换到正确下一步。

完整闭环

flowchart LRA1["检查右上抽屉"] --> O1["没有苹果"]O1 --> A2["检查左下抽屉"]A2 --> O2["没有苹果"]O2 --> A3["检查右下抽屉"]A3 --> O3["发现苹果"]O3 --> A4["取出苹果"]A4 --> A5["把苹果放到桌上"]

整个过程中,Vesta 做的是“决定下一条子任务”,Actor 做的是“把该子任务执行出来”。


9. 为什么这个简单方法有效?

Vesta 并没有依赖复杂的新网络,而是把几个简单设计组合得很好。

flowchart TBU["统一模型<br/>定位、导航、推理、规划共享能力"] --> V["Vesta"]D["空间偏置的多任务数据<br/>把通用 VLM 训练成具身通才"] --> VM["图文混合记忆<br/>同时保存证据和进度"] --> VT["转场过采样<br/>学会什么时候切换动作"] --> VH["Planner-Actor 分层<br/>慢思考与快控制分开"] --> V

可以把它的成功原因归纳为五点:

  1. 统一能力:不同任务互相提供帮助,而不是各自孤立训练;
  2. 数据比新结构更重要:空间、导航、具身和真实机器人数据共同塑造能力;
  3. 记忆足够简单:不需要复杂检索器,少量图片加文字日志已经很有效;
  4. 专门学习动作切换:解决“永远继续当前动作”的常见问题;
  5. 高低层分工明确:Vesta 负责想,Actor 负责做。

10. 方法的边界

理解 Vesta 时,也要知道它没有解决什么:

  • 它不是端到端的机器人动作模型;
  • 记忆是当前 episode 内的短期记忆,不是跨天、跨任务的终身记忆;
  • 历史图片靠简单采样,不会主动学习“哪张最重要”;
  • Actor 如果执行失败,Planner 不一定能完全补救;
  • 真实机器人只在一种双臂平台和三个任务上验证;
  • 论文没有公开完整代码,也没有公开图片预算 \(K\)、完整 prompt 等全部复现细节。

11. 一分钟总结

flowchart TBA["1. 用 Qwen3-VL-8B 作为基础"] --> B["2. 用定位、导航、空间推理和机器人数据统一 SFT"]B --> C["3. 推理时加入少量历史图像和过去子任务文字"]C --> D["4. 按观察、进度、推理、动作四步决定下一子任务"]D --> E["5. 把自然语言子任务交给低层 Actor"]E --> F["6. 环境产生新画面,再进入下一轮"]F --> C

最后只需记住这句话:

Vesta 的核心不是发明一个复杂的新模型,而是把“统一的具身多任务训练、图文混合记忆、四阶段规划、Planner-Actor 闭环”组合成一个简单而有效的机器人高层大脑。