
我一直想修模型。问题出在光照。
这次构建我在白板上写下的第一个数字是97%。第二个是14。
它们描述的是同一个模型。在我们研究中的冲压案例里,一个在实验室验证准确率达97%的视觉模型,被放到一台每分钟40冲程、200吨的连续模冲床上后,开始把14%的合格件误判为不合格。模型内部没有任何变化。变的是输入:随冲程角度变化的厂房顶灯眩光、温模与冷模上润滑剂积聚方式不同、每个班次前50件是在冲床达到热平衡之前生产的。产线物理条件把图像推到了模型验证分布之外,而任何模型——无论准确率多高——在那里都不可信。
项目最后这段时间,我做了一个认真对待这句话的演示。它叫检测信任门控(Inspection Trust Gate),你可以逐件观看它如何做决策:veriprajna.com/zh-Hans/demos/edge-ai-manufacturing-inspection。它不是一个更好的缺陷模型。它是视觉模型与PLC拒收执行器之间的运行时层,唯一职责是为每一个零件决定:模型的判定是否可以安全执行。
接下来是这段构建故事,贯穿三个改变我对检测AI看法的时刻:脚本化06:00发生的漂移事件、一个我拒绝相信的基准数字,以及一条我差点删掉的规则。
解决办法不是更好的模型
我对这句话抵抗得太久了。当检测器表现异常时,我作为构建者的本能全是:重新训练、升级骨干网络、买更多标注。研究却一直不肯配合。开箱即用的AOI系统会误拒5%到15%的合格件,调校良好的能压到2%以下——我们的解决方案页面称之为「校准与数据问题,而不是模型架构问题」。同一研究还报告,84%的系统集成项目失败或部分失败;典型检测部署中,集成工作占项目时间线的60%,而模型训练只占15%。我反复读的那句:「硬件只是一张采购单。」
于是我做了一件略显离经叛道的事:故意让演示里的缺陷模型平平无奇。它是到已知合格纹理的kNN距离,一个轻量PatchCore替身,在MVTec AD metal_nut留出测试集上(真实制造零件的真实照片、公开标签),区分干净合格件与缺陷件的AUROC为0.845。我不隐瞒这个数字,也不拿它卖货。在生产中,这个槽位放的是你的NVIDIA Metropolis流水线、你的Cognex系统、你的定制模型,背后是固定接口。产品是引擎周围的那一层,而不是引擎本身。
这一层从一个准确率指标回答不了的问题开始:这张图像是否处于模型验证时的采集条件之内?演示中的EnvelopeDetector在物理信号空间(曝光、对比度、动态范围、对焦代理、高频细节、热色偏、饱和度、眩光占比)计算马氏距离,仅用220张已知合格训练图像拟合,别无其他。当零件落在该验证包络之外时,门控完全停止信任模型输出——无论模型自我感觉多有把握。
即便完美的模型,也只在其验证包络内的输入上有效。
整次构建都挂在这句话上。漂移是输入失败,不是模型失败;而输入失败永远不会出现在你的准确率仪表盘上。它出现在报废箱里。
06:00会发生什么?
整个演示里我最信任的时刻是一个时间戳。应用在工位「Line 3 - metal_nut press」上重放一段确定性的脚本班次,把真实的MVTec AD metal_nut照片流经完整流水线。中途,屏幕上闪过标记:「SHIFT CHANGE 06:00 - cold dies, bay lights on。」接着12件合格件带着眩光、失焦和热色偏到达。我想把这说清楚:照片是真的,漂移是施加其上的诚实图像损坏,应用也如实标注。我没有冲压线可拍,假装有会毁掉整个论点。
接下来发生的事,正是演示存在的理由。包络监视器变红。门控把每个漂移件读为验证包络之外,拒绝让模型判定触达执行器。一条又一条判定返回HOLD,转入人工升级队列;旁边面板则显示:没有包络检查的朴素AOI面对同一图像会怎么做:REJECT。

第一次看着队列堆满时,我点进一件暂扣件,以为会看到含糊的「检测到异常」借口。相反,包络监视器按信号逐项分解了违约——因为我用物理测量而非嵌入来构建它,而物理测量可以自我解释。在一件漂移件上,亮度距验证拟合达7.6个标准差,贡献了平方马氏距离的87.1%。那不是模型在「有感觉」。那是仪器读数。

漂移阶段结束时,记分板触目惊心。朴素基线已自动报废12件合格件。信任门控自动报废数量为零,将它们全部暂扣复查。同一批图像、同一个替身缺陷模型、同一套缺陷分数阈值。唯一的差别是:一条路径在信任输出之前检查了输入。
朴素基线与门控看到的是同一批零件和同一个模型。唯一的差别是是否获准执行。

关于那个美元数字——演示通常从这里开始说谎:面板把测得的朴素误拒率外推到整班(每分钟40冲程×8小时=19,200件),按每件报废$2.42计。$2.42是有出处的数量级,锚定于一则已发表的饼干制造商案例:报废浪费降低8.7%节省了每年9.4万美元和38,800公斤产品。这不是客户数字,计数器出现的每一处都标注为推算。我测量的是误拒;我推算的是美元;界面写明了哪个是哪个。
在相信自己的漂移故事之前我又核对了一件事:漂移阶段注入的缺陷件仍被抓住或升级,从未自动放行。在整个留出集上,这个数字是93/93。如果坏件在混乱中漏过,暂扣好件就毫无意义。
我的包络检查是在给自己的作业打分吗?
我最不信任的基准数字,恰恰是我自己最好的那个。第一次跑bench脚本时,包络检测器几乎完美地区分了漂移图像与干净图像。我的第一反应不是骄傲,而是怀疑——因为考试的两边都是我出的:眩光、失焦、热色偏损坏是我写的,检测器监视的物理信号也是我选的。当然眩光检测器会抓住眩光。稍有锋芒的审稿人都会说这是循环论证,而且他们说得对。
于是我将一类漂移彻底留出。检测器从未针对欠曝光调参,开发期间也从未见过它。然后我重新运行bench.py(最近一次在2026-07-17)于MVTec AD metal_nut留出测试集:22件合格、93件缺陷,仅用220张合格图像做训练拟合。在留出的欠曝光族上,包络检测器得分AUROC 1.000。正是这个数字支撑论题,恰恰因为它来自我从未特意设计的失效模式。脚本仅在实测数字真正支持主张时才打印「THESIS HOLDS」;我写成这样,是为了让营销无法偏离测量。
基准的其余部分也值得给出精确范围,所以我不做有利于自己的取整,原样如下。在漂移合格件上,无包络的朴素基线按漂移族误拒95.5%到100%(眩光100%、失焦100%、热色偏100%、欠曝光95.5%,平均98.9%)。信任门控对它们的误拒为0.0%,每一件都暂扣复查。诚实的附带说明:损坏是满强度的,因此基线近乎全面崩溃是设计使然。我要捍卫的主张是方向——干净验证过的模型一旦输入离开包络就会崩溃——而不是某个具体百分比。这些是研究基准在合成漂移下的测量。它们不是开放世界保证,任何人把它们当作生产性能来引用都是误用,包括我自己。
我差点删掉的规则
这次构建中我做过的最艰难的诚实抉择,关乎一条几乎不起作用的规则。早期我加了一条几何区域规则:在粗略的8×8网格上定位异常,并对功能区内缺陷与外观边缘瑕疵区别对待。这听起来像真正的计量学。然后我去测,结果令人谦卑。局部粗糙度代理在93件留出缺陷中定位到33件异常,约35%。它改变门控结果的次数恰好是1/93。而18次自动拒收中,0次有真实定位到的异常支撑;当无法定位时,质心回退到网格中心,默认读作区内。
我面对三个选项。删掉规则并假装从未试过。留下它并让界面暗示我并不具备的精密计量。或者留下它并让界面坦白。我选择了坦白。当演示的主缺陷自动拒收时(零件test-flip-264,来自MVTec flip类的真实严重结构缺陷),几何下钻明确写明:该件未定位到任何异常,拒收仅基于纹理置信度。

这条规则恰好赚回一次存在价值,而且我让应用去证明它,而不是去编排它。启动时,演示在全部93件留出缺陷中搜索:在一件原本置信度很高的零件上,是否存在真正定位在功能区外的异常。在已交付的划分中,该搜索找到test-flip-251,质心在第2行第6列,门控将其路由到HOLD而不是触发执行器。如果数据变了、没有零件符合条件,这一节拍就不会出现。我甚至用5折交叉验证对规则的sigma阈值做了A/B测试;拟合值相对手设的2.5没有改进,所以我保留了2.5,并把阴性结果记入仓库,标记为"shipped": false。在生产项目中,这条规则会被像素级、CAD锚定的计量取代。在演示里它是诚实的替身,界面在每个零件上都这么说。
一个自我夸大的信任层,从定义上就是自相矛盾。
这句话成了一条设计规则。如果产品的全部承诺是知道何时不该信任模型,它就不能同时对自己最弱的组件虚张声势。
智能体出主意,代码做决定
我拒绝委托的决策,是会推动金属的那个。门控本身是朴素的确定性代码,在任何LLM之外,也在视觉模型之外。其阈值由演示自身数据拟合,而非随口一说:在校准置信度尺度上,低于0.948自动放行、高于1.30自动拒收,介于其间以及一切出包络的,都走HOLD。它对着硬性的750 ms冲程窗口预算运行;在已交付的审计日志里,决策落在数十毫秒内:test-good-288在37.7 ms自动放行,test-good-289在24.4 ms,test-flip-264的拒收执行器日志写着「REJECT actuated in 25ms (budget 750ms)。」
我该直说清楚:真正被驱动执行的是什么——目前还没有。通向Allen-Bradley ControlLogix拒收执行器的EtherNet/IP路径是一个模拟器,精确记录它本会做什么;MES接收端则是写入本会写入的追溯行的桩。两者在应用中都标注为桩。它们的形态像真实适配器,因为OT现实(西门子与Allen-Bradley混用的工厂、以毫秒计的拒收窗口)才是真正的产品表面;但若演示暗示有一条在线产线,就会通不过自己的信任测试。
系统里有智能体,而且我有意限制了它们。当零件在升级队列中堆积时,一个Drift Triage配对开始工作:诊断智能体读取暂扣件上排序后的物理信号偏差,提出根因假设与建议动作;评审智能体再对照数值证据核验该假设,若所引信号并非实际主导偏差,则降级为「人工调查」。它们基于Pydantic AI构建且可切换提供商;未配置API密钥时整体退化为确定性模板分诊,因此演示可完全离线运行。智能体依设计不能做的事:触碰执行器。等它们开口时,门控早已决定。
智能体出主意,代码做决定。
每一个这样的决策都留下收据。每个零件写入一条JSONL溯源记录:零件id、工位、模型id metalnut-defect-knn版本v7、数据集哈希ae95b5b533c8、缺陷置信度、OOD分数、物理信号、触发了哪些门控规则、相对750 ms预算的延迟、执行与MES日志行、朴素基线本会怎么做,以及风险标签high-risk:quality-gate(《欧盟人工智能法案》附件III,生效2026-08-02)。一键将班次导出为inspection_audit.jsonl。

这里的监管时钟很重要。《欧盟人工智能法案》的高风险义务于2026年8月2日全面适用,安全关键质量决策落在附件III,最严重的禁止实践违规最高罚款达3500万欧元或全球营业额的7%。我想措辞谨慎,因为这正是措辞要紧的地方:演示并非经《欧盟人工智能法案》认证,也没有任何演示能被认证。它展示的是EU-AI-Act就绪的溯源——按产线速度生成、而非事故后重建的、设计为可归档进高风险符合性卷宗的逐决策记录。
下一次模型升级之后,还能剩下什么?
构建时我不断问自己的问题,对演示制作者来说很残酷:如果客户的下一个缺陷模型远强于我的替身,这一切还重要吗?我现在觉得问反了。Deloitte预测制造业agentic AI采用率将从6%升至2026年的24%(Deloitte),这意味着更多模型、更多自主性抵达更多执行器。每一个这样的模型都会有验证包络,而冲床产线的物理条件(眩光、冷模、热平衡)会不断把输入推出包络。完美模型对此毫无改变,因为门控要防止的失败是输入失败,它服务的审计义务是法律义务,不是建模义务。漂移门控、溯源与受控执行在任意模型准确率下都成立。正是这一性质说服我:值得构建的是这一层,而不是又一个模型;脚本班次在veriprajna.com/zh-Hans/demos/edge-ai-manufacturing-inspection,是我试图让你逐件观看它兑现这一主张的尝试。
如果你更想看而不是听我描述,这里是创始人剪辑,从头到尾。
所以,关于你产线上的任何检测模型——包括准确率97%的那个——我会问的不是「它有多准?」而是:对刚刚越过相机的那个零件,你是否知道那张图像是否处于模型验证包络之内?如果你无法逐件、在毫秒内、带着可交给审计员的记录作答,那我认为你没有准确率问题。我认为你有包络问题,而我真心想知道你的产线是哪一种。


