你可能從沒注意到的速度瓶頸
每次你跟 ChatGPT 或 Claude 對話,螢幕上的文字是「一個一個流出來」的——你有沒有好奇過,為什麼不是一次全部顯示?
這不是 UI 設計的選擇,而是語言模型的本質限制。
現代 LLM 使用的是**自回歸(Autoregressive)**架構:每一個新 token(約 3/4 個中文字)的生成,都必須依賴前面所有已生成的 token。這意味著第 100 個字要等第 99 個字算完,第 99 個字要等第 98 個字——整個過程無法並行,只能一個接一個排隊。
對 GPU 這種最擅長「一次處理大量平行計算」的硬體而言,這是一種嚴重的浪費。大部分時間,GPU 的算力都在空等下一個輸入,這種現象叫做 memory-bound(記憶體瓶頸)——瓶頸不在 GPU 的算力本身,而在於把幾十 GB 的模型參數從記憶體搬進計算單元的速度。
這個瓶頸有沒有解法?投機解碼(Speculative Decoding)給出了一個既優雅又實際的答案。
快筆助理 + 總編審稿:一個直覺的比喻
讓我用一個比喻來說明核心思路。
假設你有一位頂尖總編輯(大模型),文字品質無懈可擊,但速度極慢——每寫一個字都要重新思考前後脈絡。
旁邊還有一個快筆助理(小模型),速度是總編的十倍,偶爾會犯些小錯或用詞不夠精準。
傳統做法:讓總編一個字一個字地親自撰寫,慢但品質完美。
投機解碼的做法:
- 先讓快筆助理快速草擬 4 個字
- 把這 4 個字草稿交給總編一次性審閱
- 總編審完說:「前 3 個字沒問題,第 4 個要改」
- 採用前 3 個字,從第 4 個位置由總編接手,生成正確 token
關鍵洞察在於:審閱遠比創作快。總編可以一次掃過 4 個草稿字並給出判斷,而這個時間幾乎跟他自己從零生成 1 個字一樣短。這樣一個回合就輸出了 3 個字,等效效率是原來的 3 倍。
技術細節:Draft and Verify 三步走
投機解碼在 2022–2023 年由 Google Brain 與 DeepMind 的研究團隊各自獨立提出,核心流程分三個步驟:
步驟一:Draft(草稿生成)
用一個小型語言模型(Draft Model,又稱 Speculator)快速生成 γ 個候選 token。γ 是超參數,典型值為 4–8。
例如 γ = 4 時,小模型看完「台灣的科技產業」後,快速輸出候選序列 [正, 在, 快, 速]。
步驟二:Verify(並行驗證)
把原始輸入序列加上這 4 個草稿 token,一次性送進大模型做一次前向傳播(forward pass)。大模型在這一次前向傳播中,同時計算出所有 4 個位置的預測機率分佈——這是真正的並行,而非序列。
步驟三:Accept or Reject(接受或截斷)
逐一比對大模型與小模型在各位置的預測:
- 若大模型對該 token 的接受機率高,則接受(Accept),繼續比對下一個
- 若差距超過閾值,則從此截斷(Reject),以大模型的預測替換,停止本輪
透過嚴格的接受-拒絕採樣(Acceptance-Rejection Sampling)機制,可以數學保證最終輸出的機率分佈與大模型獨自生成完全一致——沒有任何品質損失,只有速度提升。
為什麼多做一件事反而更快?
直覺上聽起來奇怪:我們多跑了一個小模型,應該更慢才對?
秘密在 GPU 的計算特性。
對大型語言模型而言,推理時的真實瓶頸是把模型參數從 HBM(高頻寬記憶體)搬入計算單元的速度,而非矩陣乘法本身。每生成一個 token,GPU 都要載入幾十 GB 的參數——不管你算 1 個 token 位置還是同時算 8 個,這個載入成本幾乎相同。
用數字感受一下:假設驗證 γ = 4 個草稿 token 的時間等於大模型自己生成 1 個 token 的時間,而平均接受率為 75%,那麼:
- 傳統方式:每輪輸出 1 個 token
- 投機解碼:每輪輸出 3 個 token(4 x 75%)
整體吞吐量提升約 3 倍,輸出品質完全不變。
BlockPilot:根據情境自動調整的下一代方案
傳統投機解碼使用固定的 γ,這在不同輸入情境下並非最優:
- 生成固定格式的 JSON 輸出時,小模型接受率可達 90%,γ 設 8 完全沒問題
- 回答開放式創意問題時,接受率跌到 40%,γ 設太大只會頻繁截斷,浪費計算
最近在 HuggingFace Papers 熱議的論文 BlockPilot 提出了逐樣本自適應策略學習(Instance-Adaptive Policy Learning):透過訓練一個輕量策略網路,讓系統根據每個輸入的特性,動態決定本輪的最優草稿數 γ。
此外,BlockPilot 結合了擴散式(Diffusion-based) token 生成,讓草稿階段不再是序列地一個個猜,而是並行猜測多個候選再選最匹配的——在高不確定情境下格外有效,整體推理效率進一步提升。
哪些場景最有感?
| 場景 | 接受率 | 加速效果 |
|---|---|---|
| 程式碼補全 | 85–95% | 極顯著(3x+) |
| RAG 複述檢索段落 | 80–90% | 顯著 |
| 長文生成(格式穩定) | 70–85% | 顯著(2–3x) |
| 問答與摘要 | 55–70% | 中等(1.5–2x) |
| 複雜數學推理 | 30–50% | 有限 |
程式碼補全是最受益的場景,這也是 GitHub Copilot 和各類 coding assistant 大量採用投機解碼的原因。
延伸思考
投機解碼揭示了一個更深刻的工程哲學:在計算密集的系統中,「提出假設再驗證」往往比「從零生成答案」更高效——前提是驗證比生成便宜。
這讓我想到心理學家 Kahneman 的「快思慢想」——System 1 快速直覺地給出猜測,System 2 慢速理性地驗證。投機解碼把這個人類認知模式直接搬進了 AI 推理架構:小模型是 System 1,大模型是 System 2。
未來,這個思路可能發展成多層嵌套的投機結構:不是兩層(草稿 + 驗證),而是三層或更多層——每一層既是下層的審閱者,也是上層的草稿員,讓整個推理流程在多個時間尺度上同時並行,把 GPU 算力壓榨到極致。
如果你在使用本地模型或部署推理服務,投機解碼搭配 vLLM、TensorRT-LLM 等框架已相當成熟,配置幾行參數就能啟用,是目前最高 CP 值的 LLM 加速方案之一。