
做自动驾驶算法这几年我越来越觉得单靠一个端到端大网络把感知、预测、规划一把梭已经卷到头了。大家跑公开数据集的时候指标咬得很紧可一上实车就露马脚长尾场景没见过、小概率行为解释不了、出了问题也不知道该从哪一环去修。直到我开始把世界模型和大语言模型捏到一起做规划才真正找到一种既能‘多想一步’、又能‘说人话’的路线。这个方向最近讨论热度很高但真正能把两个模型落地成一套可用算法的人不多。这篇文章就把我自己的方案选型、框架设计、踩坑记录完整梳理一遍给正在做自动驾驶决策算法的朋友一个可以照搬的参考思路。1. 为什么非要把世界模型和大语言模型拧在一起1.1 纯端到端模型撞上的长尾墙先聊一下为什么原来的端到端路线不够用了。以图像输入为主的感知端到端模型本质上是在做一个高维分布拟合从大量数据里学习“看到什么就输出什么控制量”。数据充足的时候系统表现确实惊艳但真实路况是典型的“二八法则”——你可能搜集了十万个小时的数据里面却依然没有覆盖到“行人从大货车车头突然窜出来”这类的组合场景。于是模型就会给出一个在统计上“常见”但在这个场景里完全错误的动作。纯粹堆数据集可以缓解这个问题但成本极高。我见过团队为了一个鬼探头场景专门去车队旁边蹲了两个月来采集数据结果发现不同城市、不同光照条件下场景差异巨大采来的数据放进训练集之后对原场景的过拟合反而更严重了。端到端模型最大的问题是“不可解释”它给出了一个转向动作但你无法知道它是基于什么推理得出来的也就很难在失败案例里去精准修正。1.2 世界模型在自动驾驶里到底在模拟什么世界模型这个概念简单说就是让模型学会“环境动力学”的规律。它不满足于识别当前帧里哪里是车、哪里是人而是要预测下一帧、再下一帧会变成什么样。换句话说它在脑子里搭建了一个虚拟训练场只要给它一个当前场景和一段候选动作它就能推演出未来几秒钟“如果这么做世界会变成什么样”。自动驾驶里的世界模型通常不只是做视频预测。更成熟的方案是把多帧传感器数据编码成一个隐状态再加上自车速度、方向盘转角等控制量学习这个隐状态的转移规律。训练好之后它可以用来做三件事第一生成多种多样的未来场景做数据增强第二在闭环仿真里替代理型物理引擎给策略打分第三作为规划器的“想象力”对候选轨迹做提前推演。像GAIA-1、DriveDreamer这些公开工作走的都是这个路子。你可以把世界模型理解成自动驾驶系统的“预演能力”它不直接告诉你该往哪走但它能告诉你每条路走下去大概会撞到什么。1.3 大语言模型不是用来聊天的是用来补常识的大语言模型在自动驾驶里的价值不在于让它跟司机聊天解闷而在于它能补上端到端模型最缺的“常识推理”。路况判断不只是概率拟合很多时候需要交通规则的约束、对社会关系的理解、对模糊指令的拆解。举个例子系统识别到前面有一辆打着双闪的车停在路中间端到端模型可能会犹豫是否绕行而大语言模型结合场景描述后能推理出“这辆车可能在等人更可能突然起步建议减速缓行而不是直接变道”。这种推理能力本质上来源于语言模型在大量文本里学到的世界知识。大语言模型还能分担任务理解。乘客说“靠边停一下”传统系统需要拆成意图识别、目标点搜索、路径规划三个模块而语言模型可以直接把一句话映射成结构化的驾驶目标并给出解释性理由。这一点对未来的Robotaxi交互和无人驾驶车队调度非常关键。1.4 世界模型和大语言模型的核心区别一张表看懂很多朋友一上来就把这两个模型搞混我先用一张表把它们的本质区别说清楚后面聊架构的时候会反复用到这张表。对比维度世界模型大语言模型表征方式连续状态、隐向量、栅格离散Token、词嵌入输入模态视觉、激光雷达、控制量文本为主可扩展图像训练目标预测下一帧、下一状态预测下一个Token核心能力时空推演、场景生成语义理解、常识推理时序尺度毫秒级到秒级短时预测秒级以上的高层规划可解释性可以可视化渲染但因果逻辑弱用自然语言解释人可直接读懂主要风险预测失真、模式坍缩幻觉、胡编乱造看清这张表之后组合它们的思路就很自然了世界模型负责“低层物理现实”大语言模型负责“高层语义推理”。一个管短时间的运动预测一个管长时间的任务规划两者正好互补。2. 如何搭建一套可落地的结合框架2.1 一套四层架构感知、语义、规划、推演我自己的落地框架基本是四层感知层、语义层、规划层、推演层。感知层的任务很纯粹把摄像头、激光雷达、毫米波雷达的数据统一编码成鸟瞰视角特征。这里的关键不是追求单模型精度多高而是要输出一个稳定、时序连贯的BEV特征序列因为后面所有模块都要拿这个特征做输入。语义层是我加的“翻译官”本质上是一个视觉大语言模型VLM。它读取BEV特征加上任务指令输出一段结构化的场景描述有几辆车、它们的意图大概是什么、道路拓扑情况如何、哪些障碍物会影响当前任务。这一步的输出不是给人看的而是给规划层用的“压缩版场景”。规划层由大语言模型担任它拿到语义层的描述结合当前目标生成若干个候选驾驶策略。注意这里不是让它直接生成油门刹车或者方向盘转角而是生成带有语义标签的动作保持车道、向左变道、减速跟车、靠边停车等等。这相当于把连续控制问题抽象成了离散决策问题大大降低了大模型输出的不可控风险。推演层就是世界模型的主场。规划层给出三五个候选动作推演层把每一个动作都作为条件在模型内部预演未来3到5秒的场景变化再结合一个安全评分器评估每个候选动作的碰撞风险、乘坐舒适度、任务完成度最后选出得分最高的动作交给底层控制器执行。这套架构最大的好处是错误不会直接被放大到执行端因为世界模型会事先替你把每条路“踩”一遍。2.2 视觉大语言模型如何和BEV特征对齐架构里最容易被卡住的地方就是视觉大语言模型怎么吃下BEV特征。视觉大模型一般接收的是2D图像可BEV特征是高度扭曲之后的俯视栅格直接塞进预训练模型语义对不齐效果会很差。我现在的做法是分两步对齐。第一步先用一个轻量级的perceiver或者query transformer把BEV特征压缩成固定数量的可学习token。这样做既能把BEV的尺寸变化屏蔽掉又能让后续的语言模型始终拿到相同长度的输入。第二步用带驾驶说明文本的QA数据对模型做LoRA微调。数据长这样把一段BEV特征配上“前面有辆自行车即将向左汇入主路”这类描述文本训练模型学会从特征里抽取语义。微调的时候有个很实在的经验学习率不要给大LoRA的rank设在16到32之间就够了太大反而会让模型把预训练学到的常识忘掉。我试过rank开到128结果模型对通用场景的理解明显退化输出变得机械死板。另外训练数据里正负样本比例要控制好普通场景占太多模型会对异常情况的描述变得非常迟钝。2.3 本地部署大语言模型还是调API先把账算清楚很多人一上来就纠结到底用云端大模型API还是本地部署。我的建议非常直接做算法验证和快速原型先调API没问题不少主流云厂商开放了免费试用额度跑小规模demo够用但一旦进入实车调试和私有数据迭代必须本地部署。原因很简单。自动驾驶的数据涉及车辆状态、行驶轨迹、周边场景这些数据往外送会牵扯到数据合规和数据链路的稳定性问题。再者API的网络延迟和服务波动会让整个算法链路的可复现性变得极差。你可能因为一个超时请求就在实车上复现不出刚才的决策结果这种排查噩梦我经历过太多次。本地部署也不必追求超大模型。规划层本质上在做结构化决策不是要它写一篇散文。7B到13B的开源模型经过量化部署已经足够用。在常见的GPU环境下7B模型用INT8量化大概需要8GB左右显存推理速度可以做到每秒几十个token。这个体量放在开发车上问题不大放到量产域的嵌入式设备上才是真正的挑战那时候可以再考虑INT4量化加蒸馏的小模型。本地部署的核心指标是P95延迟和显存峰值不要只看平均推理速度。3. 核心模块的实操细节与实现要点3.1 世界模型的输入输出设计与训练策略世界模型要能真正在闭环里发挥作用输入输出设计必须和规划层的接口对齐。我的输入采用“前三帧BEV特征 自车历史状态 HD地图语义”拼接成一个时序张量。BEV特征用当前主流的网格分辨率也就是0.2米一格感知范围为前后各60米、左右各30米的长方形区域。输出设计上我们最关心的是未来每个障碍物的占用概率。所以输出可以设计为未来8到16帧的占用栅格序列每帧间隔100毫秒配上每个候选物体未来3秒的轨迹分布。训练过程我建议分成两个阶段第一阶段先做自监督重建训练模型从隐变量还原当前帧BEV让模型先学会基础的场景压缩第二阶段再做未来预测用未来的真实帧做监督同时把自车控制动作作为条件输入让模型学会“动作会影响未来”这个因果链条。这里有三个细节容易踩坑一是损失函数不要只用L1或者MSE预测未来本来就带多模态性质一个交叉路口的下一个状态同时存在左转、直行、右转多种可能不加多模态约束的话模型会输出一个糊成一团的平均场景。二是训练数据不要只用正常驾驶数据还要混入大量人工干预数据和安全接管数据否则模型没见过“突然急刹”“紧急绕行”这些统计上概率低但安全性极高的场景。三是BEV特征最好在训练前做批量归一化和随机掩码增强防止模型偷懒直接复制上一帧作为预测。3.2 大模型输出的约束和安全校验不能让它乱说话大模型在自动驾驶里最大的风险就是幻觉。它会一本正经地输出一个语义上合理、但物理上完全不可行的动作。解决方案不能只靠提示词提示词只能降低概率不能根除问题。我现在的做法是三层防护。第一层输出约束。我不是让大模型输出自由文本而是用结构化生成框架要求它只能输出一个严格定义的JSON格式里面包含action类型、目标速度、目标车道偏移量、说明文本。解析失败就丢弃绝不允许绕过解析器直接传递。第二层语义校验。action类型必须属于预设的驾驶原语集合速度值和车道偏移量必须在合理范围内比如速度不能是负的、车道偏移不能超出自车宽度。超出范围直接按无效输入处理。第三层世界模型推演校验。这也是整个架构里最核心的一环。即使大模型输出了一个“合理的”加速超车动作世界模型推演后可能会发现右前方车道有一辆视野盲区里的车安全评分器会给这个动作打低分。有了这层物理推演大模型的“嘴上功夫”就再也不能直接控制车辆了。我在实车调试中最开始遇到的严重问题就是大模型偶尔会在无斑马线路段输出“让行人先走”的语义动作但真正的危险点是右后方快速接近的摩托车。如果没有世界模型的推演拦截这个输出就有可能导致危险。加了推演层之后这类错误全都被安全评分器拦住了。3.3 完整决策融合流程从指令到执行的一条链路下面给出一段我实际在仿真环境里跑通的伪代码方便理解整个模块是怎么串起来的。在这个例子里乘客输入指令“前方路口右转注意让直行车辆”系统从感知到决策再到验证走完一个完整闭环。def decision_pipeline(bev_features, ego_state, command): # 1. 语义层视觉语言模型把BEV特征和指令压缩成场景描述 scene_desc vlm.describe( bev_featuresbev_features, instructioncommand ) # 2. 规划层LLM生成候选动作只允许输出结构化JSON candidates llm.generate_plans( system_prompt( 你是自动驾驶规划器。只能输出JSON数组 每个元素包含action、target_speed、target_lane_offset、reason。 ), scene_descscene_desc, temperature0.1, # 降低随机性减少幻觉 max_tokens512 ) # 3. 安全解析不符合schema的候选直接丢弃 plans strict_json_parse(candidates) # 4. 推演层世界模型对每个候选动作做未来5秒推演 best_score float(-inf) best_plan None for plan in plans: future_grids world_model.rollout( bev_featuresbev_features, actionplan, horizon50, # 50 * 100ms 5秒 num_samples8 # 每个动作采样8条随机未来 ) score safety_evaluator.evaluate( future_grids, plan, ego_stateego_state ) if score best_score: best_score score best_plan plan return best_plan, best_score这里的整体延迟预算一般控制在300到500毫秒左右。感知模型出BEV特征大概要30到50毫秒VLM描述场景要100到200毫秒LLM生成候选要80到150毫秒世界模型对每个候选做推演大约每个100毫秒。全部串行跑起来会超时所以我在实际系统里会把VLM和LLM做成串行的世界模型推演放在另一个GPU上并行做。千万别小看这个并行优化它决定了这套架构在实车上还只是个Demo还是真正能跑起来的系统。4. 实战中踩过的坑常见问题与排查技巧4.1 大模型幻觉导致的误决策怎么防住这是所有做大模型落地的团队都会遇到的问题自动驾驶尤其致命。我遇到的典型场景是模型误把一个地面阴影识别成深坑然后输出“急刹靠边”的危险动作。这种幻觉光靠提示词完全堵不住后面我用四招才压下去。第一招是temperature调到0.1附近减少输出随机性第二招是给模型提供紧凑的“禁止行为清单”把急刹、逆行、闯红灯这类行为直接列为禁止原语第三招是所有候选动作必须过世界模型推演让物理层去拦截语义层的疯狂想法第四招是做回归测试集把历史所有幻觉案例沉淀下来每次模型微调之后都要在新测试集上跑一遍。4.2 推理延迟超标跑不进实时闭环最早我用的方案是14B模型加云端API实测延迟经常飙到2秒以上完全没法用。后来把模型换成7B并做了INT8量化本地用推理引擎部署延迟降到500毫秒左右。再用上并行推理之后总算把P95延迟压到了400毫秒以内。这里有个关键细节要对提示词做固定模板化处理把系统提示词和场景描述拆成两段系统提示词保持不变这样推理引擎可以复用KV Cache省掉一大截重复计算。另外如果预算允许LLM和世界模型尽量放在两块GPU上千万别共享显存否则显存频繁换入换出延迟直接起飞。4.3 3D世界模型的失真和评测难题做3D世界模型的时候最头疼的不是训练而是评测。二维视频生成可以用FID、LPIPS这些指标但自动驾驶关心的是障碍物位置、轨迹这些物理量是否准确。我后来沿用了最近3D世界模型survey里比较推荐的评测路线不光看生成画面的清晰度还要看预测的未来占用栅格与真实未来栅格的交并比以及自车控制精度是否在可接受范围内。如果发现生成的未来场景总是把远处的车糊成团、或者障碍物突然消失大概率是隐空间维度太小压缩时丢掉了高频细节。解决办法是把现有模型换成扩散式解码器或者给BEV特征按远近区域分权重近处损失权重给大一点。4.4 数据对齐和模态同步的细节坑最后说一个看起来不起眼、实际上能把整个系统逼疯的问题数据同步。BEV特征、LLM文本输入、世界模型的推演帧这三者必须对齐到同一套时间戳上。我早期用不同来源的传感器数据做输入发现摄像头和激光雷达的时间戳差出200毫秒结果世界模型预测出来的未来分布整个是歪的。检查了大半天才定位到是数据对接模块的时间同步参数没配置。现在我在所有数据入口统一加了一层时间戳对齐模块用最近邻匹配加线性插值把各模态数据对齐到触发帧。这个模块看起来简单但对整个系统稳定性的贡献不亚于任何一个大模型的调参。最后再分享一点我自己的心得。做这套系统最忌讳的事情是一上来就想把世界模型和大模型全部换成最新的重型模型。先从最小的闭环跑通一个能描述场景的VLM一个能输出结构化动作的7B本地模型一个预测3秒未来的轻量世界模型。只要这三样东西能串起来哪怕每项指标都不亮眼你也已经拥有了一套逻辑完整、可扩展的自动驾驶决策框架。之后再把每一块替换成更强的模型风险就小多了。我在实际项目里就是这么一步步把从仿真到实车的链路打通的这套思路相信也能帮到正在走这条路的人。