什麼是 Token?
Token 是 OpenAI 模型處理文字的基本單位。視語言和上下文而定,Token 可以短至單一字元,也可以長至一個完整單字。空格、標點符號和不完整的單字都會計入 Token 數量。這就是 API 在產生回應前,於內部切分文字的方式。
估算英文 Token 數量的實用經驗法則:
1 個 Token ≈ 4 個字元
1 個 Token ≈ ¾ 個單字
100 個 Token ≈ 75 個單字
1–2 個句子 ≈ 30 個 Token
1 個段落 ≈ 100 個 Token
約 1,500 個單字 ≈ 2,048 個 Token
Token 化處理會因模型和編碼方式而異。請使用 Tokenizer 工具或 tiktoken.encoding_for_model(model),取得目標模型的確切 Token 數量。
範例
以下是一些實際文字範例及其約略 Token 數量:
Wayne Gretzky 的名言「你沒出手的球,百分之百不會進」= 11 個 Token
《OpenAI 憲章》= 476 個 Token
《美國獨立宣言》= 1,695 個 Token
Token 數量的計算方式
將文字傳送至 API 時:
文字會切分成 Token。
模型會處理這些 Token。
回應會以一連串 Token 的形式產生,再轉換回文字。
Token 用量分為以下幾類:
輸入 Token — 請求中的 Token。
輸出 Token — 回應中產生的 Token。
快取 Token — 對話記錄中重複使用的 Token(通常以較低費率計費)。
推理 Token — 部分進階模型在產生最終輸出前,會於內部加入額外的「思考步驟」。
這些數量會顯示在 API 回應的中繼資料中,用於計費和用量追蹤。
若要進一步探索 Token 化處理,可以使用互動式Tokenizer 工具,計算 Token 數量並查看文字如何切分成 Token。
或者,若想以程式設計方式將文字 Token 化,請使用 Tiktoken;這是專為 OpenAI 模型使用的快速 BPE Tokenizer。
Token 上限
每個模型都有輸入與輸出合計的 Token 數量上限。目前的高容量模型在上下文中最多支援數十萬個 Token,但實際上限可能因模型版本和用量層級而異。
如果超出上限,可以:
縮短或改寫提示詞。
將大量文字拆分成較小區塊。
傳送輸入內容前,先進行摘要或預先處理。
Token 計價
API 用量按 Token 計價,費率會因模型以及 Token 屬於輸入、輸出或快取而異。目前費率請參閱 OpenAI 的定價頁面。部分推理模型可能會在內部使用更多 Token,但也力求減少完成每項任務所需的 Token 數量,以提升效率。
探索 Token
API 會根據單字在語料庫資料中的上下文加以處理。模型會接收提示詞,將輸入轉換成 Token 清單並處理提示詞,再將預測的 Token 轉換回我們在回應中看到的文字。
在我們看來完全相同的兩個單字,可能會因其在文字中的結構不同而產生不同的 Token。請觀察 API 如何根據單字「red」在文字中的上下文產生 Token 值:
在上方第一個範例中,‘ red’ 的 Token「2266」包含一個後置空格(請注意,這些是僅供示範的 Token ID 範例)。
‘ Red’(前面有空格且首字母大寫)的 Token「2296」,不同於小寫 ‘ red’ 的 Token「2266」。
句首使用 ‘Red’ 時,產生的 Token 不含前置空格。Token「7738」與前兩個單字範例不同。
觀察結果:
Token 出現的機率/頻率越高,獲派的 Token 編號就越小:
三個句子中的句號都產生相同的 Token(「13」)。這是因為從上下文來看,句號在整個語料庫資料中的用法大致相同。
‘red’ 產生的 Token 會因其在句中的位置而異:
句中小寫:‘ red’ —(Token:「2266」)
句中大寫:‘ Red’ —(Token:「2297」)
句首大寫:‘Red’ —(Token:「7738」)
