科普一下:大模型 Token 的收費邏輯!

大家好呀,我是**飛魚**

現在工作中經常需要呼叫大模型的 API。

不知道大家有沒有發現,你打開任何一家大模型 API 的定價頁(如下:GPT 和 Claude 的)。

同樣是 TOKEN,輸出比輸入貴 5 倍?快取命中的 TOKEN 又便宜 10 倍?

圖片圖片

今天就從原理層面,給大家科普解釋下這些問題。

具體來說,我們得進 GPU 裡看看模型推理時究竟發生了什麼?

首先當你向大模型發送一條訊息,它在後台其實經歷了兩個階段,預填充 Prefill 和 解碼 Decode。

❝

這兩個階段的分界點恰好是你輸入結束,然後模型開始吐字的那一瞬間。

Prefill 階段

❝

模型拿到你的 Prompt 後,會把你輸入的所有 TOKEN 一次性塞進 Transformer,然後算出每一個位置的隱藏狀態。

最後把最重要的產物 KV Cache 鍵值快取保存下來。

這一階段是高度並行的。

假設你輸入了 1000 個 TOKEN,GPU 可以把這 1000 個 TOKEN 同時放進矩陣運算裡,一次前向傳播全部處理完。

GPU 最擅長的就是這種大矩陣並行計算,這個階段的瓶頸是算力,GPU 的計算單元幾乎被榨乾。

每個 TOKEN 分攤下來的成本其實很低。

Decode 階段

❝

Prefill 結束後,模型開始生成輸出。

但模型必須一個一個 TOKEN 地往外吐。

因為每生成一個新 TOKEN 都要把它拼回已有序列裡才能算下一個。

比如:第 N+1 個 TOKEN 依賴第 N 個 TOKEN 的結果,這是 自迴歸(Auto Regressive) 的本質,沒辦法提前並行。

於是每生成一個輸出 TOKEN,GPU 都要把整個模型的參數從顯存搬到計算單元,然後把不斷變長的 KV Cache 也搬過來,算出下一個 TOKEN。

重複以上步驟,這個階段的瓶頸變成了顯存頻寬。

這時候 GPU 的算力大部分時間在空轉,等著資料從顯存慢悠悠傳過來。

所以輸入走 Prefill 路徑:

❝

並行處理,算力拉滿,吞吐量高,一張 GPU 一秒可能處理 10 萬個輸入 TOKEN,分攤到單個 TOKEN 的成本自然低。

輸出走 Decode 路徑:

❝

串行生成帶寬瓶頸,GPU 空轉嚴重。

同樣一張 GPU 一秒可能只能生成幾百個輸出 TOKEN,吞吐量差了兩三個數量級,自然要貴 3 ~ 5 倍。

順帶也解釋了為什麼串流回應看起來是一個字一個字蹦出來,因為它就只能這樣。

最後快取命中的 TOKEN 為什麼能更便宜?

其實是有一個 Prompt Caching 的設計:

❝

思路就是把前綴 KV Cache 存在高速快取裡。

下次請求如果前綴一樣,直接把現成的 KV Cache 載入進來,跳過 Prefill 的計算環節。

此時付出的成本只有儲存這份 KV Cache 的開銷,把它載入進計算顯存的頻寬開銷,算力幾乎不花。

但快取是前綴匹配的,你的 Prompt 必須和之前某次請求的開頭完全一致,哪怕改一個字,後面的部分就全得重算。

而且快取有有效期,一般幾分鐘到幾小時,過期就失效。

所以建議把固定不變的內容 System Prompt 長文件放在最前面,把變化的部分使用者問題放到最後,能最大化快取命中率。

最後有幾個實用的優化方向

❝

能用快取就用快取,把穩定的長前綴放在 Prompt 開頭。

控制輸出長度,讓模型少囉唆,不只是節省閱讀時間,而是實打實省錢。

真的不用害怕長輸入,很多業務場景下塞進幾千 TOKEN 的上下文,只要能換來一個精準的短輸出,總價反而更便宜。

慎用讓模型先推理再回答的模式,思考推理模型產生的思考過程往往會被算進輸出 TOKEN。

❝

最後想看技術文章的,可以去我的個人網站:hardyfish.top/


原文出處:https://juejin.cn/post/7638267536362930211


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
boluoji
📝14   💬3   ❤️6
295
🥈
站長阿川
📝5   💬2   ❤️1
210
🥉
mike
1
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
📢 贊助商廣告 · 我要刊登