科普一下:大模型 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 則留言


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