一個關於知識萃取、Kafka 消費者重平衡,以及當一家公司發現他們的 AI Skill 只懂過去、卻不懂現在時會發生什麼事的故事。
內容改編自社群成員投稿。如果你也有類似的故事,或有什麼話想說但一直悶在心裡——歡迎聯絡我。下一篇也許就是你的故事。
你的公司有沒有曾經把你的經驗抽取到一個系統裡,然後又覺得沒你也夠用?
你有沒有看過一個 AI Skill 正確處理了 312 個情境,並開始擔心第 313 個出現時你人還在不在?
這就是那個故事。
會議室沒有窗戶。三個月了。
每週一到週四,我都坐在那張塑膠椅上——錄音筆、筆電、桌上的馬克杯。對面坐著一位名叫 Caleb 的工程師。他的工作就是問我問題。
「為什麼選 PostgreSQL,不選 MongoDB?」
「為什麼重試間隔是 450 毫秒?」
「你怎麼算出那個告警閾值的?」
我回答。他記下來。錄音筆上的紅燈一直亮著。
他們把這稱作是「知識移轉計畫」。CTO 的全員信寫得很漂亮:我們正在保存數十年的組織知識,傳承給下一代工程師。
講白一點:你的經驗太貴了。我們要把它包裝成一個 Skill。
一開始我沒太當回事。每家公司都有知識管理。直到第三個月,Caleb 不再問問題了。他開始做驗證。
他調出一個我去年排查過的事件——一次正式環境故障。他要我重現診斷過程。然後他讓系統自己跑。
系統說:偵測到訊息中介層延遲飆高。450 毫秒的重試邏輯在佇列背壓下會加劇問題。建議採用自適應退避。
我讀了三遍。沒錯。那就是我的推理鏈——只是它說得比我還快。
CTO 站在我旁邊微笑。我在矽谷看過太多次那種笑容。那不是開心。那是拍板。
我確定事情不對勁,是驗證報告出來的那天。
一整排人坐在桌子對面——CTO、HRBP、工程副總裁,還有一位我不認識的女士,西裝外套上有顧問公司的標誌。
投影幕上只有一個數字:知識保留率:96.8%
Caleb 匯報了結果。「經過三輪驗證,這個 AI Skill 在 312 個歷史故障情境中達到 96.8% 的診斷準確率。剩餘的 3.2% 偏差是因為上下文不足而導致的次佳建議——可透過指導修正。」
掌聲響起。CEO 轉頭對我說了一句我永遠忘不了的話。
「Mark,你打造了自己的替代品。」
大家都笑了。我也笑了。還能怎麼辦?
會後我在停車場坐了很久。咖啡已經涼了。車窗外,那片一成不變的加州藍——一直都是那個顏色。手機震動了一下。是我太太傳來的訊息:你幾點回家?
我打了「快了。」又刪掉了。
我不知道該怎麼跟她說,我花了三個月把自己變成一本說明書。而一旦你把說明書寫好了,就不需要原件了。
隔週一,CTO 關上辦公室門,跟我進行一對一會談。
「Mark,我不跟你繞圈子了。你的職位已經因組織重整而被裁撤。」
他把一個信封推到桌子對面。
N+3。三個月資遣費。典型矽谷式的「我們不是在解僱你,我們是在幫你轉職」。
我沒停下來就簽了。不是因為不在乎——而是因為我在走進來之前,早就把結局演練過一遍了。
我最後一天是星期五。清空桌面只花了不到四十分鐘。一個背包、一個螢幕支架、三個筆蓋——我到現在都不知道為什麼抽屜裡會有三個筆蓋。
我坐在車裡,用手機查了三件事:
那天晚上,我註冊了一家公司。Mark Johnson Consulting LLC。沒有辦公室,沒有員工,沒有 VC 簡報。只寫了一條很清楚的條款:只接專案制。交付鏈不得使用 AI。
第一個完整季度,這套系統成了展示品。
AI Skill 吸收了 70% 的二級維運工單。新工程師從要六個月才能上手,縮短到三週。CEO 在全員會上用了一張很俐落的投影片:
以前:Mark 花了 12 年累積的經驗都鎖在腦中。
之後:Mark 12 年的經驗可以直接用 prompt 取得。
沒有人提到 Mark 本人。他們不需要。因為他已經被包裝好了。
我太太比我更早察覺。離職後的那個週末,她在廚房看著我,說了一句我沒料到的話。
「你看起來不一樣了。」
「哪裡不一樣?」
「你坐在電腦前又不說話的時候,那種緊繃感不見了。你以前是在等事情出包,現在你是在等客戶。」
她說得對。我是在等。
我在 LinkedIn 上看到他們找了一位新的平台主管。那人做的第一件事就是重建監控堆疊。至於那個 Skill?他們在遷移到 Kafka 之後,沒有人重新跑一次驗證。為什麼要跑?打造它的人已經不在了。
事情發生在星期三凌晨 3:47。
分散式追蹤系統亮了起來。核心支付鏈路的 P99 延遲從 80 毫秒飆到 12 秒。三分鐘後,第一筆交易逾時並回滾。十分鐘後,支付佇列開始堆積。二十三分鐘後,回滾觸發連鎖反應——兩個下游服務開始拒絕請求。
值班工程師打開了 AI Skill。它掃描日誌、辨識模式,然後回傳一個診斷。
偵測到訊息中介層延遲。套用已知緩解方式:啟動帶 450 毫秒退避的重試佇列。
這個診斷在 312 個歷史情境裡,312 次都對。
這次是第 313 次。
450 毫秒的重試視窗,是我五年前為 RabbitMQ 寫的一個相容性補丁。那個數字不是隨便來的——我曾在 RabbitMQ 叢集上做了兩週壓力測試,才找出剛好能避開它的 Erlang VM GC 週期的那個間隔。
但那是 RabbitMQ。三年前就退役了。他們現在跑的是 Kafka。
Kafka 的 consumer group 使用的是基於 poll 的協定——每個 consumer 都必須依照設定間隔持續向 coordinator 進行輪詢,否則 coordinator 會把它判定為死亡並觸發重平衡。我的重試工作器是同步式的——一次處理一個訊息,再拉下一個。每輪 450 毫秒,幾十筆訊息一疊上去,poll 視窗就會被拉長好幾倍。
# Skill 的做法(450 毫秒重試視窗)
def handle_queue():
while queue_not_empty():
msg = fetch_one_message() # 一次只取一筆
retry_with_backoff(450ms) # ⏱ 每筆 450ms
process(msg)
poll_consumer() # 「還活著嗎?」→ 越拖越慢
# 當有 60 筆佇列訊息時會發生什麼
poll_timeout = 5000 # coordinator 判定死亡前的 5 秒
time_per_round = 60 * 450 # 60 筆 × 450ms = 27,000ms
# 27,000ms > 5,000ms → 錯過 poll timeout → 觸發重平衡
一旦重平衡啟動,整個群組就開始震盪。新的 consumer 搶走 partition。舊訊息被重送。延遲又往上爬。原本棘手的問題,瞬間變成滾雪球。
這個 AI 執行了一個在舊架構上 100% 正確的策略。但在現在的架構上,它是在火上加油。
AI 不是因為錯了才失敗。它是因為對昨天太對了——而昨天早就沒有在跑了。
我的電話在凌晨 4:12 響了。
一個我好幾個月沒撥過的名字——我前任 CTO。
他的聲音很平靜。太平靜了。當工程師在凌晨四點打電話來,而且語氣還這麼穩時,就表示有東西在燒。
「Mark。我需要問你一件事。」
「問吧。」
他用三句話把事故說完。我原本以為他會問回滾策略、損害控管。但他沒有。
「你在 RabbitMQ 遷移文件裡留了一條註記。當時沒人看懂。我們以為只是過時的設定註解。我想我現在懂了。」
我往床頭一靠。房間裡唯一的光是手機螢幕。我太太在旁邊翻了個身。沒醒。
那條註記寫的是:450ms 對應 RabbitMQ 的 GC 視窗。不可在此情境外重用。
電話那頭沉默了大約四秒。
「我知道,」他說。「我沒時間了,Mark。回來吧。」
「我不是在問你要不要回來。」他的語氣變了。「我是請你回來。這個月剩下的時間我全部暫停。你來決定。你開價。」
「我原本薪水的五倍。」
我聽到他倒抽一口氣。
「……成交。但我需要你到現場兩週。簽約制。自己帶設備。不得讓任何 AI 接觸你的交付鏈。」
「沒問題。把合約寄給我律師。」
我其實沒有律師。我的意思是:這件事要照我的節奏來。
掛掉電話後,我滑到一個快一年沒聯絡的名字——Mike,大學室友,法學院畢業。傳了一則訊息。
接到一份合約。方便幫我看一下嗎?
他沒回。凌晨四點,除了 IT 圈的人,還有誰醒著?
我等了一下。然後又打了五個字。這次我傳給他,其實也是傳給我自己。
這次由我來定價。
你也遇過這種事嗎?你的知識被萃取、打包成一個 Skill,變成你不再被需要的理由。然後當那個 Skill 遇到它看不懂的東西時,他們又回頭找你。難道真的沒有比「不」更好的答案嗎?
這個 Skill 記得每一個過去的情境。它只是看不見基礎架構已經改變了。
公司省下了六位數的人力成本。他們只是忘了:驗證只有在撰寫驗證的人還在時,才能重新執行。
系統當掉的時候——他們打給了誰?
追蹤我,閱讀更多關於 AI 萃取、隱性知識,以及當公司發現他們的 Skill 只記得過去時會發生什麼事的故事。
我沒辦法教 AI Skill 理解上下文。但故事還會繼續。 請我喝杯咖啡 ☕