
转载一篇来自知乎的高赞文
作者知乎-李众力
万字长文,建议先收藏
原文如下,略有改动
2025 年年底了,我也来回答一下(上面这个问题)。
先说结论:据我能接触到的一圈国内玩家,大家嘴里的“数据闭环”,绝大多数还是各个算法团队内部的“小闭环”,离当年 PPT 里畅想的那种“数据直接解决问题”的大闭环,还有好几层台阶。
我从事自动驾驶行业大概 7 年多了,从最早那种“开完车工程师拎着硬盘,从工控机上拔下来,抱着去机房拷数据”的年代一路干到现在。
这几年主要在一家互联网大厂的物流无人车项目里,从封闭园区到高速公路再到城市公开道路,从载人到拉货都有涉及,负责整车的数据体系和质量体系搭建,带团队做的事情大致包括:
日常工作基本就是跟各种 log、Trigger、标注平台、仿真平台、QA 流程和一堆诡异 bug 打交道,是一个比较典型的“数据闭环 + 质量体系”视角。
下面所有观点,都是站在这个视角下的个人经验,不代表任何公司官方意见。
我心目中“真闭环”,至少要满足以下两层:
不是靠“司机吐槽 + 群里截图 + 领导试驾骂了一句”触发,而是系统能从海量运行数据里自动发现异常行为:
简单讲就是:
一个线上问题 → 自动被归类、建成数据集 → 自动进训练 / 仿真 → 产出候选方案 → 自动评估效果
人主要做的是定义目标 & 拍板,而不是从 0 到 1 手工搬砖。
新版本上线后,系统要能持续回答三件事:
一句话概括:
真正的数据闭环,是“问题会自己长脚走完从『被发现』到『被解决并被验证』的路径”,人是设计规则和做决策的,不是不断重复体力劳动的。
比较诚实的说法:
今天很多所谓“数据闭环”,其实是“数据驱动的研发流程 + 一些自动化工具”,而且大多局限在单个算法团队的小视角。
一个典型流水线大概是:
这一套当然也算“闭环”,但更多是模块级、算法视角的小闭环,离“系统级的闭环”差得不少。
现在大量问题还是这样来的:
然后才反推:
“我们加个 trigger 把这种情况捞上来吧。”
这其实是问题驱动数据,而不是数据自动发现问题。
理想状态是:
这一块目前能做得比较好的厂并不多,大多数还是停留在“若干 Trigger + 一些报表”。
同一个现象背后,往往是高度耦合的组合原因:
没有成体系的诊断工具,就容易变成:
现实里,很多地方还是靠有经验工程师肉眼跳 N 个界面,一点点分析,离“数据自己定位问题”远得很。
很多团队的闭环,其实可以概括成:
数据 → 标注 → 训练 → 离线指标涨了 → 上线
但是:
要么没人追,要么追得很粗。
大多数只是在“技术指标”的层面闭环,
不是在“问题 / 业务”的层面闭环。
PPT 里常见的一条线:
线上问题 → 自动收集 → 自动标注 → 自动训练 → 自动评估 → 自动上线
现实里更像:
所以现在很多所谓“闭环平台”,本质是一个高度自动化的工厂生产线,
而不是一个可以自我决策的“自愈系统”。
还有一个被低估的问题:组织结构本身就是断点。
于是:
上面说的是行业横截面,下面讲讲我自己这几年在做的一整套实践。
不敢说“完美闭环”,但我自认为无论是理念还是落地程度,在国内自动驾驶里算比较激进的那一拨:我们是真把“数据当产品、指标当第一公民”来设计的。
整体思路可以概括成一句话:
从“体感指标”出发,用 Trigger 把世界离散成 token,
再用 LLM 做分类和路由,最后用统一代码把“发现”和“验证”串起来。
我们做的是物流无人车,乘客不在车里,但客户和路人是有“体感”的:
急刹、急转、蛇形、频繁停、莫名其妙慢,都会投诉。
所以我们从数据上传设计的第一天起,就把一批绝对真实、用户有感的体感指标当作“第一公民”:
要求很简单也很残酷:
所有的接管、所有的急刹,必须 100% 被记录下来。
不靠人工挑“看起来像问题”的,而是完整如实记录现象。
在云端,这些体感行为会沉淀成类似:
没有这一层客观、全面的统计,后面讲什么闭环,基本都是 PPT。
同时,我们也彻底放弃那套“拷盘式”数据上传方式,而是做得更像互联网埋点:
这样做的目的是:把“真实世界发生了什么”先说清楚,
至于原因之后再慢慢分析。
我们的车上只有一颗 Orin X,要跑完整套 L4 算法,算力压榨得非常狠,所以车端有几个硬约束:
车端一旦发生:
就由一个高召回 Trigger,将前后若干秒的数据打包成一段micro log,加入上传队列。
micro log 上传到云端之后,还会再过一遍云端规则 / 模型管线:
通过这一步,我们从“高召回的疑似事件”,筛出客观可信的指标事件。
被认定为严重急刹车等一级指标的事件,会触发下一步:
给这一小段时间下发更大粒度数据的上传任务(mini log)。
mini log 里会包含:
mini log 到了云端,还要解决一个关键问题:
“这个问题具体应该扔给哪个团队?扔过去之后,他们到底需要什么数据?”
我们先用一拨人工问题分发团队做初分:
一个重要的设计是:
不是简单地给各团队“记 KPI”,
而是根据分发结果,再给各团队定制上传他们真正需要的数据。
典型比如:
也就是说:
第一层触发只上传非常轻量的“问题线索”,
确认这个线索值钱之后,再有选择地拉重数据上来,
避免一开始就“云端无限吞吐原始数据”的浪费。
这一点是我个人非常看重、也觉得很多团队没做到的:
我们把车端数据挖掘、云端历史数据挖掘、仿真验证评价
做到了Trigger 逻辑代码级统一。
什么意思?
既可以在车上实时跑,也可以在云上跑全量历史数据;
好处很直接:
同一段代码定义的问题 → 挖训练 / 验证数据 → 改算法 →
再用同一段代码去验证“这个问题在线上和仿真里是不是都变好了”。
在我看来,这一层才能称得上是真正的“从发现到验证”的闭环。
很多团队只是在“数据采集”和“模型训练”之间画了一条线,就说完成数据闭环,其实差了这一大块。
再往下一层,就是怎么把“问题线索”自动、可靠地分发到对应团队。
我们做了一套比较“学术味”的设计,本质上是:
在多模态时序日志上,构建一个领域专用 tokenizer + classifier 的两阶段架构:前半段是特征工程,后半段是时序分类。
1. Trigger = 领域专用的时序 tokenizer / 特征工程
线上所有的数据流(传感器、状态机、控制指令、报文……),都会被各种 Trigger 扫一遍:
最终得到的是一串多模态时序事件序列,可以类比成:
从波形到音素 / subword 的过程 —— 先切分,后建模。
为了让通用大模型(LLM)能直接利用这些结构化事件,我们会把上述时序 token 再做一次文本化映射:
第 3 秒:前方某障碍物的感知尺寸出现明显跳变,疑似距离估计不稳定;
第 5 秒:同一障碍物的预测轨迹发生明显跳动;
第 10 秒:车辆因为该障碍物触发了紧急制动事件。
从模型视角看,这一步就是把我们自定义的 token 序列,投射到通用 LLM 的词表空间里,完成一次语义对齐。
在这个表示之上,我们把 LLM 当成一个时序事件序列的 classifier 来用:
用机器学习的话说,就是很标准的:
feature engineering(Trigger + 文本化) → sequence classification(LLM)的流水线。
Trigger 把原始高维、多模态、长时序信号压成“抽象 token 序列”,
LLM 在这串 token 上建模时序依赖,做判别。
更关键的是,我们不是拍脑袋觉得“分类应该挺准”,
而是用真实的研发“改派行为”做弱监督标签,形成一个在线学习闭环:
从 ML 视角看,就是:
用研发“改派”作为弱监督标签,在真实线上分布下做 continual learning,让 classifier 在真实业务分布下越用越准。
前面说了,我们做到了“车端挖掘 / 云端挖掘 / 仿真验证用一套 Trigger 代码”。
这里补充一个实现细节,也是我非常在意的一点:
所有 Trigger 逻辑统一用纯 Python 实现,并且跨平台可跑。
为什么这么做?因为这直接决定:
我们做了几件事:
1. 统一 Trigger 框架与接口
2. 写好大模型“看得懂”的文档和示例
3. 更多、更细的 Trigger → 更“密”的标签
当写 Trigger 不再是某几个资深算法的特权,而是:
“懂业务 + 一点 Python + LLM 辅助”就能上手
自然结果就是:
本质上,我们是用“Python Trigger 框架 + LLM”,把过去散落在脑子和会议里的经验,逐步固化成一个可协同维护、可演进的“规则代码库”,并直接挂在数据闭环的主链路上。
4. 量产环境中的解耦:挖数 Trigger 当“配置”,脚本跑在车端沙箱里
现实里还有一个非常关键、但容易被忽略的工程问题:
量产环境的版本更新是非常慢的
同一时间路上可能跑着一堆不同版本,
但数据挖掘的需求却是高度实时、强时效性的。
举个特别常见的例子:
某个城市突然下大雪,就这几天;
你必须在有限的时间窗口里,把雪天的数据赶紧挖上来;
不可能等一个“带新 Trigger 的版本”完整上线全网。
为了解决这个矛盾,我们在设计里把“数据挖掘 Trigger”和“线上算法版本”彻底解耦:
允许我们针对某一段时间 / 某一类场景,快速上线一段挖掘逻辑,比如“只在雪天 + 城市主干路 + 车速 30km/h 以下时挖某类数据”。
在量产环境中,数据挖掘绝对不可能无限制,我们会在云端对挖掘策略做动态控制:
一旦某个挖掘任务的数据量“够了”(覆盖了必要的场景和分布),云端会自动下发关闭 / 降采样的指令;
这样可以避免:
大量重复、无意义的数据;
不必要的带宽、存储成本浪费。
整体来看,这一套机制保证了:
1)挖数能力不跟随主版本节奏慢吞吞走,可以相对灵活地应对突发场景(例如极端天气);
2)同时又不破坏量产环境的稳定性,安全、实时的主算法和“更激进的挖数逻辑”严格隔离;
3)挖数本身也在闭环:数据够了就自动收手,不做无意义堆量。
有了这么多标签,还有一个经常被忽略但非常重要的点:
要把“客观物理世界的标签”和“算法中间结果标签”严格区分。
我们体系里维护两类标签:
这两类如果不分,就容易变成:
你以为在看“现实世界的难度分布”,
实际上是在看“当前算法在哪些地方表现得更差”。
还有一个常见误区:
“把原始数据丢给一个模型做 embedding,再用以图搜图 / 向量最近邻检索,就能搞定数据挖掘。”
这类方法当然有用,但绝对不是主力入口,尤其面对海量存量数据时问题很大:
更合理的姿势是:向量检索做精筛,不做粗筛。
我们的做法:
总结一句:
向量检索是精细手术刀,不是砍树的斧子。
对存量数据,一定要先靠结构化标签缩小空间,再让 embedding 去“挑刺”。
最后讲讲最近很火的“生成式数据 / 仿真数据”,以及它在这套体系里的位置。
我们团队也有比较成熟的仿真数据生产能力(包括基于高斯表征的场景生成等),但内部有个共识:
生成式数据是用来补长尾训练短板的手段, 不是用来替代真实评测的万灵药。
在训练层面,我们重点把生成式数据投到:
现实中很难大量遇到、但又很关键的场景,比如: 路上的锥桶、临时围挡; 路面坑洼、塌陷、突出结构; 某些复合稀有工况。
目的很简单:
扩大模型在这些长尾 case 上的“见世面”; 给模型一个“这类东西可能出现”的先验; 在真实数据不够丰富时,把召回先拉起来一点。
但最终用于评测和放行的评测集,我们仍然坚持只用真实数据。 因为你永远无法证明自己“完全模拟了真实世界”,只能让真实世界来兜底。
以感知为例,生成式数据拉召回,很容易引入另一个风险:
在已有评测集上,召回率确实能看到在涨; 但在未知分布 / 新场景里,误检可能在悄悄恶化。
更麻烦的是,现实流程里:
增量标注几乎都优先关注漏检(FN); 误检(FP)很难在评测集中完全覆盖: 你不可能预先知道模型将来会“哪里莫名其妙多出框”,也就无法在所有潜在位置都画一遍真值。
于是就容易出现一种错觉:
评测集上召回涨了,FP 指标表面看着也还好, 大家都很开心, 但真实线上有些区域模型已经开始“到处乱看东西”。
我们在这块的策略是:
对两个版本,在同一批数据上的逐帧全量差分,系统性监控副作用。
具体步骤:
一个关键点是:
只要两个版本在某一帧某位置给出的结果不一样,
那么就一定是“有一个错,或者两个都错”。
至于谁对谁错,我们可以先不急着判断。
在“不争真值”的前提下,我们先做的是差异模式分析:
接着再结合人工抽查、可视化检查:
如果在某些维度新版本的误检明显爆炸,
那么在我们这边,即便研发同学拿着召回曲线说“涨了很多”,
QA 这边这关也是不会放行的。
工程实践里,“涨多少”不是唯一指标,“涨得干不干净”同样重要。
写了这么多“数据闭环 / 数据驱动”,如果让我给现在这套东西起一个更诚实的名字,我反而会叫它:
Bug-Driven 开发体系。
听上去一点也不“高大上”,甚至有点土,但这几年实践下来,真正在一线推动车辆迭代往前走的,往往就是一个个具体的 bug:
我们搭建的所有数据体系,本质上就是:
更快、更准、更系统地发现这些 bug,量化这些 bug,跟踪这些 bug 的出现与消失。
如果说现在这套体系还有什么让我不敢说“已经跑顺了”的,那卡口已经不在“发现问题”这一侧,而是在:
“谁来解决问题、怎么解决问题”这一侧。
哪怕我能:
人的带宽是刚性的,长尾问题也不是一朝一夕能搞定的:
仿真结果到底能不能代表真实世界?
你说完全能,自己都不会信;你说完全不能,又很难支撑大规模自动化验证。
这些都是当下整条数据闭环链路里普遍存在的问题:
问题可以被越来越精准地“抬上手术台”,但做手术的人、手术刀的效率、术后评估体系,还远远没有那么优雅。
好消息是,最近这两年有两个方向,我觉得是值得乐观一点的:
1. 端到端 / 模仿学习类架构的兴起
在端到端视角下,“标签”更多直接对齐人类驾驶员的行为表现:
在仿真里充分暴露问题、充分迭代
把这一环做得更接近真实世界。
一些头部玩家公开说他们有非常大的工程投入砸在最后的验证环节上,本质也是在强调:如果闭环仿真这一环不做扎实,前面的“数据闭环”很难给真正的安全感。
我自己的判断是:
如果未来我们能够真正降低解决一个 bug 的边际成本,让端到端 / 世界模型类的方法在验证和安全约束上更可控,再叠加这几年在 Trigger 体系、标签体系、自动分类、代码统一这些工程实践上的积累,
那么大家这些年挂在嘴边的“Data-Driven”,
才有可能从口号,变成一套能持续跑、能算账、能规模化复 制的基础设施。
到那时候,“数据闭环”大概就不会再被拿来当卖点讲,
就像今天没人再把 CI/CD 当成卖点一样——
没有,大家才会觉得奇怪。