
我一直想修好模型。問題其實是燈光。
這次打造,我在白板上寫下的第一個數字是 97%。第二個是 14。
它們描述的是同一個模型。在我們研究中的沖壓案例裡,一個在實驗室驗證達 97% 準確率的視覺模型,被放到一台每分鐘跑 40 次沖程的 200 噸級進模具沖壓機上,卻開始把 14% 的合格零件誤判剔除。模型內部什麼都沒變。變的是輸入:隨沖程角度偏移的廠房頂燈眩光、溫熱模具上與冷模具上不同的潤滑劑積聚,以及每個班次前 50 件——在沖壓機達到熱平衡之前做出的零件。產線的物理條件把影像推離了模型當初驗證時的分布,而沒有任何模型,無論準確率多高,在那種環境下都不可信。
這個專案的最後一段,我花在打造一個認真對待那句話的示範。它叫做 Inspection Trust Gate,你可以一個零件一個零件地看它做決策,就在 veriprajna.com/zh-Hant/demos/edge-ai-manufacturing-inspection。它不是一個更好的瑕疵模型。它是視覺模型與 PLC 剔除致動器之間的執行期層,唯一的工作是為每一個零件決定:模型的裁決是否 可安全致動。
接下來是這次打造的故事,貫穿三個改變我對檢測 AI 看法的時刻:一次腳本化在 06:00 發生的漂移事件、一個我拒絕相信的基準數字,以及一條我幾乎刪掉的規則。
解法不是更好的模型
這句話我抗拒得太久了。當偵測器行為失常時,我作為打造者的每一個本能都說:重新訓練它、升級骨幹、買更多標註。研究卻始終拒絕配合。開箱即用的 AOI 系統會誤判剔除 5% 到 15% 的合格零件,調校良好的可壓到 2% 以下——我們的解決方案頁面稱之為「校準與資料問題,而非模型架構問題」。同一份研究報告指出,84% 的系統整合專案失敗或部分失敗;在典型的檢測部署中,整合工作佔專案時程的 60%,而模型訓練只佔 15%。我反覆重讀的那一行:「硬體是一張採購單。」
於是我做了一件感覺有點離經叛道的事:我刻意讓示範裡的瑕疵模型平凡無奇。它是對已知合格紋理的 kNN 距離,一個 PatchCore-lite 的替身,在 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 個 sigma,並佔平方馬氏距離的 87.1%。那不是模型在「有感覺」。那是儀器讀數。

到漂移階段結束時,計分板冷峻刺眼。樸素基線已自動報廢 12 個合格零件。Trust Gate 自動報廢了 零,全部暫扣供審核。相同的影像、相同的替身瑕疵模型、相同的瑕疵分數門檻。唯一的差別是:一條路徑在信任輸出之前先檢查了輸入。
樸素基線與閘道看到的是相同的零件與相同的模型。唯一的差別是致動的許可。

說說那個美元數字,因為這正是示範通常開始說謊的地方:面板把測得的樸素誤判剔除率外推到一整班(每分鐘 40 次沖程 × 8 小時 = 19,200 件),按每件報廢 $2.42 計算。$2.42 是有來源的數量級,錨定於一則已發表的餅乾製造商案例——8.7% 的報廢浪費降低,一年省下 $94K 與 38,800 kg 產品。那不是客戶的數字,計數器每次出現都標成預估。我量測的是誤判剔除;我外推的是美元;介面說清楚哪邊是哪邊。
在相信自己的漂移故事之前,我又檢查了一件事:漂移階段注入的瑕疵零件仍會被抓到或升級,從不自動放行。在整個留出集上,這個數字是 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%)。Trust Gate 對它們的誤判剔除為 0.0%,每一件都暫扣供審核。誠實的但書:損壞是全強度的,所以基線近乎全面崩塌是 就設計本身而言。我願意辯護的主張是方向——一個乾淨驗證過的模型,一旦輸入離開其包絡就會崩塌——而不是某個特定百分比。這些是研究基準在合成漂移下的量測。它們不是開放世界的保證;任何人把它們當成生產效能來引用,都是誤用——包括我自己。
我幾乎刪掉的那條規則
這次打造裡最難的誠實抉擇,關乎一條幾乎不起作用的規則。早期我加了一條幾何區域規則:在粗略的 8×8 網格上定位異常,並對功能區內的瑕疵與外觀邊緣的疵點差別對待。聽起來像真正的計量學。然後我量測了它,結果令人謙卑。局部粗糙度代理在 93 個留出瑕疵中定位出 33 個異常,約 35%。它改變閘道結果的次數恰好是 93 中的 1。而 18 次自動剔除中,0 次有真正定位到的異常撐腰;當什麼都定位不到時,質心回落到網格中心,預設讀成區內。
我坐下來面對三個選項。刪掉規則,假裝從沒試過。留下它,讓介面暗示我並沒有的精密計量學。或者留下它,並讓介面坦白。我選了坦白。當示範的主角瑕疵自動剔除時(零件 test-flip-264,來自 MVTec flip 類的真實粗大結構瑕疵),幾何深入檢視直說:這個零件上什麼都沒定位到,剔除完全依賴紋理信心。

這條規則恰好賺回一次價值,而我讓應用程式證明它,而不是上演它。啟動時,示範在全部 93 個留出瑕疵中搜尋:一個在其他方面高信心的零件上、真正定位到功能區外異常的零件。在已出貨的分割上,這次搜尋找到 test-flip-251,質心在第 2 列第 6 欄,閘道把它轉到 HOLD 而不是觸發致動器。如果資料變了、沒有零件符合條件,那個節拍就乾脆不出現。我甚至用五折交叉驗證 A/B 測試了規則的 sigma 門檻;擬合值相對手設的 2.5 沒有改善,所以我保留 2.5,並在 repo 裡用 "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 接收端則是一個 stub,寫下它本來會寫的可追溯性那一行。兩者在應用程式裡都標成 stub。它們長得像真實轉接器,因為 OT 現實(Siemens 與 Allen-Bradley 混用的工廠、以毫秒計的剔除窗口)才是真正的產品介面;但若一個示範暗示自己連著活產線,就會通不過自己的信任檢驗。
系統裡有代理,而我刻意框住它們。當零件堆進升級佇列時,一組 Drift Triage 搭檔開始工作:診斷代理讀取暫扣零件上排序後的物理訊號偏差,提出根因假說與建議行動;評審代理再對照數值證據檢查該假說——若被引用的訊號其實不是主導偏差,就把它降級為「人工調查」。它們建在 Pydantic AI 上、可替換供應商;若未設定 API 金鑰,整套降級成確定性的範本分流,因此示範可完全離線運行。代理依建構無法做到的事:碰觸致動器。等它們開口時,閘道早已決定。
代理給建議,程式碼做決定。
每一個決策都留下收據。每個零件寫一筆 JSONL 譜系紀錄:零件 id、工位、模型 id metalnut-defect-knn 版本 v7、資料集雜湊 ae95b5b533c8、瑕疵信心、OOD 分數、物理訊號、哪些閘道規則觸發、相對 750 ms 預算的延遲、致動與 MES 日誌行、樸素基線本來會怎麼做,以及風險標籤 high-risk:quality-gate(EU AI Act Annex III,生效 2026-08-02)。一鍵把班次匯出為 inspection_audit.jsonl。

這裡的法規時鐘很重要。EU AI Act 的高風險義務於 2026 年 8 月 2 日全面適用,安全關鍵的品質決策落在 Annex III,最嚴重的禁止實務違規最高罰金達 €35M 或全球營業額的 7%。我想謹慎用詞,因為正是在這裡,謹慎用詞才重要:這個示範不是 EU AI Act 認證的,也沒有任何示範能夠是。它展示的是 EU-AI-Act-ready 的譜系——一份為高風險符合性檔案而設計、可歸檔的逐決策紀錄,在產線速度下生成,而不是在事故後重建。
下一次模型升級之後,什麼還站得住?
打造時我不斷問自己的問題,對示範打造者來說很殘酷:如果客戶下一個瑕疵模型遠勝我的替身,這一切還有意義嗎?我現在認為那正好反了。Deloitte 預測製造業的代理式 AI 採用率將從 6% 升到 2026 年的 24%(Deloitte),意味著更多模型、更多自主性會抵達更多致動器。那些模型每一個都會有驗證包絡,而沖壓產線的物理條件(眩光、冷模具、熱平衡)會持續把輸入推離它。完美模型對此毫無改變,因為閘道要防止的失敗是 輸入失敗,而它服務的稽核義務是法律義務,不是建模義務。漂移閘控、溯源,以及受治理的致動,在 任何模型準確率下都成立。正是這個性質說服我:值得打造的是這一層,而不是另一個模型;腳本化班次在 veriprajna.com/zh-Hant/demos/edge-ai-manufacturing-inspection是我嘗試讓你一個零件一個零件地看它贏得這個主張。
若你寧願看它,而不是讀我描述它,這裡是創辦人剪輯,從頭到尾。
所以,對於你產線上的任何檢測模型——包括 97% 的那個——我會問的問題不是「它有多準?」而是:對剛剛越過攝影機的那個零件,你是否知道那張影像是否落在模型驗證時的包絡之內?如果你無法按零件、在毫秒內、用一份可以交給稽核員的紀錄來回答,那我不認為你有準確率問題。我認為你有包絡問題——而我真心想知道,你的產線有的是哪一種。


