AI-LECTURER 速報課|2026-09-25|約 25 分鐘

先學會「量」,AI 才幫得上「快」:Anthropic 兩週把 claude.ai 變快約 3 倍的做法

取材:Once Claude can measure something, it can make it faster(Hacker News(AI 高人氣))
📍 真實場景
林雅婷,32 歲,12 人電商新創的前端工程師

客服連續三天轉來同一句話:「商品頁好慢」。老闆要她這週讓網站變快,她正盯著一大坨程式碼,猜該從哪裡下手。

😖 卡住的地方:她憑直覺改了三個地方,但沒有任何數字能說明有沒有變快;更怕改到一半把結帳頁弄壞,上線後才被客訴發現。她想請 AI 幫忙,卻不知道該叫它做什麼。
💡 這課拆解 Anthropic 用兩週把 claude.ai 與桌面版的核心體驗變快約 3 倍的方法,並帶你親手做出一套「先量測、再比較、再把關」的迷你工具。

🧭 這到底是什麼(白話版)

Anthropic 的工程團隊發現,claude.ai 網站和 Claude 桌面應用程式被使用者嫌慢,而且他們坦承「使用者說得對」。於是在 8 月做了一次為期兩週的衝刺sprint,把人力集中在一個明確目標上、限時完成的工作方式,把核心操作的速度提升了約 3 倍。整場衝刺都在同一個 Slack 頻道裡進行,Claude 出現在每一個討論串中。

整件事的關鍵句就是文章標題:只要 Claude 能量測某件事,它就能把那件事變快。所以團隊第一步不是改程式,而是讓 Claude 先讀遙測資料App 在使用者裝置與伺服器上自動回報的使用紀錄與耗時數字,挑出佔 95% 使用者活動的四條使用者旅程使用者為了完成一件事而經歷的一連串操作,例如從打開 App 到能開始打字:啟動 App、開始一場對話、載入既有對話、送出訊息。網頁版與桌面版、各產品加起來,共拆成 13 個量測項目。

為了讓這 13 個數字能互相比較,團隊補上了埋點在程式裡插入計時與記錄的程式碼,讓每次操作花了多久都留下數字,規定每個量測都從「使用者動作」開始、到「結果畫面顯示完成」才結束,並把「使用者裝置上花的時間」和「伺服器上花的時間」分開算。成果用 p75把所有人的等待時間由短排到長,第 75% 位置的那個數字;代表四個人裡有三個人等待時間不超過它 表示:新開 claude.ai 到「可以打字」從 3.1 秒降到 0.55 秒;開一個新的 Claude Code 工作階段從 0.8 秒降到 0.3 秒;載入 Claude Cowork 雲端工作階段從 2.6 秒降到 0.73 秒。

在這套流程裡,Claude 扮演的是代理人不只回答問題,還會自己規劃步驟、動手做事、檢查結果的 AI:找瓶頸、寫基準測試、送出改進、盯著每一次上線。人類只做三件事:設定目標、決定取捨、批准每一項改動。最後團隊合併了超過三千項改動,沒有任何一次造成客戶端事故,也沒有任何一次需要回滾上線後發現有問題,把程式退回上一個穩定版本。

🎯 為什麼值得你花時間

沒有數字,就沒有「變快」團隊先把 13 個量測做到「直接可比」,才有辦法請 Claude 逐項估算專案效益:約 20 個手選專案,每個都被估成毫秒數,加總後成為衝刺的目標。結果第 3 天就達成了 13 個目標中的 12 個。
省下的是真人的時間p75 從 3.1 秒降到 0.55 秒,看起來只差約 2.5 秒,但團隊估計整體每天省下數萬個使用者小時的等待。速度改善對每一個人、每一次使用都有效,累積起來非常可觀。
AI 做事、人把關,可以大規模又安全三千多項改動、零客戶事故、零回滾。文章把成果歸功於這套流程:人批准每一項改動,Claude 監看每一次上線。這說明「讓 AI 大量動手」不必然等於「失控」。

⚙️ 它是怎麼運作的

1
開頻道、下常設指令衝刺前先建一個 Slack 頻道,用一段固定指令交代 Claude 的職責:監看每次上線有沒有效能退步、檢查現有量測準不準且夠不夠完整、維護儀表板、主動處理低垂果實不費力就能摘到的成果,意指最容易、最划算先改的問題、提出效能專案、與人類隊友溝通。指令最後誠實寫著:終極目標是盡量自主,但今天還做不到。
▼
2
讓 AI 讀真實用量,選出最重要的旅程Claude 透過 Datadog(一套監控服務)的 MCP 伺服器讓 AI 能連上外部工具與資料的標準化接口,像一個通用插座 分析使用資料,選出影響最大的四條旅程,涵蓋 95% 的使用者活動。
▼
3
補埋點,做出可以比較的基準線每個量測都從使用者動作開始、到畫面渲染完成才結束,並把用戶端與伺服器端的耗時拆開。這些數字就是基準線改動之前先量好的數字,之後拿它當比較的起跑線,13 個數字才能拿來互相比較。
▼
4
把每個專案估成毫秒,加總成目標約 20 個手選專案,每個對準一條旅程;Claude 估算每個專案能省幾毫秒,團隊加總這些估計,訂出衝刺要達成的目標。
▼
5
Claude 動手,人批准Claude 找出拖慢的地方、自己建立基準測試來驗證、送出改進;團隊負責設定目標、做取捨,並批准每一項改動。
▼
6
上線後持續監看Claude 監看每一次部署,看有沒有效能退步。結果:第 3 天就達成 13 項目標中的 12 項;衝刺期間合併三千多項改動,零客戶事故、零回滾。
憑感覺優化 vs. 文章中的量測驅動優化
面向憑感覺優化量測驅動(Anthropic 的做法)
起點聽到「好慢」就猜哪裡慢先讓 AI 分析用量資料,選出佔 95% 活動的四條旅程
目標「盡量快一點」13 個量測各有目標,由專案的毫秒估算加總而來
判斷進度靠體感看 p75 前後對比,例如 3.1 秒到 0.55 秒
上線之後上線就不管了Claude 監看每一次部署有沒有退步
人的角色親手改每一行設定目標、做取捨、批准每一項改動

🔍 程式碼漫遊(點有 ● 的行看白話講解)

這是本課下載專案 guard.py 的核心,把文章「先量測、再比較、再把關」的精神縮成幾行。sample_ms 與 percentile 定義在 measure.py,等一下實作時會看到。

●samples = sample_ms(fn, runs=30)
💬 同一件事量 30 次。單次計時會被雜訊干擾,要看一整批的分布,而不是碰運氣的一個數字。
●p75 = percentile(samples, 75)
💬 取 p75,和文章用同一把尺,之後才能說「快了多少」。
●base = json.loads(BASELINE.read_text(encoding='utf-8'))['p75_ms']
💬 讀出之前存下的基準線(起跑線)。沒有它就無從判斷是進步還是退步。
●ratio = p75 / base
💬 現在是基準的幾倍?小於 1 表示更快,大於 1 表示更慢。
●if ratio > LIMIT:
💬 LIMIT 是容忍值(本課設 1.5)。量測本來就會抖動,設太緊會天天誤報,設太鬆又抓不到真退步,這是一個取捨。
● print('退步!這次改動讓它變慢了,擋下。')
💬 給人看的警告訊息。
● return 1
💬 回傳 1 當作失敗結束碼(程式結束時回報給系統的數字,0 代表成功、其他代表失敗)。自動化流程看到 1 就會擋下這次上線。
●return 0
💬 沒有退步就回傳 0,放行。

🛠️ 動手做:動手做:自己蓋一個「量測、基準線、退步守門」迷你工具

這是一個真實小專案:下載(或複製)檔案,照步驟在你電腦上跑起來。

📄 measure.py ⬇ 下載
import time


def sample_ms(fn, runs=30):
    # 先暖機一次:第一次執行常有載入與快取的雜訊,會污染基準線
    fn()
    out = []
    for _ in range(runs):
        t0 = time.perf_counter()
        fn()
        out.append((time.perf_counter() - t0) * 1000)
    return out


def percentile(samples, p):
    # 由快排到慢再取位置;p75 的意思是 4 次裡有 3 次不會比它慢
    s = sorted(samples)
    k = round(p / 100 * (len(s) - 1))
    return s[k]


def report(name, samples):
    avg = sum(samples) / len(samples)
    p50 = percentile(samples, 50)
    p75 = percentile(samples, 75)
    p95 = percentile(samples, 95)
    print(f'{name}:平均 {avg:.2f} ms|p50 {p50:.2f}|p75 {p75:.2f}|p95 {p95:.2f}')
📄 demo.py ⬇ 下載
import random

from measure import report, sample_ms

random.seed(7)  # 固定亂數種子:每次跑的資料一樣,優化前後才比得公平
ORDERS = [{'id': i, 'customer': random.randrange(2000)} for i in range(20000)]
WANTED = list(range(0, 2000, 20))  # 要查的 100 位客戶


def slow():
    # 每位客戶都把 2 萬筆訂單從頭掃一遍:工作量 = 客戶數 x 訂單數
    return {c: [o for o in ORDERS if o['customer'] == c] for c in WANTED}


def fast():
    # 只掃一次訂單、建好索引(字典),之後每位客戶直接查表
    index = {}
    for o in ORDERS:
        index.setdefault(o['customer'], []).append(o)
    return {c: index.get(c, []) for c in WANTED}


if __name__ == '__main__':
    # 優化前後結果必須一致,否則「更快」沒有意義
    assert slow() == fast()
    report('優化前', sample_ms(slow, runs=15))
    report('優化後', sample_ms(fast, runs=15))
📄 guard.py ⬇ 下載
import json
import sys
from pathlib import Path

import demo
from measure import percentile, sample_ms

BASELINE = Path('baseline.json')
# 小函式的量測本來就會上下抖動;設太緊會天天誤報,設太鬆又抓不到真退步
LIMIT = 1.5


def main(mode, simulate_regression):
    # 用 slow 模擬「有人把程式改壞了」,親眼看守門員擋下它
    fn = demo.slow if simulate_regression else demo.fast
    samples = sample_ms(fn, runs=30)
    p75 = percentile(samples, 75)
    if mode == 'save':
        BASELINE.write_text(json.dumps({'p75_ms': p75}), encoding='utf-8')
        print(f'已存下基準線:p75 = {p75:.2f} ms')
        return 0
    if not BASELINE.exists():
        print('找不到 baseline.json,請先執行:python guard.py save')
        return 2
    base = json.loads(BASELINE.read_text(encoding='utf-8'))['p75_ms']
    ratio = p75 / base
    print(f'基準 {base:.2f} ms → 現在 {p75:.2f} ms({ratio:.2f} 倍)')
    if ratio > LIMIT:
        print('退步!這次改動讓它變慢了,擋下。')
        return 1
    print('通過:沒有退步。')
    return 0


if __name__ == '__main__':
    mode = sys.argv[1] if len(sys.argv) > 1 else 'check'
    sys.exit(main(mode, 'slow' in sys.argv))
  1. 打開 PowerShell,輸入:mkdir perf-lab ; cd perf-lab,建立並進入練習資料夾。
  2. 把上面三個檔案(measure.py、demo.py、guard.py)用記事本或 VS Code 存進 perf-lab 資料夾,存檔編碼選 UTF-8。
  3. 輸入:chcp 65001,讓中文輸出不亂碼;再輸入:python --version,確認有 Python 3(如果沒有 python 指令,後面所有 python 都改成 py -3)。
  4. 第一步先「量」:輸入 python demo.py。你會看到優化前後各自的平均、p50、p75、p95。記下 p75,並比較平均與 p95,感受為什麼只看單一數字不夠。
  5. 存下基準線:輸入 python guard.py save,資料夾會多出 baseline.json。
  6. 模擬一次正常上線:輸入 python guard.py check。應該顯示「通過」,倍數接近 1。
  7. 模擬有人把程式改壞:輸入 python guard.py check slow。應該顯示「退步」,倍數是幾十倍;再輸入 echo $LASTEXITCODE,會看到結束碼 1。
  8. 挑戰:把 demo.py 的 WANTED 改成 range(0, 2000, 5),看看快慢兩版的差距如何隨工作量變化;再把 guard.py 的 LIMIT 改成 1.02,連跑幾次 python guard.py check,觀察「誤報」(其實沒變慢卻被判退步)是怎麼出現的。

🧠 工程思維透鏡(資深工程師看到的是什麼)

🔭 為什麼團隊要花力氣把 13 個量測做成「起點終點一致、前後端分開」,而不是直接動手改程式?
權衡在於:埋點要花時間,而且量測本身不會讓網站變快。但如果量測口徑不一致(一個從點擊算起、一個從網路回應算起),改善就無法比較,也看不出該優化前端還是後端。統一的尺一旦建好,Claude 才能把約 20 個專案都估成毫秒、互相排序,並在第 3 天就達成 13 個目標中的 12 個。前期的量測投資,換來的是後期的速度與判斷力。
🔭 文章用 p75 報告成果,而不是平均值。資深工程師會怎麼看這個選擇?
這是本課的推論:平均值容易被少數極端慢的案例拉偏,也會掩蓋大多數人的實際體驗;p75 的意思是「四個人裡有三個人等待時間不超過它」,既能代表多數人,又不被極端值主導。取捨是 p75 看不到最慢的那一小群人,那要看 p95 之類的更高百分位。所以本課的練習同時印出 p50、p75、p95,提醒你一個數字永遠只是一個切面。
🔭 既然 Claude 能自己改、自己監看,為什麼人還要「批准每一項改動」?
三千多項改動零事故是整個流程的成果,批准是其中的安全閥。取捨(例如願意犧牲多少功能換多少速度)屬於目標與價值判斷,文章明說由人負責設定目標與取捨。代價是人變成吞吐量的瓶頸,批准的速度會限制改動的數量。常設指令也誠實寫下「今天還不能完全自主」,一般的設計思路是先讓人留在迴圈裡,隨著信任累積再逐步放手。
🔭 這套做法能直接搬到我自己的小專案嗎?
文中使用的是內部研究模型(能力約相當於 Opus 5.5)與 Claude Tag 測試版,不是每個團隊都有的資源;但流程骨架,包含常設指令、可比的基準線、毫秒級估算、人批准、上線監看,並不依賴特定模型。本課的下載專案就是它的最小版本:量測、基準線、守門。另外要記得,這是 Anthropic 自己發表的成果,數字沒有獨立第三方驗證,閱讀時保留一點審慎是好習慣。

📝 隨堂考(點選答案,立即回饋)

Q1. 根據文章,衝刺一開始團隊最先做的事是什麼?
✅ 文章的核心是「能量測,才能變快」。團隊先讓 Claude 透過 Datadog 分析用量、選出四條旅程,再補埋點做出 13 個可比較的量測,之後才進入改進。
Q2. 「p75 = 0.55 秒」是什麼意思?
✅ p75 是把所有人的等待時間由短排到長,取第 75% 位置的數字。它不是平均,也不保證所有人都在這個時間內。
Q3. 文章中 claude.ai 新載入頁面到「可以打字」,p75 從 3.1 秒降到 0.55 秒,約快了幾倍?
✅ 3.1 ÷ 0.55 約等於 5.6。文章說的「約 3 倍」是整體核心體驗的概述,各條旅程的改善幅度不同,例如新開 Claude Code 工作階段 0.8 秒到 0.3 秒,約 2.7 倍。
Q4. 在這場衝刺中,人類的角色是什麼?
✅ 文章明說團隊負責設定目標、做取捨、批准每一項改動,Claude 負責找瓶頸、建基準測試、送出改進與監看上線;常設指令也承認今天還不能完全自主。
Q5. 本課的 guard.py 為什麼把容忍值 LIMIT 設成 1.5,而不是 1.0?
✅ 每次量測都會有雜訊,LIMIT 設成 1.0 等於「慢一點點就擋」,會天天誤報。1.5 能濾掉抖動,而真正的退步(例如換成 slow 版本)會差幾十倍,仍然一眼可辨。這是誤報與漏抓之間的取捨。

🃏 翻牌記憶卡(先想答案,再點開對答)

這篇文章的核心一句話是什麼?點我翻面
Once Claude can measure something, it can make it faster:能被量測,AI 就能把它變快,所以先建立量測,再談優化。
p75 是什麼?點我翻面
把所有人的等待時間由短排到長,第 75% 位置的數字;四個人裡有三個人等待時間不超過它。文章用它來報告 3.1 秒到 0.55 秒這類成果。
13 個量測要「直接可比」,需要哪三個條件?點我翻面
① 從使用者動作開始 ② 到結果渲染完成才結束 ③ 把用戶端與伺服器端的耗時分開。
Claude 在 Slack 頻道裡的常設職責有哪些?點我翻面
監看上線是否效能退步、檢查量測準不準且夠不夠完整、維護儀表板、主動處理低垂果實、提出效能專案、與人類隊友溝通。
人類負責什麼?這場衝刺的成績如何?點我翻面
人負責設定目標、做取捨、批准每一項改動;成績是三千多項改動、零客戶事故、零回滾,第 3 天達成 13 個目標中的 12 個。
guard.py 的三個動作點我翻面
存下基準線、量現在的 p75、比值超過 LIMIT 就回傳結束碼 1 擋下上線。

✅ 離開前自測(全勾=這課真的學會了)

0%