【想法】LLM模型存在首字延迟,控制精度,缺乏物理直觉导致不能做快Action。人类开车,大多数是不需要思维链,是条件反射
文章目录
1、LLM 首字延迟
我们需要先定义什么是“实时”:
- 首字延迟 (TTFT, Time To First Token):从用户输入完毕到模型吐出第一个字的时间。目前目标是 < 100ms - 500ms(接近人类反应速度)。
- 生成速度 (Tokens Per Second, TPS):模型每秒生成的字数。目前目标是 20-100+ tokens/sec(接近流畅对话速度)。
1.1. 未来展望:超越 Transformer?
目前 LLM 的自注意力机制复杂度是 O ( N 2 ) O(N^2) O(N2),在处理超长序列时依然吃力。为了实现更极致的实时,业界正在探索新架构:
-
Mamba / SSMs (State Space Models):
- 复杂度为 O ( N ) O(N) O(N),理论上是线性的。
- 推理速度比 Transformer 快得多,适合长上下文实时处理。
- 现状:正在被整合进混合架构中(如 Jamba 模型)。
-
MoE (Mixture of Experts):
- 每次只激活部分参数。
- 在保持大模型能力的同时,减少推理时的计算量,提高速度。
2、每轮对话生成新token需要和历史全部token进行注意力计算
在你输入“提示词”(Prompt)的阶段,文字是“一次性”进入模型进行计算的。
但是,为了生成回复,模型会分两步走:第一步处理你的输入(批量/并行),第二步生成回答(逐个/串行)。
让我们详细拆解这个过程:
2.1 第一阶段:处理你的输入(Parallel / 并行)
当你发送“你好,帮我写代码”这句话时,模型并不是一个字一个字地读(像人读书那样从左到右逐字扫视),而是同时处理这10个 token。
- Embedding:10个 token 同时被转换为10个向量。
- Self-Attention:
- 这10个向量同时进入 Transformer 层。
- 在第1层,每个位置都会与其他所有位置(包括它自己)计算注意力。
- 例如:理解第3个字“帮”时,模型会同时参考第1个字“你”、第2个字“好”、第4个字“我”等所有其他字的信息。
- 结果:经过多层 Transformer 后,你输入的这10个字变成了10个新的、富含上下文信息的向量。这些向量被存入 KV Cache。
为什么可以并行?
因为 Self-Attention 允许每个位置“看到”整个序列。你不需要先知道第1个字才能理解第2个字,因为数学上可以同时计算所有关系。这就是为什么 LLM 推理提示词(Prompt Processing)速度很快。
2.2 第二阶段:生成回复(Sequential / 串行)
一旦你的输入处理完毕,模型开始生成回答(比如它想回复“没问题”)。这时候,逻辑就变了:
-
生成第1个字“没”:
- 模型使用最后一个位置(即“码”字)的上下文向量。
- 它计算这个向量与 KV Cache 中所有历史 K/V 的注意力。
- 输出概率最高的 token:“没”。
- 关键点:现在,“没”成为了序列的一部分。
-
生成第2个字“问”:
- 模型现在有一个更长的序列:“你好,帮我写代码没”。
- 它只针对新加的这个“没”字计算 Q/K/V。
- 它将这个新的 Q 与旧的 KV Cache(包含“你好…”和现在的“没”)进行注意力计算。
- 输出下一个 token:“问”。
-
循环:重复上述步骤,直到生成结束符
<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)。
- 新 token “写” 的 Q (
- 键(Key):
- 模型将
Q_new_1与整个序列的 K 进行比对。 - 整个序列的 K 包括:
- 历史 token 的 K(从 KV Cache 中读取)。
- 新 token “代码” 的 K(刚计算出来)。
- 模型将
- 值(Value):
- 模型将
Q_new_1与整个序列的 V 进行加权求和。 - 整个序列的 V 包括:
- 历史 token 的 V(从 KV Cache 中读取)。
- 新 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) —— 这是大头
- 动作:
- 生成“你”的 Q, K, V。
- 检索 KV Cache:GPU 从显存中读取之前 1050 个 token 的 K 和 V。
- 计算 Attention:将“你”的 Q 与 所有 1050 个 K 进行点积运算。
- 加权求和:根据结果,混合 所有 1050 个 V。
- 耗时:这是 ITL 中耗时最长的部分。虽然不需要重新计算历史的 Q,但注意力矩阵的计算量依然很大(取决于上下文长度)。
- 注意:如果使用了滑动窗口,这里可能只计算最近的一部分,耗时会短一些;如果是全注意力,这里非常重。
4.2.3 第三步:前馈神经网络 (Feed-Forward Network / MLP)
- 动作:将 Attention 的输出向量通过两层全连接网络,提取高级语义特征。
- 耗时:固定,取决于模型层数和参数量。
4.2.4 第四步:输出层 (LM Head) & 采样 (Sampling)
- 动作:
- 将最终向量映射到词表大小(比如 32,000 个可能的词)。
- 计算每个词的概率。
- 根据概率采样出一个 token(比如“好”)。
- 耗时:通常很快,但涉及 softmax 和采样算法。
无论是一开始还是最后,只要生成一个新 token,模型就必须基于当前的 Q 和全局的 KV 重新算一次注意力,没有任何捷径可以跳过这一步(除非使用特殊的非自回归模型,但那不是当前的 LLM 主流)。
5、VLA 中,LLM模型的两种模式:输出token、输出隐藏状态向量
VLA 的输出分为两种主流模式来理解:
5.1 模式一:离散 Token 化动作(Discretized Actions)—— 类似“说话”
这是目前最主流、也是 Google RT-2、OpenVLA 等模型采用的方式。
- 原理:
- 模型仍然是一个自回归的 LLM。
- 它输出的依然是一串 Token ID(整数)。
- 区别在于:这串 Token ID 不再代表“单词”(如 “apple”),而是代表预先定义好的动作代码。
- 流程:
- 用户说:“拿起杯子”。
- LLM 内部思维:
[Thought]->[Act: 0x12]->[Act: 0x34]… - 输出:Token IDs
[0x12, 0x34, 0x56]。 - 解码:后端有一个码本(Codebook),将
0x12映射为具体的物理参数,比如x=0.5, y=0.2, z=0.1(坐标)。
- 为什么这样设计?
- 可以利用 LLM 强大的逻辑推理能力(Chain-of-Thought),先让模型“想”一下(输出思维链 Token),再输出动作 Token。
- 动作 Token 数量固定且有限,便于控制。
5.2 模式二:连续动作头(Continuous Action Head)—— “回归”任务
这种方式更像传统的控制算法,但使用了 LLM 作为特征提取器。
- 原理:
- LLM 处理完视觉和文本后,产生一个最后的隐藏状态向量(Hidden State Vector)。
- 这个向量不再送入“词表”去预测下一个字,而是送入一个额外的线性层(Linear Layer / MLP),专门用于回归连续数值。
- 流程:
- 用户说:“拿起杯子”。
- 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维机械臂控制指令)。
- 特点:
- 速度更快,因为不需要 Token 解码。
- 但失去了 LLM 的“思维链”能力,难以解释“为什么选这个动作”。
LLM 依然需要生成 Token 序列来“思考”和“规划”。
即使在模式二(连续动作头)中,LLM 的前几层依然在处理文本和视觉 Token,并进行自注意力计算。虽然最终没有“说话”,但中间过程依然是基于 Token 的表示(Representation)。
而在更常见的模式一(离散 Token)中,动作本身就是由 Token 组成的。
5.3 举个具体例子(以 Google RT-2 为例):
当用户输入图像和文本:“把苹果给爸爸”。
-
LLM 的输出流:
- Token 1:
thought: "I see an apple."(思维链,自然语言 Token) - Token 2:
action:(动作标识符) - Token 3:
grasp(动作代码 Token,映射到“抓取”参数) - Token 4:
move_to: parent(移动目标 Token,映射到坐标)
- Token 1:
-
后端解析:
- 系统检测到
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%。
- 只有在复杂、罕见、需要推理的场景下,人类才会启动“系统2”:
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 模型:通过语言理解“婚礼”、“人”、“小心”,将这些语义信息转化为对底层控制信号的权重调整。
- 对于日常驾驶:我们确实不需要思维链。理想的自动驾驶应该是一个极简的、低延迟的、端到端的“反射弧”,越像人越好,越少“思考”越好(因为思考意味着延迟和不确定性)。
- 对于极端场景:当条件反射失效时,我们才需要引入“思维链”(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 总结
- 直接实现:让 VLA 模型直接输出转向/油门指令,在目前的算力和模型架构下,对于高速自动驾驶是不可行的。延迟太高,精度不够,安全性无法保证。
- 可行路径:VLA 更可能作为自动驾驶系统的**“高层决策辅助”,负责处理复杂的语义理解和长尾场景规划,而将实时控制**交给专门优化的、轻量级的底层控制模型。
未来的趋势可能是:“LLM 负责想(Planning),专用模型负责做(Control)”。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)