AI 互動教室 ‹ MLOps 自動化技術
下載 .py 單獨開啟實驗場 ↗ 留言回報
WHY MLOPS · 前導 · 00

為什麼需要 MLOps:
模型會過期

模型很少「壞掉」。它不會當機、不會噴錯誤、不會在半夜叫醒你。 它只是每天照常回答,而答案越來越常是錯的——因為世界變了,模型沒變

下面是一顆真的模型的 24 個月:第 0 個月訓練好上線,之後沒人動它。 你可以在任何一個月按下「重訓」,看曲線怎麼跳回去、又怎麼開始往下掉。 多按幾次,你就會問出這堂課要回答的問題:到底該什麼時候按?

每一個點都是實驗場模擬跑出來的實測值(每月 300 位新客戶、6 個特徵, 每次重訓都真的重新訓練一次)。虛線是完全不重訓的下場。

這一課的實驗場是真的 Python(在你的瀏覽器裡跑,不用安裝任何東西)。 首次載入約需 30–60 秒,正好夠你讀完第 1 節。裡面沒有程式碼要讀—— 每一段都有滑桿,拉一下,整整 24 個月的模擬就會重跑一次。

01 · 安靜地爛掉

模型上線那天,就開始過期

這個模擬裡有一間公司在做「客戶會不會流失」的預測。第 0 個月訓練好模型、上線, 每個月有 300 位新客戶進來,模型逐一判斷,月底對答案,得到那個月的準確率。 模型完全沒有變——變的是世界:客戶的組成、競爭對手、什麼樣的人會走。

上線後那個月的準確率感覺
第 1 個月0.94驗收通過,大家很開心
第 6 個月0.79有人覺得怪怪的,但說不上來
第 12 個月0.68業務開始抱怨名單不準
第 23 個月0.45比丟銅板還差

24 個月平均 0.660。而這段期間,系統監控是全綠的:沒有當機、沒有錯誤、 沒有告警。這是機器學習系統最危險的失敗方式——它會安靜地爛掉, 而且通常是業務先發現,不是工程師。

傳統軟體壞掉會噴例外,你馬上知道。模型「壞掉」的樣子是準確率慢慢滑落, 你只有在持續量它的時候才看得見。這句話就是整個 MLOps 的起點。

02 · 兩種漂移

世界有兩種變法,只有一種會讓準確率掉

「世界變了」其實包含兩件完全不同的事,分清楚它們,你才知道要監控什麼:

名字變的是什麼比喻
資料漂移 進來的資料變了,但「什麼答案才對」的規則沒變 考卷的題型分佈變了(以前一半代數一半幾何,現在九成幾何),解法還是同一套
概念漂移 規則本身變了 同一題,標準答案改了

實驗場的第 2️⃣ 節讓三個世界跑同一件事——訓練一次、之後不重訓——結果很反直覺:

世界24 個月平均準確率進來的資料有沒有變
完全不變0.926沒有
只有資料漂移0.945 變很多(某特徵月均值 -0.08 → +1.56,流失比例 48% → 95%)
概念漂移0.660 幾乎沒變
  • 只有資料漂移時,準確率沒掉(0.945,甚至比世界完全不變的 0.926 還高一點點)。 規則沒變,模型學到的那條界線還是對的,只是進來的人整批移到了它的一側。 準確率沒掉不代表沒事——這個模型正在服務一群訓練時沒見過的客戶。
  • 概念漂移時,資料看起來一切正常。你盯著輸入資料看到天亮也看不出異狀, 準確率卻已經腰斬。

這兩件事合起來,決定了監控要怎麼做:資料漂移不需要標籤就看得見 (比對輸入分佈,今天就能算),它是早期警訊;而概念漂移只有拿到標籤、 算出準確率才會現形——所以你必須有一個地方,持續記錄每個月的成績。 沒有那份紀錄,你連「什麼時候開始掉的」都答不出來。

03 · 什麼時候重訓

三種策略:不重訓、定期重訓、監控觸發

知道模型會過期之後,只剩一個問題:什麼時候重訓?三種做法, 在實驗場的 3️⃣ 節可以用滑桿即時比較(世界變化速度 0.12 時的實測):

策略做法平均準確率重訓次數
不重訓 訓練一次,永遠不動0.6600
定期重訓 每 3 個月重訓一次,不管準不準0.9007
監控觸發 準確率掉到 0.85 以下才重訓0.8894

定期重訓的成績最高,但監控觸發只用了 4 次重訓就拿到幾乎一樣的結果。 這就是這張表要一起看兩欄的原因:重訓次數就是成本——算力、工程師的時間、 每一次上線都要承擔的風險。

門檻該設多少?把實驗場的滑桿從 0.95 拉到 0.70,你會看到一條很清楚的取捨線:

門檻 0.95 → 平均 0.916,重訓 23 次 ← 等於每個月都重訓 門檻 0.90 → 平均 0.903,重訓 7 次 門檻 0.85 → 平均 0.889,重訓 4 次 門檻 0.80 → 平均 0.870,重訓 3 次 門檻 0.70 → 平均 0.829,重訓 2 次

從 0.85 拉到 0.95,多花 19 次重訓,平均準確率只多買到 2.7 個百分點門檻太高=天天重訓,太低=掉到很慘才救——中間那個甜蜜點不在這堂課裡, 在你自己的成本表:一次重訓要花多少錢,準確率掉一個百分點你要賠多少。

順帶一提,門檻拉到 0.95 的成績(0.916)跟「每 1 個月定期重訓」一模一樣—— 門檻拉到極限,監控觸發就退化成定期重訓,還多花了監控的力氣。

04 · 標籤總是遲到

你不會馬上知道自己錯了

上面的「監控觸發」偷藏了一個很甜的假設:這個月準不準,這個月月底就知道。 真實世界很少這樣。你要等客戶真的解約、等帳單真的逾期、等病人真的回診, 答案才會揭曉——標籤晚幾個月是常態

而標籤遲到會同時造成兩件事,第二件比第一件更傷:

  1. 警報遲到:第 12 個月的準確率,你第 15 個月才知道,那時已經爛了三個月。
  2. 連教材都過期:要重訓,只有「已經有標籤」的資料能用。你手上最新的有標籤資料 也是三個月前的——重訓出來的模型一出生就落後三個月,很快又跌破門檻, 於是再重訓一次。追著自己的影子跑。
標籤延遲平均準確率重訓次數
當月就知道0.8894
晚 3 個月0.85111
晚 6 個月0.79614

又慢又忙:準確率掉了 9 個百分點,重訓次數變成 3.5 倍。 更難堪的是最後一列——延遲 6 個月的監控觸發(0.796), 已經輸給什麼都不看、每 6 個月固定重訓一次的 0.867,而後者只重訓了 3 次。

所以真實專案的第一個問題往往不是「要用什麼演算法」,而是 「我的標籤多久會到?」——這個數字決定了監控值不值得做、 決定了你是不是該乾脆改用定期重訓,也決定了值不值得花錢買更快的標籤 (人工抽樣標註、找一個提早看得到的代理指標)。

05 · 這個系列在做什麼

「監控觸發」要真的跑起來,需要五個零件

到這裡,正確答案已經浮出來了:持續看著準確率,該重訓的時候重訓, 而且要確定新模型真的比舊的好。這句話講起來一秒,做起來需要五樣東西—— 每一樣正好是這個系列的一課:

你需要沒有它會發生什麼哪一課
每次訓練的設定與指標留得下紀錄、查得回來 你不知道是第幾個月開始掉的,也不知道當時用了什麼參數 01 MLflow 實驗追蹤
模型有版本,新舊能比較,能一行換上去、換錯能退回 重訓出一顆新模型,卻不敢換,因為不知道它比舊的好還壞 02 Models 與 Registry
「取資料 → 訓練 → 評估」是一張看得懂的圖,不是散落的腳本 誰先誰後靠人腦記,換人接手就斷掉 03 Dagster 軟體定義資產
有東西會在對的時間按下重訓(排程,或偵測到就觸發) 監控會響,但沒有人按 04 Dagster 自動化
上線前有品質閘,比舊版差就擋下來 重訓反而把線上弄壞——重訓不保證變好 05 Dagster × MLflow 管線

最後一列特別值得留意,因為這堂課的模擬對重訓太仁慈了:這裡的重訓永遠成功、 永遠拿得到乾淨的新資料、訓出來永遠不比舊的差。真實世界三件事都不保證—— 你在第 6️⃣ 節把世界變化速度拉到 0 就會親眼看到,重訓有時候是純成本, 有時候還會讓成績變差一點。所以完整的自動重訓,最後一步一定是 「先擋下來,通過才換上去」。

「MLOps」這個詞聽起來很大,但它要解決的就是上面這五件事。 接下來五堂課,你會親手把它們一個一個做出來。

06 · 實戰

換你動手

實驗場的 6️⃣ 節有四根滑桿,把前面所有旋鈕放在一起:世界變化速度、定期重訓的週期、 監控觸發的門檻、標籤延遲。三個挑戰,全部都是「拉到某個值,看表格怎麼變」:

LEVEL 1

把「世界變得多快」拉到 0(世界完全不變),其他不動。 三條線會變成什麼樣子?三種策略各重訓了幾次、平均準確率是多少? 誰做了白工?

LEVEL 2

世界變化速度放回 0.12、標籤延遲 0, 把「監控觸發門檻」從 0.95 一格一格拉到 0.70, 記下每一格的平均準確率與重訓次數。多花 19 次重訓,平均準確率買到幾個百分點?

LEVEL 3

把「標籤晚幾個月」拉到 6,然後只調「每幾個月定期重訓」, 找出一個能贏過這個監控觸發的設定。怎麼知道你贏了?看表格的兩欄—— 平均準確率更高、重訓次數更少,兩件事要同時成立。 做完再回答自己一個問題:你手上的專案,標籤多久會到?

卡住了?每一題在實驗場末節都有折疊解答——先自己拉一遍,再打開對照。

07 · 驗收

情境測驗

離開前試試看:下面的情境都真的會遇到。每題選一個你認為的最佳做法,選了馬上看得到解釋。

Q1 情境題

模型上線 8 個月,每月準確率都在 0.93 上下、一點都沒掉;但你發現進來的客戶跟訓練時很不一樣(某個特徵的月平均從 -0.08 一路走到 +1.5,正類比例從 48% 變成 95%)。最合理的處置是?

本課實測:只有資料漂移的世界,24 個月平均準確率是 0.945,甚至比「世界完全不變」的 0.926 還高一點——因為決定答案的規則沒變,模型學到的界線還是對的。所以 C 是過度反應:重訓要花錢、要承擔上線風險,而這裡沒有東西需要被修。但 A 也不對——資料漂移是你不用等標籤就看得到的唯一訊號,而且模型正在服務一群訓練時沒見過的客戶,值得繼續盯。D 更糟:實測把門檻拉到 0.95,重訓次數會從 4 次暴增到 23 次(等於每個月都重訓),平均只多 2.7 個百分點。正確的心態是:資料漂移=多看一眼;概念漂移(準確率真的掉)=該動手了。

Q2 情境題

你的專案要等客戶真的解約才知道答案,標籤大約晚 6 個月。團隊提議做「準確率低於門檻就自動重訓」。你的建議是?

實測數字站在 C 這邊:標籤晚 6 個月時,監控觸發的平均準確率是 0.796、重訓 14 次,而「每 6 個月固定重訓一次」是 0.867、只重訓 3 次——又準又便宜。原因是延遲同時傷了兩件事:警報晚 6 個月響,而且重訓只能用 6 個月前的舊資料,模型一出生就落後,很快又跌破門檻。A 的直覺(監控一定比較省)在標籤夠快時成立,在這裡剛好相反。B 會讓情況更糟:門檻越高觸發越頻繁,等於用過期教材一直重訓。D 則是放棄治療——本課第 1 節那條掉到 0.45 的曲線就是它的結局。

Q3 錯誤診斷

你把「世界變得多快」拉到 0(世界完全不變),實驗場給出這張表。為什麼定期重訓做了 7 次,平均準確率反而比完全不重訓低一點?

世界變化速度 0.00 不重訓 平均 0.926 最低 0.900 重訓 0 次 定期重訓(每 3 個月) 平均 0.922 最低 0.880 重訓 7 次 監控觸發(門檻 0.85) 平均 0.926 最低 0.900 重訓 0 次

A 正是這堂課要打破的直覺:重訓不保證變好。世界沒變的時候,新資料裡沒有任何新資訊,重訓只是拿另外 300 筆樣本重擲一次骰子,運氣不好就略差一點(0.922 對 0.926)。C 說的災難性遺忘是持續學習的問題,這裡每次都是從頭訓練,不適用。D 把因果說反了——監控觸發沒被觸發,正是它做對了:它的成績跟不重訓一樣好,而且省下 7 次重訓。真正的教訓有兩個:定期重訓在穩定的世界裡是純成本(這就是監控觸發存在的理由),而「重訓可能更差」也正是每條自動重訓管線都必須有品質閘的原因——新模型要先跟舊的比過,贏了才准上線。

Q4 錯誤診斷

同樣的門檻 0.85、同樣的世界,只有「標籤延遲」不同。標籤越晚到,重訓次數為什麼反而變多

標籤延遲 平均準確率 重訓次數 晚 0 個月 0.889 4 次 晚 3 個月 0.851 11 次 晚 6 個月 0.796 14 次

關鍵在於延遲同時弄慢了警報和教材,而後者才是次數暴增的原因:第 m 個月要重訓,手上最新的有標籤資料是第 m-N 個月的,訓出來的模型等於「N 個月前的最佳解」,放到今天的世界馬上又不夠好,於是很快再觸發一次——追著自己的影子跑。A 不成立,這個模擬每次重訓都只用一個月份的資料,資料量固定。B 說反了:延遲不會改變任何一個月算出來的準確率數值,它只改變你什麼時候看到那個數字。D 是想像出來的 bug,每個月只判斷一次。帶得走的結論:先問標籤多久會到,再決定監控策略。

Python 環境載入中(首次約 30–60 秒)…讀完第 1 節它就好了