發生了什麼?
當我們向大型語言模型傳送一條 Prompt 時,發生了什麼?
它是如何傳回結果的?
為什麼結果有時不一樣?
這裡要先認識兩個重要概念:Token(標記)和機率。
這一章先談 Token。
先來做一個補句實驗
現在,請大家先忘記其他東西,跟我一起看一句話:
如果你突然
我請大家把這句話補到 10 個字,你會怎麼寫?
可以先停一下,想一想。
假如張三和李四分別給出下面的答案:
張三:如果你突然打了個噴嚏
李四:如果你突然變成一隻貓
你會發現,兩個人都符合要求:把「如果你突然」補成一句 10 個字的話,但答案並不一樣。
為什麼?
因為一句話後面往往不只有一種合理的接法。我們已經看到的內容、掌握的詞語和當下的選擇,都會影響後面寫什麼。
先把一句話看成一塊一塊
我們平常說話或寫字時,往往不是一次把整句話想完,而是一邊往下說,一邊選擇接下來要寫什麼。
例如,同一句話可以有不同的停頓:
當、我在、寫、這段話、的、時候、我、也是、一個、字、一個字、地、思考
當、我、在寫、這段話、的、時候、我也是、一個字、一個字、地思考
我沒有刻意控制停頓,只是在自己覺得需要停一下的地方打上頓號。兩次停頓的位置並不完全一樣。
我們暫時可以把頓號之間的內容,看成一塊一塊的「標記」。前面已經寫了什麼,會影響下一塊可能是什麼。
再請張三寫一次
如果再請張三寫一次,他可能會寫:
如果你突然出現在這裡
當然,他也可能仍然給出上一次的答案。
我們不是張三,並不知道他會怎麼選。可以肯定的是,他只能使用自己知道的字、詞和表達;如果不知道,也可能寫錯或「瞎編」。
那我們是否可以先把這個過程看成三個步驟?
- 先擁有一定的詞彙和句子;
- 根據已經出現的內容,判斷後面可以接什麼;
- 如果有很多種接法,再從中選擇一種。
此時大家可以停下來想一想:平常說話和寫字時,是不是也有過類似的感覺?
三個小練習
先不要往下看答案。把下面三道題寫在紙上,或直接打在螢幕上,留意自己是怎樣一點一點把句子接下去的。
將這句話寫到 20 個字,標點符號也算一個字:
我的老家,就
把下面的句子補充完整:
我今天在 gptpmt ……
用下面的句式造一個句子:
因為……所以……
寫完了嗎?
這個補句實驗可以幫助我們建立一個直覺:生成文字時,前面的內容會影響後面可能出現的內容。
但要注意,這只是一種類比。大型語言模型處理 Token 的方式,不等於人類大腦真正思考和說話的機制。
Token 是什麼?
模型不會直接按照我們理解的「字數」或「單字數」處理整段文字。
文字進入模型前,會先經過與模型對應的 Tokenizer(分詞器),轉換成一串 Token。模型處理這些 Token,再逐步生成新的 Token,最後轉換成我們看到的文字。
一個 Token 可能是:
- 一個完整單字;
- 一個單字的一部分;
- 一個漢字或字元的一部分;
- 空格和文字的組合;
- 標點符號或其他位元組序列。
所以,Token 數量不等於字元數,也不等於單字數。
例如:
I love prompt engineering.
我喜歡提示工程。
這兩句話會被切成多少 Token,不能只看字數。即使文字完全相同,換一個模型或編碼,切分方式和 Token 數量也可能改變。
有些模型的 Tokenizer 會使用 BPE(Byte Pair Encoding,位元組對編碼)或其變體,也有模型採用其他方法。不同模型可能使用不同的詞彙表和編碼方式,因此不能把某一個工具、某一張截圖或某一次測試結果,當成所有模型的固定規則。
「水土不服」的 Tokenizer
先來看一句英文:
I love GPT pmt.
這裡有字母、空格、單字和標點。Tokenizer 不一定按照完整單字切分:I 可能單獨成為一個 Token,前導空格可能和後面的字母組合在一起,GPT 也可能被拆成更小的部分。
為什麼會這樣?
因為 Tokenizer 是按照自己的詞彙表和編碼規則切分文字,不是按照我們在國文課裡認識的「字」和「詞」來切。
那中文呢?
大家可能會先猜:中文是不是一個漢字就對應一個 Token?
真的是這樣嗎?
前面的 GPT 都可能被「劈開」,那漢字能不能被「劈開」?例如這個「愛」字:
我愛 GPT pmt。
漢字當然不會真的從中間切成兩半。不過,電腦儲存文字時會先把字元表示成編碼;某些以位元組處理文字的 Tokenizer,可能把一個漢字對應的位元組序列分到不只一個 Token 裡。舊工具如果逐一顯示這些片段,有時還會出現看不懂的替代符號。
先看一個可以重現的實際結果。截至 2026-08-31,OpenAI 官方 tiktoken 測試中,cl100k_base 對 hello world 的編碼結果是 [15339, 1917],一共 2 個 Token;再解碼可以還原成原文。可以在官方測試檔案中看到這個測試。
這個結果只屬於指定編碼和指定文字,不代表其他模型或編碼也會得到相同結果。
現在不要只看說明,我們可以自己做一次真實切分實驗:
- 開啟目前所用服務的官方 Tokenizer 或計數工具;
- 先記錄測試日期、服務和模型名稱,以及工具顯示的編碼名稱;
- 分別輸入
I love GPT pmt.和我愛 GPT pmt。; - 記錄工具實際顯示的切分、Token 數量,以及它提供的 Token ID;
- 如果工具允許切換模型或編碼,再換一個選項重複測試。
每次測試都把模型、編碼和日期一起記下來。以後結果變了,我們才能分清是文字變了,還是模型、詞彙表或工具更新了。
簡單來說,「把漢字劈開」可以幫助我們記住一種現象:在人眼中完整的一個漢字,不一定只對應一個 Token。
但這也不是所有模型的固定結論。換一個模型、詞彙表或編碼,同一個漢字可能只占一個 Token,也可能占多個;中文也不必然總比英文使用更多 Token。要知道準確數量,仍然要用目標模型對應的工具實際測試。
Token ID 是什麼?
Tokenizer 會把每個 Token 對應到詞彙表中的一個整數識別碼,這個數字就是 Token ID。
文字:你好
Token:[你][好]
Token ID:[範例 ID 1][範例 ID 2]
上面只用來說明概念,不代表任何真實模型的切分結果。
Token ID 有點像模型詞彙表裡的編號。換一個模型或編碼,同一段文字的 Token ID 可能完全不同。它也不代表詞語的重要程度、事實可信度或模型的信心。
為什麼要了解 Token?
首先,模型一次能處理的內容有容量限制。輸入、對話歷史、工具說明和輸出都會占用 Token。
其次,要求「寫 500 個漢字」和限制「最多生成多少 Token」不是同一件事。如果業務必須符合嚴格字數,模型生成後還要再次檢查。
最後,許多 API 會記錄輸入和輸出所使用的 Token。具體計量方式會隨服務和模型變化,要以實際介面文件和傳回的 usage 資料為準。
需要準確數量時,不要套用「一個漢字等於幾個 Token」的固定公式。先確認實際模型,再使用該服務對應的 Tokenizer 或計數介面。
OpenAI 使用者可以透過官方的 Tokenizer 觀察文字切分。其他服務應使用各自的官方工具和文件。
再回到開頭的問題
模型拿到一串 Token 之後,如何決定下一個 Token 是什麼?
為什麼同一句話,有時會接出不同結果?
這就要繼續了解機率和取樣。
上一章: 第一次對話
下一章: 機率、取樣與 Temperature