返回章節列表
第1站 · 1.1
先懂單位
token 與上下文
token 是什麼?為什麼超出上限時先掉的是整則訊息
這一章在講什麼
模型讀的不是字,是切好的 token;上限以 token 計,超出時客戶端整則整則丟訊息,所以留下來的往往還空著一段用不到的餘裕。
你打給模型的每一個字,在進模型之前都會先被切成 token。token 不是字、也不是詞,而是模型的 tokenizer 依訓練時學到的 byte-pair encoding 把文字拆成的片段:常見的詞常常整個合成一個 token,罕見字則可能要花上好幾個。
這件事有兩個直接後果。第一,上限是以 token 計、不是字數——同一段中文換一個模型,token 數可能差一倍
(GPT-4o 世代的 o200k_base 對中日韓文字明顯比 cl100k_base 有效率)。第二,你付出的每一輪對話——system prompt、
歷史訊息、剛貼進來的工具輸出——都在消耗同一個預算。
可用 token = context window 上限 − system prompt − 歷史訊息
那「超出上限」時會發生什麼?直接呼叫 API 會直接失敗、回一個 context length 錯誤。框架與聊天客戶端則通常會先裁切—— 最常見的做法是從最舊的訊息開始、整則整則丟掉,直到剩下的塞得進上限為止。
因為丟棄的單位是「整則」,結果常常停在離上限還有一段距離的地方,而不是剛好貼齊:多丟掉的那一則可能有幾百個 token, 留下來的餘裕就這樣空著。這也是為什麼「昨天還能跑的請求今天回了 context length 錯誤」——多了一輪對話,整則就被推出去了。
Token 預算實驗室開新分頁使用完整版 ↗
把下面這段對話的上限調小,看哪一則先被丟掉、留下來的餘裕還剩多少;再切換編碼,看同一段文字的 token 數怎麼變。
一段 20 則的對話超出上限 300 個 token,最舊的一則有 800 個 token。裁切後,留下來的餘裕大約是多少?為什麼不是 0?