大模型看不懂字,只认数字
很多人第一次接触AI模型时都会有一个疑问:为什么我发过去的句子,模型好像能“读懂”,但背后其实它根本看不到文字本身?答案在于神经网络的工作方式。模型内部处理的是数值表示,而不是原始文本。所以在任何理解发生之前,文字必须先被转换成数字。
![]()
这个转换过程就是分词(Tokenization)。它发生在所有处理步骤之前,是整个流程的第一道关卡。没有这一步,后面的Transformer结构再强也拿不到可以计算的数据。
一个token可以小到标点,大到整词
分词器会把一段文字拆成若干片段,每个片段就是一个token。它可能是一个完整的单词,也可能是单词的一部分,甚至是一个标点符号、一个空格加一个词,或者在某些情况下是单个字节。
比如“I love kittens”这句话,可能被拆成三个token:“I”、“ love”、“ kittens”。注意第二个和第三个token前面都带着空格,这说明分词器把空格也纳入了片段边界。
每个token随后会被映射到一个整数编号,也就是token ID。上面三个token对应的ID可能是40、821、5632。这些数字本身没有语义,它们只是查表的钥匙。
同一个词,不同模型给的编号不一样
这里有一个容易被忽略的细节:token ID并不是全球统一的。不同模型可以使用不同的分词器,因此同一段文字在不同模型里生成的token ID可能完全不同。
比如输入“hi”,一个模型可能给它分配ID 12,另一个模型可能分配ID 25。这并不影响各自模型内部的运算,但意味着你不能把一个模型的token ID直接搬到另一个模型里用。
分词器在训练阶段会构建自己的词表(vocabulary),词表本质上就是token和ID之间的映射集合。后续所有文本切分都依据这张表来进行。
为什么不用单个字符当token?
理论上,每个字符都有对应的Unicode码点,直接按字符切分似乎最简单。但这样做有几个明显的问题。
- Unicode包含的字符数量非常庞大,按字符建词表会让词表规模变得很大。
- 如果只保留一部分常见字符,遇到词表外的字符就会出现未登录词(OOV)问题。
- 字符级别的表示会让序列长度大幅增加,相比子词表示,同样的句子会变成更长的token序列。
为了解决这些问题,研究者开发了多种分词算法,包括字节对编码(BPE)、字节级BPE(BBPE)和Wordpiece。这些算法的共同目标是在词表大小和序列长度之间找到平衡。
从文字到向量的完整链路
整个流程可以概括为一条清晰的链路:原始文本先进入分词器,被切成token列表;每个token再被映射成token ID;接着用token ID去查找对应的嵌入向量;最后这些向量被送入Transformer进行后续计算。
以“I love kitten”为例,分词器输出[“I”, “ love”, “ kitten”],对应ID为[40, 821, 5632],然后每个ID被替换成一个向量,三个向量组成输入序列进入模型。
这条链路里,分词器决定了模型能看到什么样的“文字碎片”,也直接影响后续所有计算的质量。
token数量为什么值得关注?
如果你用过Copilot这类工具,可能会注意到界面上会显示已经使用了多少token。这个数字不是随便展示的,它直接关系到计算成本和上下文长度。
token数量同时覆盖用户输入和模型输出两部分。输入越长,token越多;模型生成的内容越长,token也越多。理解这一点,有助于你判断一次交互实际消耗了多少资源。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.