-->

whaust

2026年9月10日 星期四

Uber 如何打造 AI 軟體工廠?模型分工、上下文管理與成本優化全解析

AI Coding 正快速走出「工程師偶爾叫模型幫忙寫程式」的階段。Uber Engineering 在〈Running a Software Factory Efficiently at Uber Scale〉中,描述的已經是一套可大規模運作的 AI Software Factory:模型負責推理,代理負責拆解與執行,工具與企業知識提供上下文,最後再用成本與品質指標持續校正整個系統。

AI 軟體工廠以自動化產線協調程式碼、代理與監控系統
圖 1|導言之後:AI 軟體工廠把模型、工具、上下文與成本治理整合為同一條工程產線。

從 AI Coding 走向 Software Factory

Uber 公布的規模,說明 AI 已經進入日常工程流程:

  • 超過 70% 的 Pull Request 可歸因於本機或雲端 Agent。
  • 內部累積超過 3,600 個 Agent Skills。
  • 每天執行超過 30,000 次 Agent Skill。
  • 2026 年 2 月到 8 月,Agent 每週活躍使用者成長 7 倍,請求量成長 9.4 倍。
  • 在使用量大幅增加的同時,AI 總支出自 4 月後相對穩定。
  • 固定同一模型比較,每千次請求成本下降約 34%,每個 Session 成本下降 52%。

真正值得注意的地方,不只是使用量,而是 Uber 沒有把「節省成本」理解成限制工程師使用 AI。它的目標是增加有效使用,同時降低每次工作的浪費。

AI 支出 = 使用者數 × 每人 Session 數 × 每個 Session 的 Turn 數 × 每個 Turn 的 Request 數 × 每個 Request 的 Token 數 × 每 Token 價格

企業應鼓勵更多使用者、更多高價值 Session,同時降低不必要的 Turn、Request、Context 與昂貴模型使用。這也是 Agent FinOps 與傳統 API 成本管理最大的不同。

模型分工:主代理負責判斷,子代理負責執行

如果所有工作都交給最強、最貴的模型,規模一上來,成本必然失控。Uber 的做法是把主代理與子代理的職責拆開:

  • 主代理:規劃、拆解任務、評估結果與品質驗收。
  • 子代理:搜尋、寫程式、執行測試、查詢資料等範圍明確的工作。
  • 模型路由器:依工作難度、品質需求、延遲與成本,選擇合適模型。
主代理將搜尋、程式開發與測試工作分派給三個專用子代理
圖 2|模型分工段落之後:主代理規劃與驗收,子代理執行搜尋、Coding 與 Testing。

這套設計的關鍵不是「弱模型取代強模型」,而是讓每個模型處理適合自己的工作。Uber 也不只比較模型榜單,而是針對真實 workload 建立 benchmark,評估 Accuracy、F1、Latency、Timeout、Reliability 與 Cost,找出品質與成本都合理的 Pareto Model。

同樣的思路也適用於 reasoning effort。檔案搜尋、格式轉換、簡單查詢和小幅程式修改,通常不需要最高推理強度;架構決策、複雜除錯與高風險變更,才值得使用更強模型與更高 reasoning。預設採 Medium,再依任務升降,是更可控的企業策略。

上下文管理:更大的 Context Window 不等於更有效率

Agent 的成本很容易被上下文放大。一段對話會逐步累積 system prompt、程式碼、工具輸出、MCP schema、log 與舊結果,而這些內容可能在每次請求中重複傳送。

Uber 即使使用支援 100 萬 token context 的模型,也會在約 40 萬 token 時自動壓縮。理由很務實:可容納更多資訊,不代表應該無限制攜帶更多資訊。

大量上下文經過壓縮與快取後轉化為精簡可重用資訊
圖 3|上下文管理段落之後:將龐大上下文壓縮成精簡、可重用的資訊。

Prompt Cache 也必須配合真實工作節奏。工程師送出任務後,可能過 10 到 30 分鐘才繼續對話;若 cache 五分鐘就失效,下一次互動便要重新傳送大量 context。Uber 因此把互動式 workflow 的 cache TTL 拉長到一小時,而生命週期短的子代理仍使用較短 TTL。

這裡可以歸納出三個原則:

  1. 設定 context budget,不要把視窗上限當成目標。
  2. 依工作型態設定 compaction 時機。
  3. 讓 cache TTL 對齊人與 Agent 的實際互動間隔。

MCP、CLI 與 Code Mode:不要讓模型處理機械式工作

MCP 能讓 Agent 連接企業工具,但大量工具 schema 也會擠占上下文。Uber 擁有超過 1,000 個 MCP servers;若一次載入上百個工具,初始 prompt 可能光 schema 就增加約 5 萬到 7 萬 token。

Uber 的方向是透過 Tool Search 動態尋找能力,再以 CLI 投影需要的 MCP 工具。Agent 不必一開始知道所有 schema,只在需要時載入需要的命令。

眾多工具經搜尋漏斗、命令列與程式模式轉化為精簡結果
圖 4|MCP 與 Code Mode 段落之後:需要時搜尋工具,再透過 CLI 與程式處理工作。

Code Mode 進一步把輪詢、分頁、格式轉換與資料彙整交給程式。傳統流程可能讓模型反覆送出 SQL、查詢狀態、取得結果,再把每一步加入 context;Code Mode 則讓模型先生成一段程式,由程式完成 submit、poll、fetch 與 summarize,最後只把必要結果交回模型。

Uber 公布的 SQL 測試顯示,簡單查詢可節省約 55% 到 71% token;面對寬表時,token 使用量甚至能從 140 萬級降到約 900。

能由 deterministic workflow 完成的事情,就交給程式;模型應負責理解、規劃、判斷與例外處理。

Context Graph:讓 Agent 找到正確的企業知識

大型企業的另一個瓶頸,是 Agent 不知道資料在哪裡。Uber 面對數億行程式碼、數千張資料表與超過 30 個內部系統,建立了包含約 2,400 萬個節點、8,000 萬條邊、86 種節點類型與 117 種關係類型的 AI Context Graph。

這張圖把 Service、Team、Incident、Pull Request、Architecture Document、Deployment、Dataset 與 Table Usage 等資訊連結起來,讓 Agent 不必每次都從零開始搜尋。

企業知識圖譜連結服務、團隊、程式碼與資料並由成本儀表監控
圖 5|Context Graph 段落之後:企業知識關係與成果成本必須一起觀測。

在 Uber 的案例中,相同 prompt 與相同模型,有 Context Graph 時約 38 秒得到正確答案;沒有 Context Graph 時耗時 20 分 09 秒,啟動兩個子代理、遇到三次錯誤,最後仍回答錯誤。

Agent Capability = Model + Context + Tools + Skills + Workflow + Evaluation

模型只是其中一個元件。企業真正能累積的護城河,是高品質上下文、可靠工具、可重用技能、治理流程與持續評估。

企業導入 Agent 的五個落地原則

  1. 不要把每個任務都交給最強模型。建立 model routing,依 workload 選擇成本與品質最合適的模型。
  2. 不要把每個工具都塞進 context。使用 Tool Search 與動態載入。
  3. 不要讓模型逐步執行 deterministic work。將輪詢、批次處理與資料轉換交給 Code Mode。
  4. 不要讓 Agent 在企業資料中盲目搜尋。建立 Context Layer 或 Context Graph。
  5. 不要只監控 API 帳單。同時觀察 cost per session、cost per task、cost per PR、cache hit rate、成功率與實際商業成果。

最終成熟度不應用「用了多少 token」衡量,而應看每個 merged PR、每次 code review、每個 alert triage 或每個完成任務的單位成本與品質。

結語

Uber 的 AI Software Factory 說明,企業 Agent 平台的核心不只是選一個更強的模型。真正的系統能力來自模型分工、上下文工程、工具治理、程式化執行、知識圖譜、可觀測性與成本管理。

當企業把這些元件組合起來,AI 才能從零散的個人工具,變成穩定、可擴展、可衡量的生產系統。

參考資料:Uber Engineering—Running a Software Factory Efficiently at Uber Scale

2026年9月5日 星期六

收到「急件」別急著點:上班族 5 招辨識釣魚信

早上打開信箱,看到一封寫著「您的帳號即將停用」、「包裹派送失敗」或「請立即確認付款」的信,很多人第一反應都是:糟了,要趕快處理。


這正是釣魚信最常利用的心理。它不一定寫得很可怕,但總會讓你覺得「現在不做就會出事」。下次遇到這種訊息,先別急著點。花三十秒檢查,往往就能避開一場麻煩。


1. 先看寄件者,不只看顯示名稱


釣魚信常會把名稱偽裝成銀行、物流公司,甚至公司內部同事。例如畫面上可能顯示「人資部」或「某某銀行」,看起來很正常。

真正要看的,是後面的電子郵件地址。假設你的公司網域是 company.com,卻收到來自 company-support.net 的信,就要提高警覺。也要注意拼字很像的網址,例如把英文字母 l 換成數字 1,乍看不容易發現。

2. 別被「很急」兩個字催著走

「今天下午前未完成,帳號將被停用」、「立即付款,否則包裹退回」這類句子,是很常見的壓力手法。

真正重要的服務通知,通常不會只留給你一封要求立刻點擊的信。遇到催促訊息時,可以先直接開啟該服務的官方 App 或官方網站,再從那裡查看帳號、訂單或通知狀態。不要透過信中的連結進入。

3. 點連結前,先看它要把你帶去哪裡


滑鼠停在連結上方,先看看畫面角落顯示的網址。若信件說是某銀行或 Microsoft 服務,連結卻通往一串奇怪的英文、數字,或和品牌毫無關係的網域,就不要點。

手機上不方便看完整網址時,更建議不要急著操作。先用電腦開啟官方網站,或把信轉給公司 IT/資安窗口協助確認。

4. 附件不是不能開,但要先問「為什麼是我?」

有些釣魚信不放連結,而是附上「薪資調整表」、「發票」、「報價單」或「會議資料」。看到熟悉的檔名不代表安全,尤其是你根本沒有期待收到這份文件時。

先問自己三件事:寄件者真的是我認識的人嗎?我最近有要求這份文件嗎?檔案格式合理嗎?如果答案有任何一項不確定,先透過另一個管道向寄件者確認,例如公司通訊軟體或電話。

5. 不小心點了,也不用慌

如果只是打開可疑網站,但沒有輸入帳密、沒有下載檔案,可以先關掉頁面,並清除瀏覽器資料;之後留意帳號是否出現異常登入通知。

如果已經輸入帳密,請立刻從官方網站更改密碼,並啟用多因素驗證。如果是在公司設備上操作,盡快通知 IT 或資安人員。越早通報,越容易降低影響。

最後記住一個簡單原則:讓你「很想立刻處理」的信,更值得先停一下。多看寄件者、多確認網址、多問一句,就能讓釣魚信少一次得手機會。




2026年1月29日 星期四

Palo Alto GlobalProtect 整合 PrivacyIDEA MFA 實作指南

Palo Alto GlobalProtect 整合 PrivacyIDEA MFA 實作指南

這份文件是基於系統架構圖與驗證循序圖所撰寫的技術實作指南。旨在協助負責設定的工程師理解 Palo Alto GlobalProtect 結合 PrivacyIDEA 進行 Google Authenticator 多因素驗證 (MFA) 的運作原理與實施步驟。


1. 架構原理與通訊邏輯

本架構的核心在於將 Palo Alto 防火牆的驗證機制卸載給 PrivacyIDEA (作為 RADIUS Server),由它來統一處理「第一層 AD 密碼驗證」與「第二層 TOTP 動態碼驗證」。

1.1 網路分區與流向

  • 使用者端 (User): 位於外部網路,透過 GlobalProtect Client 發起 VPN 連線 (SSL/IPSec)。
  • 邊界防護 (Perimeter): Palo Alto PA-440 僅開啟外部 VPN 接口,內部則需允許 UDP Port 1812 流量通往 PrivacyIDEA 伺服器。
  • 內部信任區 (Internal):
    • PrivacyIDEA: 負責接收 RADIUS 請求,並向後端的 AD 進行 LDAP 查詢 (TCP 389/636)。
    • Active Directory (AD): 僅負責儲存身分與驗證靜態密碼,不直接面對防火牆的 RADIUS 請求。

1.2 TOTP 驗證機制 (離線驗證)

關鍵觀念:Google Authenticator 的驗證是伺服器本地計算。PrivacyIDEA 伺服器不需要連線至 Google 雲端。

原理:伺服器與使用者手機持有相同的「種子密鑰 (Secret Key)」。伺服器根據當下時間與種子,算出正確的 6 位數代碼,並與使用者輸入的代碼比對。

2. 詳細驗證流程說明

工程師需理解此流程以利除錯 (Troubleshooting)。

階段一:主要憑證驗證 (AD 密碼)

  1. 使用者在 VPN Client 輸入 AD 帳號密碼。
  2. PA-440 將帳密封裝成 RADIUS Access-Request 封包,送往 PrivacyIDEA。
  3. PrivacyIDEA 收到後,透過 LDAP 向 AD 確認帳密是否正確。
  4. 若 AD 回傳成功,PrivacyIDEA 暫不回傳 Success,而是進入階段二。

階段二:MFA 挑戰與回應 (Challenge-Response)

  1. PrivacyIDEA 回傳 RADIUS Access-Challenge 給 PA-440。
  2. PA-440 通知 Client 彈出視窗:「請輸入 Google Authenticator 代碼」。
  3. 使用者查看手機 App 並輸入 6 位數代碼。
  4. PA-440 將代碼再次封裝成 RADIUS Access-Request 送往 PrivacyIDEA。
  5. 關鍵步驟: PrivacyIDEA 在本地執行 TOTP 演算法比對代碼。
  6. 比對成功後,回傳 RADIUS Access-Accept,防火牆放行連線。

3. 工程師設定步驟 (Configuration Steps)

請依照資料流向,由內而外進行設定。



步驟 A:PrivacyIDEA 設定 (RADIUS Server)

  1. 設定 LDAP Resolver:
    • 新增 Authentication Source,指向內網的 AD Server (Port 389 或 636)。
    • 設定 Bind DN 與 Password 以便讀取使用者清單。
  2. 設定 RADIUS Client:
    • Clients 設定中新增 PA-440 的 IP 位址。
    • 設定 Shared Secret (共用密鑰): 此密碼務必記錄下來,稍後防火牆設定需完全一致。
  3. 使用者 Token 綁定:
    • 為使用者 Enroll 一個 TOTP Token,並確保使用者已掃描 QR Code。

步驟 B:Palo Alto PA-440 設定 (Firewall)

  1. 設定 RADIUS Server Profile:
    • 位置:Device > Server Profiles > RADIUS
    • 新增 PrivacyIDEA 伺服器 IP (Port 1812)。
    • 填入步驟 A 設定的 Shared Secret
    • 重要:Timeout 時間拉長 (建議 30~60 秒),因為使用者掏出手機看代碼需要時間,預設 3 秒會導致連線逾時失敗。
  2. 設定 Authentication Profile:
    • 位置:Device > Authentication Profile
    • Type 選擇 RADIUS
    • Server Profile 選擇剛建立的 Profile。
  3. 套用至 GlobalProtect:
    • 分別在 PortalGateway 的 Authentication 選項中,掛載上述的 Authentication Profile。

步驟 C:網路與防火牆規則 (Network Policy)

  • PA-440 到 PrivacyIDEA: 確保 Security Policy 允許從 Firewall Interface IP 到 PrivacyIDEA IP 的 UDP/1812 (RADIUS) 流量。
  • PrivacyIDEA 到 AD: 確保 PrivacyIDEA 伺服器能存取 AD 的 TCP/389 (LDAP)TCP/636 (LDAPS)

4. 除錯與注意事項 (Troubleshooting)

  1. 時間同步 (Time Synchronization):
    由於 TOTP 是基於時間的 (Time-based),請確保 PrivacyIDEA Server 的系統時間與標準時間誤差在 30 秒內,否則算出來的代碼永遠對不上。
  2. RADIUS Secret 不一致:
    若 PA-440 顯示 "Server Unreachable" 或 "Auth Failed" 但 PrivacyIDEA Log 顯示 "Bad Authenticator",通常是 Shared Secret 打錯。
  3. RADIUS Timeout:
    若使用者輸入代碼後顯示連線逾時,請檢查 PA-440 的 RADIUS Timeout 設定是否足夠長。

5. 常見問題 (Q&A)

Q. 所以 PrivacyIDEA 設定 Google Authenticator 是一次性的?

A. 沒錯,設定(綁定)的動作是「一次性」的。

比喻:就像您配對藍牙耳機一樣:配對只需做一次,之後每次使用只需連線即可。

為了讓您更清楚這個概念,我們可以將其拆解為「綁定階段」與「使用階段」:

1. 綁定階段 (Enrollment) - 只做一次

這是建立信任關係的時刻。

  • 動作: PrivacyIDEA 產生一個 QR Code (裡面包含了一串加密的種子密鑰,Seed Key)。
  • 使用者: 用手機打開 Google Authenticator App 掃描這個 QR Code。
  • 結果: 此時,「PrivacyIDEA 伺服器」與「使用者的手機」雙方都儲存了同一份「種子密鑰」。
  • 結束: 這個 QR Code 之後就不需要了 (除非要換手機)。

2. 驗證階段 (Authentication) - 每次登入都要做

這是利用那份密鑰進行數學運算的時刻。

  • 動作: 當使用者要登入 VPN 時。
  • 使用者: 打開 App,App 會用「當下的時間」+「那份種子密鑰」算出一個 6 位數代碼。
  • 伺服器: PrivacyIDEA 也用「當下的時間」+「那份種子密鑰」算出一個代碼。
  • 比對: 因為時間一樣、密鑰一樣,算出來的代碼就會一樣。


Popular