简单来说,Token(词元)是大语言模型(LLM)理解和处理文本的最基本单位。
你可以把它想象成模型“吃”文本时的“口粮”或者“积木块”。模型不能直接理解我们写的文字(比如“你好”或“Hello”),它需要先把文字切成一小块一小块的、它能认识的“token”,然后才能对这些 token 进行计算和处理。
为什么需要 Token?
计算机和模型本质上处理的是数字。为了让模型能“读懂”文本,我们必须把文本转换成数字序列。这个过程就是:
原始文本 -> 分词 (Tokenization) -> Token 序列 -> 转换为 ID (数字) -> 输入模型
Token 就是这个转换过程中的中间产物。
Token 到底是什么?它长什么样?
Token 不一定是我们日常理解的“单词”(Word)。它的具体形式取决于所使用的分词器(Tokenizer)。一个 token 可以是:
-
一个完整的单词 (Word):
- 例如:
"cat"、"running"、"unhappiness"可能各自就是一个 token(取决于词汇表)。
- 例如:
-
一个子词 (Subword):
- 这是最常见的情况,尤其是在使用 BPE、WordPiece、Unigram 等算法时。
- 一个长词或复杂词会被拆分成几个更小的、有意义的单元。
- 例子 (WordPiece):
"playing"->["play", "##ing"]"lowest"->["low", "##est"]"unhappiness"->["un", "##happi", "##ness"]
- 例子 (BPE):
"unhappiness"->["un", "happi", "ness"](没有##标记,但ness可能带</w>)
-
一个字符 (Character):
- 对于非常罕见的词或未登录词,模型可能会将其拆解到字符级别。
- 例如:一个生僻字
"龘"可能直接作为一个 token。
-
一个标点符号或空格:
","、"."、"!"、" "(空格) 通常都会被视为独立的 token。
-
一个符号或表情符号:
"😊"、"#"、"@"也都会被编码成 token。
-
一个字节 (Byte):
- 在字节级 BPE(如 GPT 系列)中,token 的基本单位是字节(0-255)。任何字符(包括中文、emoji)都会先被转换成 UTF-8 字节序列,然后这些字节或字节组合成为 token。这是处理多语言和罕见符号的终极手段。
举个具体的例子
假设我们有这样一句话:
"I love playing basketball!"
使用一个典型的 BPE 分词器(如 GPT 的),它可能会被分解成以下 token:
python
深色版本
["I", "Ġlove", "Ġplaying", "Ġbasketball", "!"]
"I":一个完整的单词。"Ġlove":Ġ(这里用Ġ代表一个特殊的空格符号,实际可能是▁或其他) 表示前面有一个空格,love是单词。"Ġlove"是一个整体 token。"Ġplaying":同理。"Ġbasketball":同理。"!":标点符号。
然后,分词器会查一个“词典”(词汇表),将每个 token 映射成一个唯一的数字 ID:
python
深色版本
[15496, 6375, 2600, 7877, 272] # 这些数字是示例,实际值由模型词汇表决定
这个数字序列 [15496, 6375, 2600, 7877, 272] 才是模型真正“吃”进去的东西。
Token 的重要性
- 模型输入的基础:模型的所有计算都基于 token 的 ID 序列。
- 影响上下文长度:模型有“上下文窗口”限制,比如 8K、32K、128K tokens。这指的是它能同时处理的 token 数量,而不是字符或单词数。一个复杂的词可能占多个 token,而一个空格也算一个 token。
- 影响成本:使用大模型 API(如调用 GPT-4)时,费用通常是按 输入 tokens 和 输出 tokens 的数量来计算的。文本越长、越复杂(被拆分成更多 token),成本越高。
- 影响性能:更高效、更合理的分词方式能让模型更好地理解语义。
如何查看文本被分成了哪些 tokens?
你可以使用 Hugging Face 的 transformers 库来轻松查看:
python
深色版本
from transformers import AutoTokenizer
# 加载一个分词器,例如 GPT-2 的
tokenizer = AutoTokenizer.from_pretrained("gpt2")
text = "I love playing basketball!"
# 将文本分词
tokens = tokenizer.tokenize(text)
print("Tokens:", tokens) # 输出: ['I', 'Ġlove', 'Ġplaying', 'Ġbasket', 'ball', '!']
# 将 tokens 转换为 IDs
ids = tokenizer.encode(text)
print("Token IDs:", ids) # 输出: [69, 1050, 2915, 5510, 366, 13]
# 将 IDs 解码回文本
decoded = tokenizer.decode(ids)
print("Decoded:", decoded) # 输出: "I love playing basketball!"
总结一下:
- Token 不是单词,它是模型处理文本的基本单元。
- 一个 token 可以是一个单词、一个子词、一个字符、一个标点,甚至是一个字节。
- 分词器(Tokenizer)负责将原始文本切分成 token 序列。
- token 的数量直接影响模型的上下文长度限制和使用成本。
- 理解 token 的概念,有助于你更好地理解大语言模型是如何“阅读”和“思考”的。

3352

被折叠的 条评论
为什么被折叠?



