到目前為止對 LLM 的描述中,我們將其描述為一次預測一個單詞,但實際上還有一個更重要的技術細
節。即 LLM 實際上并不是重復預測下一個單詞,而是重復預測下一個 token 。對于一個句子,語言模型會
先使用分詞器將其拆分為一個個 token ,而不是原始的單詞。對于生僻詞,可能會拆分為多個 token 。
這樣可以大幅降低字典規模,提高模型訓練和推斷的效率。例如,對于 “Learning new things is fun!” 這
句話,每個單詞都被轉換為一個 token ,而對于較少使用的單詞,如 "Prompting as powerful
developer tool",單詞 “prompting” 會被拆分為三個 token,即"prom"、“pt"和"ing”。
# 為了更好展示效果,這里就沒有翻譯成中文的 Prompt
# 注意這里的字母翻轉出現了錯誤,吳恩達老師正是通過這個例子來解釋 token 的計算方式
response = get_completion("Take the letters in lollipop \
and reverse them")
print(response)
The reversed letters of “lollipop” are “pillipol”.
但是,“lollipop” 反過來應該是 “popillol”。
但 分詞方式也會對語言模型的理解能力產生影響 。當您要求 ChatGPT 顛倒 “lollipop” 的字母時,由于分詞器
(tokenizer) 將 “lollipop” 分解為三個 token,即 “l”、“oll”、“ipop”,因此 ChatGPT 難以正確輸出字
母的順序。這時可以通過在字母間添加分隔,讓每個字母成為一個token,以幫助模型準確理解詞中的字
母順序。
response = get_completion("""Take the letters in \
l-o-l-l-i-p-o-p and reverse them""")
print(response)
p-o-p-i-l-l-o-l
因此,語言模型以 token 而非原詞為單位進行建模,這一關鍵細節對分詞器的選擇及處理會產生重大影
響。開發者需要注意分詞方式對語言理解的影響,以發揮語言模型最大潛力。
??? 對于英文輸入,一個 token 一般對應 4 個字符或者四分之三個單詞;對于中文輸入,一個
token 一般對應一個或半個詞。不同模型有不同的 token 限制,需要注意的是,這里的 token 限制是輸
入的 Prompt 和輸出的 completion 的 token 數之和,因此輸入的 Prompt 越長,能輸出的
completion 的上限就越低。截至2023年,ChatGPT3.5-turbo 的 token 上限是 4096。