文章目录

1、LLM 首字延迟

我们需要先定义什么是“实时”:

  1. 首字延迟 (TTFT, Time To First Token):从用户输入完毕到模型吐出第一个字的时间。目前目标是 < 100ms - 500ms(接近人类反应速度)。
  2. 生成速度 (Tokens Per Second, TPS):模型每秒生成的字数。目前目标是 20-100+ tokens/sec(接近流畅对话速度)。

1.1. 未来展望:超越 Transformer?

目前 LLM 的自注意力机制复杂度是 O ( N 2 ) O(N^2) O(N2),在处理超长序列时依然吃力。为了实现更极致的实时,业界正在探索新架构:

  1. Mamba / SSMs (State Space Models)

    • 复杂度为 O ( N ) O(N) O(N),理论上是线性的。
    • 推理速度比 Transformer 快得多,适合长上下文实时处理。
    • 现状:正在被整合进混合架构中(如 Jamba 模型)。
  2. MoE (Mixture of Experts)

    • 每次只激活部分参数。
    • 在保持大模型能力的同时,减少推理时的计算量,提高速度。

2、每轮对话生成新token需要和历史全部token进行注意力计算

在你输入“提示词”(Prompt)的阶段,文字是“一次性”进入模型进行计算的。

但是,为了生成回复,模型会分两步走:第一步处理你的输入(批量/并行),第二步生成回答(逐个/串行)。

让我们详细拆解这个过程:

2.1 第一阶段:处理你的输入(Parallel / 并行)

当你发送“你好,帮我写代码”这句话时,模型并不是一个字一个字地读(像人读书那样从左到右逐字扫视),而是同时处理这10个 token。

  1. Embedding:10个 token 同时被转换为10个向量。
  2. Self-Attention
    • 这10个向量同时进入 Transformer 层。
    • 在第1层,每个位置都会与其他所有位置(包括它自己)计算注意力。
    • 例如:理解第3个字“帮”时,模型会同时参考第1个字“你”、第2个字“好”、第4个字“我”等所有其他字的信息。
  3. 结果:经过多层 Transformer 后,你输入的这10个字变成了10个新的、富含上下文信息的向量。这些向量被存入 KV Cache

为什么可以并行?
因为 Self-Attention 允许每个位置“看到”整个序列。你不需要先知道第1个字才能理解第2个字,因为数学上可以同时计算所有关系。这就是为什么 LLM 推理提示词(Prompt Processing)速度很快。

2.2 第二阶段:生成回复(Sequential / 串行)

一旦你的输入处理完毕,模型开始生成回答(比如它想回复“没问题”)。这时候,逻辑就变了:

  1. 生成第1个字“没”

    • 模型使用最后一个位置(即“码”字)的上下文向量。
    • 它计算这个向量与 KV Cache 中所有历史 K/V 的注意力。
    • 输出概率最高的 token:“没”。
    • 关键点:现在,“没”成为了序列的一部分。
  2. 生成第2个字“问”

    • 模型现在有一个更长的序列:“你好,帮我写代码没”。
    • 它只针对新加的这个“没”字计算 Q/K/V。
    • 它将这个新的 Q 与旧的 KV Cache(包含“你好…”和现在的“没”)进行注意力计算。
    • 输出下一个 token:“问”。
  3. 循环:重复上述步骤,直到生成结束符 <EOS>

总结对比

阶段 输入方式 注意力计算方式 速度 原因
处理提示词 (Prompt) 一次性全部输入 并行计算:所有10个字同时互相计算注意力 因为不需要依赖生成的结果,可以直接利用 GPU 并行计算能力。
生成回复 (Decoding) 逐个生成 串行计算:每次只生成1个字,并更新 KV Cache 因为生成第 N 个字必须依赖前 N-1 个字的结果,无法并行。
  • 你的输入(10个字)一次性进入,并行计算自注意力。
  • 模型的回复一个字一个字生成,串行计算自注意力。

3、第二轮对话的过程

第二轮对话的实际执行流程

假设第一轮你说了:“你好”,模型回了:“你好,有什么可以帮你?”
现在第二轮你问:“写代码。”

模型内部发生的过程如下:

3.1 第一步:拼接序列(Concatenation)

模型并不区分“第一轮”和“第二轮”。它构建了一个新的输入序列:
[你好] [有什么] [可以] [帮你]? [写] [代码]。
(假设标点也被作为 Token 处理)

3.2 第二步:生成 Q, K, V
  • 对于新输入的 “写” 和 “代码”,模型通过线性层生成它们的 Q_new, K_new, V_new
  • 关键点:对于历史 token(“你好”…“帮你”?),模型不使用新的 Q/K/V,而是直接使用第一轮计算并缓存好的 KV Cache
3.3 第三步:执行自注意力计算

这是最关键的一步。模型执行自注意力机制,但此时的“序列”变长了。

  • 查询(Query)
    • 新 token “写” 的 Q (Q_new_1)。
  • 键(Key)
    • 模型将 Q_new_1整个序列的 K 进行比对。
    • 整个序列的 K 包括:
      1. 历史 token 的 K(从 KV Cache 中读取)。
      2. 新 token “代码” 的 K(刚计算出来)。
  • 值(Value)
    • 模型将 Q_new_1 与整个序列的 V 进行加权求和。
    • 整个序列的 V 包括:
      1. 历史 token 的 V(从 KV Cache 中读取)。
      2. 新 token “代码” 的 V(刚计算出来)。

公式表达:
Attention ( Q n e w , K h i s t o r y + n e w , V h i s t o r y + n e w ) \text{Attention}(Q_{new}, K_{history+new}, V_{history+new}) Attention(Qnew,Khistory+new,Vhistory+new)

因为 Q Q Q K , V K, V K,V 都来自同一个序列(尽管 K , V K, V K,V 的一部分来自缓存),所以这仍然是自注意力

4、第二轮对话的延迟

4.1. ITL 的全称是什么?

ITL 的全称是 Inter-Token Latency
中文常称为:词元间延迟生成延迟

  • 别名:它也被称为 TPOT (Time Per Output Token,每个输出词元的时间)。
  • 定义:从模型生成第 N N N 个 token 结束,到生成第 N + 1 N+1 N+1 个 token 结束 所花费的时间间隔。
  • 通俗理解:就是“字与字之间”跳出来的时间间隔。比如你看到模型每秒钟出 50 个字,那么 ITL 大约是 1000 m s / 50 = 20 m s 1000ms / 50 = 20ms 1000ms/50=20ms

4.2 ITL 不仅仅是“等待”,它包含了完整的计算!

在第二轮(或后续步骤)中,生成第 51 个 token 的过程并不是“凭空出现”的,它必须重新跑一遍完整的 Transformer 前向传播(Forward Pass),只不过这次不需要重新计算历史部分的 Embedding 和 KV Cache

具体来说,生成第 51 个 token 时,GPU 做的动作如下:

4.2.1 第一步:新 Token 的嵌入 (Embedding)
  • 动作:将你输入的第 51 个 token(假设是“你”)转换成向量。
  • 耗时:极短,因为只有一个 token。
4.2.2 第二步:自注意力计算 (Self-Attention) —— 这是大头
  • 动作
    1. 生成“你”的 Q, K, V。
    2. 检索 KV Cache:GPU 从显存中读取之前 1050 个 token 的 K 和 V。
    3. 计算 Attention:将“你”的 Q 与 所有 1050 个 K 进行点积运算。
    4. 加权求和:根据结果,混合 所有 1050 个 V
  • 耗时:这是 ITL 中耗时最长的部分。虽然不需要重新计算历史的 Q,但注意力矩阵的计算量依然很大(取决于上下文长度)。
    • 注意:如果使用了滑动窗口,这里可能只计算最近的一部分,耗时会短一些;如果是全注意力,这里非常重。
4.2.3 第三步:前馈神经网络 (Feed-Forward Network / MLP)
  • 动作:将 Attention 的输出向量通过两层全连接网络,提取高级语义特征。
  • 耗时:固定,取决于模型层数和参数量。
4.2.4 第四步:输出层 (LM Head) & 采样 (Sampling)
  • 动作
    1. 将最终向量映射到词表大小(比如 32,000 个可能的词)。
    2. 计算每个词的概率。
    3. 根据概率采样出一个 token(比如“好”)。
  • 耗时:通常很快,但涉及 softmax 和采样算法。

无论是一开始还是最后,只要生成一个新 token,模型就必须基于当前的 Q全局的 KV 重新算一次注意力,没有任何捷径可以跳过这一步(除非使用特殊的非自回归模型,但那不是当前的 LLM 主流)。

5、VLA 中,LLM模型的两种模式:输出token、输出隐藏状态向量

VLA 的输出分为两种主流模式来理解:

5.1 模式一:离散 Token 化动作(Discretized Actions)—— 类似“说话”

这是目前最主流、也是 Google RT-2、OpenVLA 等模型采用的方式。

  1. 原理
    • 模型仍然是一个自回归的 LLM
    • 它输出的依然是一串 Token ID(整数)。
    • 区别在于:这串 Token ID 不再代表“单词”(如 “apple”),而是代表预先定义好的动作代码
  2. 流程
    • 用户说:“拿起杯子”。
    • LLM 内部思维:[Thought] -> [Act: 0x12] -> [Act: 0x34]
    • 输出:Token IDs [0x12, 0x34, 0x56]
    • 解码:后端有一个码本(Codebook),将 0x12 映射为具体的物理参数,比如 x=0.5, y=0.2, z=0.1(坐标)。
  3. 为什么这样设计?
    • 可以利用 LLM 强大的逻辑推理能力(Chain-of-Thought),先让模型“想”一下(输出思维链 Token),再输出动作 Token。
    • 动作 Token 数量固定且有限,便于控制。

5.2 模式二:连续动作头(Continuous Action Head)—— “回归”任务

这种方式更像传统的控制算法,但使用了 LLM 作为特征提取器。

  1. 原理
    • LLM 处理完视觉和文本后,产生一个最后的隐藏状态向量(Hidden State Vector)
    • 这个向量不再送入“词表”去预测下一个字,而是送入一个额外的线性层(Linear Layer / MLP),专门用于回归连续数值。
  2. 流程
    • 用户说:“拿起杯子”。
    • LLM 最后一层输出一个向量 H l a s t H_{last} Hlast
    • Action Head A c t i o n = L i n e a r ( H l a s t ) Action = Linear(H_{last}) Action=Linear(Hlast)
    • 输出:直接输出一组连续浮点数,如 [0.5, 0.2, 0.1, 0.0, 0.0, 0.0, 0.5](7维机械臂控制指令)。
  3. 特点
    • 速度更快,因为不需要 Token 解码。
    • 但失去了 LLM 的“思维链”能力,难以解释“为什么选这个动作”。

LLM 依然需要生成 Token 序列来“思考”和“规划”。

即使在模式二(连续动作头)中,LLM 的前几层依然在处理文本和视觉 Token,并进行自注意力计算。虽然最终没有“说话”,但中间过程依然是基于 Token 的表示(Representation)

而在更常见的模式一(离散 Token)中,动作本身就是由 Token 组成的

5.3 举个具体例子(以 Google RT-2 为例):

当用户输入图像和文本:“把苹果给爸爸”。

  1. LLM 的输出流

    • Token 1: thought: "I see an apple." (思维链,自然语言 Token)
    • Token 2: action: (动作标识符)
    • Token 3: grasp (动作代码 Token,映射到“抓取”参数)
    • Token 4: move_to: parent (移动目标 Token,映射到坐标)
  2. 后端解析

    • 系统检测到 action: grasp,查询码本,得到机械臂关节角度变化。
    • 系统检测到 move_to: parent,查询码本,得到父位置的坐标。

5.4 总结

特性 传统 LLM VLA (模式一: 离散) VLA (模式二: 连续)
输出物 自然语言 Text 动作代码 Token IDs 连续数值 (Floats)
是否需要 Token (动作即 Token) 中间过程是 Token,最终不是
主要用途 交流、推理 推理 + 动作规划 直接控制执行
是否输出 Action (通过 Token 映射) (通过线性层映射)

结论:
VLA 中的 LLM 依然依赖 Token 机制,但它输出的 Token 含义变了。它不再是为了“聊天”,而是为了编码动作。你可以把这看作是将“物理世界的动作”离散化成了“数字世界的 Token”,从而让大模型能用它最擅长的方式(处理 Token 序列)来指挥机器人。

6、VLA 直接控制自动驾驶车辆太慢

目前主流自动驾驶(如 Waymo、Tesla FSD)依然主要依赖**“感知-规划-控制”模块化架构**,而不是端到端 VLA 的直接原因。

Action 反应太快了,LLM 太慢了。

6.1. 控制精度的差异:离散 vs 连续

  • VLA 的输出是“离散”或“粗粒度”的

    • LLM 擅长处理语义(“转弯”、“停车”)。
    • 但自动驾驶需要极其精确的物理控制:转向角是 15.32 度还是 15.33 度?油门力度是 45% 还是 46%?
    • LLM 很难直接输出这种高精度的连续物理控制信号,因为它本质上是概率模型,存在“幻觉”和抖动。
  • 传统架构的优势

    • 感知模块(CNN/Transformer):专门负责从像素中提取车道线、障碍物坐标,精度极高。
    • 规划模块(优化算法/学习算法):负责生成平滑的轨迹曲线。
    • 控制模块(PID/MPC):负责以 100Hz 的频率微调电机,确保车沿着轨迹走。
    • 这种“各司其职”的架构在速度和精度上都远超通用的 VLA。

6.2. 安全性与可解释性

  • VLA 的“黑盒”风险

    • LLM 可能会因为prompt的一个微小变化,或者图像中的噪声,给出完全错误的动作指令(比如把“停车”生成成“加速”)。
    • 在机器人抓杯子时,错了最多摔个杯子;在自动驾驶中,错了就是生死。
  • 缺乏底层物理直觉

    • 通用 LLM 并没有经过严格的物理动力学训练。它可能知道“避开障碍物”,但不知道“以当前速度和摩擦力,转这个角度会不会甩尾”。

7、其实人类开车,不需要思维链,因为大多数是条件反射。那么,自动驾驶中 VLA 有戏吗?

大模型(LLM/VLA)擅长“慢思考”(系统2,逻辑推理),而驾驶本质上是一个“快思考”(系统1,条件反射)的过程。

驾驶的核心是条件反射,而不是逻辑推理。

7.1. 人类驾驶:主要是“模式匹配”而非“逻辑推导”

正如你所说,绝大多数驾驶行为(变道、跟车、过红绿灯)并不经过大脑皮层的复杂逻辑计算,而是基于小脑和基底核形成的肌肉记忆条件反射

  • 直觉驾驶(Intuitive Driving)

    • 当你在高速公路上看到前车刹车灯亮起,你的脚会本能地松开油门并轻点刹车。这个过程几乎不需要语言介入(比如你心里不会想:“根据牛顿第二定律,前车减速意味着我需要施加反向力…”)。
    • 这是一种感知-运动闭环(Perception-Action Loop),速度极快(毫秒级),且高度自动化。
  • 什么时候需要“思维链”?

    • 只有在复杂、罕见、需要推理的场景下,人类才会启动“系统2”:
      • “这个路口没有红绿灯,但我看到那边有车冲出来,我是不是该让行?”
      • “前面修路,导流线有点乱,我该怎么走?”
    • 这种情况下,你会犹豫、思考,甚至说出口。但这只占驾驶时间的 5% - 10%

7.2. 为什么传统自动驾驶架构像“人脑的分裂”?

为了模拟人类驾驶,早期的自动驾驶系统(如 Waymo, Mobileye)采用了模块化架构,这其实是在刻意分离“条件反射”和“逻辑思考”,因为当时的算力无法同时处理两者。

  • 感知模块(CNN):负责“看”。这对应人类的眼睛和视觉皮层(条件反射的基础)。
  • 规划模块(Rule-based / Optimization)负责“想”。这对应人类的前额叶皮层(逻辑思考)。
    • 它通过硬编码的规则(如:如果距离 < 2米,则刹车)来模拟条件反射。
    • 通过优化算法计算轨迹。
  • 控制模块(PID/MPC):负责“做”。这对应人类的小脑(精细运动控制)。

问题在于:这种架构是“拼接”出来的。感知不一定懂规划,规划不一定懂控制。它没有形成像人类那样统一的、端到端的神经映射

7.3. 特斯拉的“端到端”(End-to-End):回归条件反射

提到的“不需要思维链”,正是特斯拉 FSD V12 版本所追求的目标——端到端神经网络(End-to-End Neural Network)

  • 核心理念

    • 去掉中间的“代码逻辑”和“显式规划模块”。
    • 输入:摄像头像素。
    • 输出:转向角、油门、刹车。
    • 中间层:一个巨大的 Transformer 或 Vision Transformer,通过海量人类驾驶视频数据进行训练。
  • 为什么这样做?

    • 因为人类驾驶专家无法穷尽所有情况下的规则(Corner Cases 无穷无尽)。
    • 但人类可以通过“看”来学会驾驶。通过模仿人类驾驶数据,让神经网络直接学习从像素到动作的概率映射
    • 这本质上就是让 AI 拥有**“驾驶直觉”,而不是“驾驶逻辑”**。
  • 结果

    • FSD V12 的表现更像“老司机”,动作流畅、自然,因为它在模仿人类的反射性操作,而不是在“解题”。

7.4. 那 VLA 在自动驾驶中还有意义吗?

既然驾驶主要是条件反射,那为什么还要研究 VLA(视觉-语言-动作)?

因为“纯条件反射”有致命弱点:泛化能力差。

  • 纯视觉-动作模型(如 FSD V12)的局限

    • 它依赖于大量的训练数据。如果它从未见过“穿着恐龙玩偶服的人在指挥交通”,它可能会死机或做出奇怪的反应。
    • 它缺乏常识推理。它知道怎么开车,但不知道“为什么”这里有个路障(可能是事故,可能是施工,需要绕行)。
  • VLA 的作用:注入“常识”

    • 引入语言模块(LLM 部分),不是为了做每一步的转向计算,而是为了提供高层语义理解
    • 场景举例
      • 你输入指令:“去那个正在办婚礼的酒店,小心别撞到人。”
      • 纯视觉模型:只能看到红色的装饰物,不知道那是婚礼,可能无法理解“小心”的权重。
      • VLA 模型:通过语言理解“婚礼”、“人”、“小心”,将这些语义信息转化为对底层控制信号的权重调整
  1. 对于日常驾驶:我们确实不需要思维链。理想的自动驾驶应该是一个极简的、低延迟的、端到端的“反射弧”,越像人越好,越少“思考”越好(因为思考意味着延迟和不确定性)。
  2. 对于极端场景:当条件反射失效时,我们才需要引入“思维链”(VLA 的语言推理部分)来处理长尾问题(Long-tail Cases)。

未来的最佳形态可能是:
一个混合架构,底层有一个极速的、类似“小脑”的端到端神经网络处理 99% 的条件反射驾驶动作,上层挂载一个轻量级的 VLA/LLM 模块,专门处理那 1% 的复杂语义和推理场景。

这就是为什么 Tesla 在 FSD 上去掉了规则代码(回归反射),但同时也开始尝试加入一些高级指令理解(引入语义)。快是本能,慢是智慧,自动驾驶需要两者结合。

7.4.1. VLA 作为“大脑”(慢速、高层)
  • 任务:理解复杂的场景意图。
  • 输入:鸟瞰图(BEV)+ 高精地图 + 用户指令(“去那个有红旗的商场”)。
  • 输出:高层指令,例如 SetDestination: Mall_A, LaneChange: Left, Yield: Yes
  • 频率1Hz - 5Hz(每秒 1-5 次决策)。
  • 优势:利用了 LLM 的世界知识和推理能力,处理长尾场景(Corner Cases)。
7.4.2. 传统/专用模块作为“小脑”(快速、低层)
  • 任务:实时避障、车道保持、精确控制。
  • 输入:VLA 的高层指令 + 实时传感器数据(雷达、摄像头)。
  • 输出:具体的转向角、加速度、刹车力度。
  • 频率10Hz - 100Hz
  • 优势:速度快、精度高、确定性性强。

7.5 总结

  1. 直接实现:让 VLA 模型直接输出转向/油门指令,在目前的算力和模型架构下,对于高速自动驾驶是不可行的。延迟太高,精度不够,安全性无法保证。
  2. 可行路径:VLA 更可能作为自动驾驶系统的**“高层决策辅助”,负责处理复杂的语义理解和长尾场景规划,而将实时控制**交给专门优化的、轻量级的底层控制模型。

未来的趋势可能是:“LLM 负责想(Planning),专用模型负责做(Control)”

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐