AI Newsway

合併3000次、零回滾:Anthropic兩週加速衝刺的內幕

用CPU指令數而非碼表來卡建置,claude.ai的p75可輸入時間從3.1秒降到0.55秒

|6分鐘閱讀0
Server infrastructure of the kind behind claude.ai, whose client-side load path Anthropic rebuilt during a two-week performance sprint
Server infrastructure of the kind behind claude.ai, whose client-side load path Anthropic rebuilt during a two-week performance sprint

Anthropic這篇新的工程文章裡,最值得別人搬回去用的並不是claude.ai兩週內快了約三倍這件事,而是團隊留下的那條絆線:一道以CPU指令數為準的CI關卡,數值只能往下走。這讓往後每一個拉取請求都變成一次效能測試。

重點摘要

  • 在第75百分位,claude.ai全新載入到可以打字的時間從3.1秒降為0.55秒;Claude Code的新工作階段則從0.8秒降到0.3秒。
  • 兩週內合併超過三千次變更,沒有任何影響客戶的事故,也沒有回滾。
  • 兩條熱路徑的指令數分別下降48%與31%,換算成實際耗時是減少78%與44%。正是這項驗證,讓團隊敢用指令數而非計時來卡CI。

為什麼是指令數,而不是碼表

使用者感受到的是延遲,但毫秒級的讀數雜訊太大,不足以拿來判定建置失敗。Anthropic的做法是去找確定性的數字,而不是有代表性的數字,並且在信任每個數字之前,先證明它確實跟著真實延遲走。

驗證的樣本是組裝對話訊息樹的那段常式。用Valgrind分析後發現,其中四分之一的指令是超型態的字典查詢,同一個訊息ID被分三次解析。修掉這段,再加上Claude Code輸出中的狀態列掃描,指令數分別少了48%與31%,同樣路徑的實際耗時則掉了78%與44%。到這時,指令數才成為CI中的永久上限,並由一支夜間工作在每次建置低於上限時把門檻再往下調。

圍繞著這套做法的紀律,和機制本身一樣重要。只要某個基準測試被證實不穩定,或是它會變動但使用者延遲不動,團隊就直接刪掉而不是容忍它,否則模型會去爬一座沒人想爬的山。React的commit次數、V8涵蓋率的呼叫次數、樣式重算與DOM變動,也都通過了同一輪試鏡。

這個三倍是拿什麼當基準

範圍在任何東西上線之前就先定好。Claude透過Datadog的MCP伺服器讀取使用遙測資料,挑出佔整體活動95%的四條動線:啟動應用程式、開始新對話、打開舊對話、送出訊息。這四條後來變成橫跨網頁與桌面的十三項量測,每一項都以使用者操作為起點、以畫面渲染為終點。

十三項目標中有十二項在第三天就達成。手法一點也不華麗:把靜態輸入框直接寫進HTML,讓React初始化期間也能打字;預先編譯V8程式碼快取,讓桌面殼層省下一次重新編譯;在對話之間讓輸入框保持掛載;滑鼠移過去就預取工作階段;側邊欄的重新渲染減少90%。Anthropic估算,這些加總起來每天替使用者省下數萬小時的等待。

只有靠數才看得見的臭蟲

接下來的清單,與其說是效能待辦事項,不如說是對沒有任何儀表板在看的東西所做的稽核。全面清點掛鉤後,找到6900個會在每次按鍵時重新渲染輸入框的掛鉤。一個:root:has()選擇器,對每一次DOM變動收取24毫秒。一段被遺忘的location.reload(),每天觸發五十萬次,卻沒出現在任何載入指標上。相同的快取快照,在主執行緒上每分鐘被複製進IndexedDB兩次。

最離奇的一個,是完成的程式碼區塊會卡住約一秒,追查後發現元兇是破折號。只要出現一個非Latin-1字元,V8就會把整個字串當成UTF-16保存,於是所有語法高亮的正規表示式都掉到較慢的雙位元組路徑上。二十行程式碼,先把區塊複製成單位元組字串,問題就消失了。

版面位移最直接說明了這一點。側邊欄每跳一次,累積版面位移大約是0.008,遠低於0.1這個判定頁面「良好」的門檻——換句話說,標準指標說一切正常。改成直接讀Layout Instability API的原始資料,並依頁面區域替位移貼標籤後才看出,31%的網頁載入在頁面已經可用之後仍有東西在動。

零回滾才是更難的那個數字

兩週合併三千次,講的是產出量。在首次繪製、輸入框這種曝險極高的熱路徑上,既無事故也無回滾,講的則是流程——值得照抄的是後者。

拆開來看,每個環節都很常規:每個拉取請求都要經過自動審查加至少一位人類核准;單元測試寫在它要保護的那項最佳化之前;任何使用者看得到的改動都藏在短命的旗標後面;並從員工、1%使用者到全體逐步放行。不常規的是量——兩週內開出將近兩百個旗標、撤掉其中一半以上,而全部拉取請求約有三分之一帶的是新的遙測或護欄,而不是修正。量測被當成變更的一部分,而不是後續補票的工單。

這件事為何重要

過去,量測是第零步:先推出一個指標,等資料,然後才開始理解問題。當手上有一個你給什麼數字它就往什麼方向最佳化的代理程式,量測就變成攀爬的第一步,而稀缺的資源轉移到「到底什麼值得給一個數字」的判斷上。從83萬行的Rust重寫,到讓代理程式寫程式但把部署權留給人的Perplexity,其他高度倚賴代理程式的工程案例,也看得到同樣的倒轉。

Anthropic很小心,沒有把它說得太滿。該公司自己的紀錄寫道,這個循環很有生產力,但並不自主:目標、取捨與核准都留在人手上,而其中一項長期任務,是持續推著模型在範圍上別像預設那樣保守。對那些把這篇當範本讀的團隊來說,令人不安的推論是:瓶頸會移到審查產能,以及決定該量什麼的品味上——這兩樣都不會因為多加代理程式而變多。

FAQ — 常見問題

這次衝刺是由哪個模型執行的

Anthropic表示,它使用了測試版的Claude Tag,底下跑的是一個內部研究模型,公司形容其能力大致與Opus 5.5相當。所有工作都在單一共用的Slack頻道裡協調,而不是透過專門工具。

這些變更有經過人工審查嗎

有。每個拉取請求都經過自動審查,並且需要至少一位人類核准;使用者看得到的變更則藏在功能旗標後面,依序對員工、1%的使用者、再到全體漸進放行。

沒有內部模型的團隊能照做嗎

機制本身不挑模型:先證明某個確定性指標和延遲相關,再把它放進CI裡逐步收緊即可。不能照搬的是產出量——兩週合併三千次,預設了多數團隊得先自行建立的審查產能與量測基礎。

對這篇文章有什麼感想?

SJ
載入中...

相關文章

Claude Code Projects 回歸,化身統籌平行雲端執行緒的協調者
Developer Tools

Claude Code Projects 回歸,化身統籌平行雲端執行緒的協調者

重新設計的 Claude Code Projects 在工作執行緒之上擺了一個協調者,每條執行緒都是跑在自有分支上的完整雲端工作階段,並且共用同一份記憶。

Seung Jung6 天前
研究人員從論壇影像漏洞一路摸進OpenAI內部儲存庫
Developer Tools

研究人員從論壇影像漏洞一路摸進OpenAI內部儲存庫

Hacktron AI串起libheif堆積溢位與OpenAI的SSO缺陷,觸及員工Codex帳號與openai/openai單一程式庫。兩個漏洞皆已修補。

Seung Jung6 天前
Plugin4Shell:零點擊 RCE 打穿 Claude Code、Codex、Copilot 與 Gemini CLI
Developer Tools

Plugin4Shell:零點擊 RCE 打穿 Claude Code、Codex、Copilot 與 Gemini CLI

名為 Plugin4Shell 的零點擊 RCE 繞過了 AI 程式代理用來確保外掛可信的提交釘選機制,四家業者中僅兩家推出修補。

Seung Jung6 天前
企業開始把自家非公開原始碼當作AI評測資料出售
Developer Tools

企業開始把自家非公開原始碼當作AI評測資料出售

Specific Labs從一家消費產品公司和一家金融科技平臺手中獲得非公開程式碼庫授權,搭建出Real-SWE,把專有程式碼變成了爬不到的AI評測資料。

Seung Jung9 天前
14.5週寫出83萬行Rust:一場由代理主導的重寫
Developer Tools

14.5週寫出83萬行Rust:一場由代理主導的重寫

GitHub動用編碼代理,在14.5週內把43萬行TypeScript轉成83萬2,378行Rust,記憶體用量從1,383MB降至126MB。

Seung Jung5 天前
Meta 透過 MCP 把 WhatsApp Business 設定交給 Claude 與 Codex
Developer Tools

Meta 透過 MCP 把 WhatsApp Business 設定交給 Claude 與 Codex

Meta 將 WhatsApp Business 帳號設定開放給 AI 程式撰寫代理,新推出的 WhatsApp Business Tools MCP 伺服器讓 Claude Code 與 Codex 從註冊電話號碼一路處理到範本與 Webhook 設定。

Seung Jung8 天前