MapleCheng

在浩瀚的網路世界中無限潛水欸少年郎!

0%

當 AI 排程系統撞上配額與 Rate Limit,我怎麼把它改得沒那麼脆弱

最近我又被一個很典型、但也很現實的問題教育了一次:AI 自動化流程真正會讓你痛的,通常不是模型不夠聰明,而是外部世界根本不穩。

事情很簡單。我有一套會定時跑的 AI 報告流程,平常看起來很順:到點觸發、抓資料、整理內容、輸出摘要。聽起來很合理對吧?但只要其中兩個外部依賴同時出狀況,整套流程就會瞬間從「自動化助手」變成「凌晨把你叫起來的告警機器」。

這次的組合拳是這樣:模型端碰到額度或 credit 問題,搜尋端又撞到 rate limit。然後災難就開始了。

問題從來不是單點故障,而是連鎖故障

很多人設計 AI workflow 時,會先假設主模型可用、搜尋 API 穩定、抓回來的內容格式正常。這種設計在 demo 階段沒什麼問題,但一旦進入排程環境,事情完全不是這樣。

排程系統的特性是:

  • 它會固定時間跑
  • 它會跟其他 job 搶同一批外部資源
  • 它發生錯誤時,通常不是你坐在旁邊即時救火

所以真正麻煩的不是「某個 API 壞掉」,而是:

  • 主模型剛好沒額度
  • 備援模型能用,但輸出風格不同
  • 搜尋 API 同時因為短時間請求太多回 429
  • 你後面還有其他 cron 也排在差不多的時段

這時候如果流程只寫成「失敗就重試」,通常只會更慘。

因為你其實不是在處理一個短暫失敗,而是在放大整體壅塞。

我後來接受一件事:AI pipeline 一定要預設會失敗

以前我會把 fallback 當成加分題,現在我比較像把它當成必考題。

也就是說,設計流程時就先問自己:

  • 主模型失敗了怎麼辦?
  • 搜尋拿不到結果怎麼辦?
  • 只拿到半套資料時,可不可以先產出一個品質尚可的版本?
  • 如果今天真的不能產出,是不是至少要「清楚失敗」,而不是默默死掉?

這個心態差很多。

因為你一旦接受「失敗是常態」,設計就會從追求完美輸出,轉成追求可恢復、可退化、可觀測

我現在比較偏好的做法:三層 fallback

我後來把這類 AI 排程流程,盡量拆成三層。

第一層是模型 fallback
主模型不通,就切到備援模型。這很基本,但實作時要注意一件事:不要假設所有模型輸出格式完全一致。你最好在後面加一層標準化,否則前面只是換模型,後面 parsing 一樣炸。

第二層是資料來源 fallback
如果搜尋 API 回 429,不代表整篇報告就不能做。有些內容可以用較少的搜尋請求完成,有些可以改成直接抓已知來源,有些則可以降低覆蓋範圍,先產出「夠用版」。

第三層是結果等級 fallback
不是所有任務都非得輸出完整版。很多時候,

  • 完整版
  • 精簡版
  • 失敗摘要版

這三種層級,比單純的成功 / 失敗二分法實用很多。

            
            flowchart TD
    A[cron 觸發] --> B{主模型可用?}
    B -- 是 --> C[主流程生成]
    B -- 否 --> D[切換備援模型]
    D --> E{搜尋可用?}
    C --> E
    E -- 是 --> F[完整資料整理]
    E -- 否 --> G[縮減搜尋範圍 / 直接抓既有來源]
    F --> H[輸出完整版]
    G --> I{資料是否足夠?}
    I -- 是 --> J[輸出精簡版]
    I -- 否 --> K[輸出失敗摘要與原因]
          

Rate limit 不是 bug,是系統設計邊界

我以前看到 429,第一反應常常是:「靠,又被擋了。」

現在比較像是:「好,這代表我對外部服務的使用方式,已經碰到它的制度邊界了。」

這不是 bug,比較像是你系統設計時沒有把現實世界算進去。

尤其多個 cron 在相近時間一起跑時,最容易出現這種問題。你以為每個任務都只打幾次 API,很節制;但當它們同時發生,總量就完全不是那回事。

所以我現在會優先做幾件事:

  • 減少不必要搜尋,先問「這次真的需要幾個來源?」
  • 把能共用的資料抽成一次抓取,而不是每個 job 各抓一次
  • 降低同時併發數,寧可慢一點,也不要一起炸
  • 遇到 429 時尊重節流,不做情緒化狂重試

說穿了,rate limit 其實在提醒你:你的系統現在太貪心了。

真正有用的不是「永不失敗」,而是「失敗時還像個系統」

我現在越來越不相信那種宣稱自己全自動、全穩定、全智能的 AI 工作流。

不是因為 AI 沒用,而是因為真實世界根本不是實驗室。模型會變、供應商會限流、網站會改版、排程會碰撞、外部資料會缺漏。這些都不是例外,是日常。

所以我對一套 AI 自動化流程的評價標準,慢慢變成下面這幾個:

  • 失敗時有沒有清楚的原因
  • 有沒有備援路徑
  • 可不可以降級輸出
  • 出問題時,下一次修正會不會很容易

如果答案是 yes,那這套系統就算還不完美,我也會覺得它已經夠成熟。

CTO 的私心總結

做 AI 系統久了,我反而越來越少迷信模型本身,越來越重視整體工程設計。

模型當然重要,但真正決定體驗的,常常是那些很不 glamorous 的東西:排程、重試、節流、fallback、觀測性、錯誤訊息。

這些東西平常沒人在意,直到某天它們一起出事,你才會發現:原來 AI 系統最難的地方,從來不是讓它「看起來很聰明」,而是讓它在不順的時候,仍然表現得像一個可靠的系統

如果你最近也在做 AI 自動化,而且偶爾被 429、配額、超時、外部服務不穩搞到懷疑人生,那我真心建議:先別急著改 prompt,先回頭檢查你的 fallback。很多時候,救你的不是更強的模型,而是更老實的系統設計。