深入理解大语言模型(5)-关于token
到目前为止对 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。