一 主要区别
-
token 是使用分词器拆分后的最小单位,不同的分词方式会导致同样的字符具有不同的token数量。如你好,可以拆分为【你、好】两个token, 【你好】一个token。
-
同一个文本的 Token 数量可能远少于字符数(英文)或 接近字符数(中文)。
在自然语言处理中,token 是文本处理的基本单元,而字符是书写系统的最小单位。二者的关系取决于具体的分词方法:
-
字符级分词
每个字符直接作为 token。对于中文“你好”(2个字符),会被分为 2个token(“你”和“好”)。 -
子词分词(如BPE、WordPiece)
-
如果“你好”在训练数据中频繁出现,可能合并为 1个token。
-
否则会被拆分为 2个token(常见于多语言模型,如GPT系列)。
-
-
实际验证(以OpenAI为例)
使用GPT-3/GPT-4的tiktoken
分词器测试,“你好”通常被分为 2个token,因为中文字符常被单独编码。
总结:
-
在大多数情况下(尤其是多语言模型),“你好”对应 2个token。
-
特定中文优化模型可能合并为1个token,需具体测试分词器。
二 字符(Character)
定义
-
字符是书写系统中的最小单位,代表一个可见的符号或控制符号。
-
例如:
-
英文:
a
,B
,?
,空格
等。 -
中文:
你
,好
,,
(逗号)等。 -
数字或符号:
1
,$
,%
等。
-
-
每个字符在计算机中通常对应一个编码(如 Unicode)。
特点
-
原子性:字符不可再拆分。
-
直观性:直接对应文本的视觉形态。
-
长度固定:例如,“你好”包含 2 个字符。
例子
-
句子
Hello, 世界!
的字符分解:H, e, l, l, o, ,, , 世, 界, !
共 10 个字符(包括空格和标点)
三 Token(词元)
定义
-
Token 是自然语言处理(NLP)中文本处理的基本单元,是模型输入的最小单位。
-
如何生成 Token? 取决于分词方法(Tokenization):
-
词级别分词(Word-based)
将文本按词语分割。例如:“我爱编程”
→["我", "爱", "编程"]
(3 tokens)。 -
子词分词(Subword-based)
将复杂词拆分为常见子词。例如:“unhappy”
→["un", "happy"]
(2 tokens)。 -
字符级别分词(Character-based)
每个字符直接作为 Token。例如:“你好”
→["你", "好"]
(2 tokens)。
-
特点
-
灵活性:Token 的粒度可粗(词)可细(字符)。
-
模型依赖性:不同模型使用不同的分词规则(如 GPT 用 BPE,BERT 用 WordPiece)。
-
功能导向:Token 的目的是让模型高效学习和处理文本。
例子
-
英文:
"ChatGPT is powerful!"
使用子词分词(BPE)可能分解为:
["Chat", "G", "PT", " is", " powerful", "!"] → 6 tokens
中文:“自然语言处理”
使用子词分词可能分解为:
["自然", "语言", "处理"] → 3 tokens
或者字符分词:
["自", "然", "语", "言", "处", "理"] → 6 tokens
四 Token 和字符的关系
特征 | 字符(Character) | Token |
---|---|---|
定义 | 书写系统的最小单位 | NLP 处理的基本单元 |
拆分规则 | 固定(按 Unicode 编码) | 灵活(由分词算法决定) |
粒度 | 绝对最小(不可再分) | 可粗(词)可细(字符或子词) |
用途 | 文本存储、显示 | 模型训练、推理、文本分析 |
例子 | “A” , “你” , “1” , “!” | “Chat” , “##GP” , “你好” |
五 如何计算 Token 数量?
-
英文:通常 1 个单词 ≈ 1-2 个 Token。
-
中文:通常 1 个汉字 ≈ 1-2 个 Token(取决于是否被合并为子词)。
-
实际工具:
使用模型对应的分词器直接测试。例如:-
OpenAI 的
tiktoken
库:
-
import tiktoken
enc = tiktoken.get_encoding("cl100k_base") # GPT-4 的分词器
text = "你好"
print(len(enc.encode(text))) # 输出 2(2个Token)
六 总结
-
字符是固定的视觉单位,直接对应文本的书写形式。
-
Token 是灵活的逻辑单位,服务于模型的高效处理。
-
同一个文本的 Token 数量可能远少于字符数(英文)或 接近字符数(中文)。