大型语言模型 (LLM) 中的 Tokenization 是将文本分解为更小的单元(称为 Token)的过程,模型可以理解和处理这些 Token。 Token 可以代表一个单词、单词的一部分、单个字符,甚至标点符号。例如,句子“ChatGPT is useful!” 可能会被拆分为 ["Chat", "G", "PT", " is", " useful", “!”] 这样的 Token。 这一步至关重要,因为 LLM 不直接解释原始文本,而是处理 Token 的数值表示。 Tokenization 桥接了人类可读的文本和模型用于计算的数值数据结构(如向量)。 将文本拆分为 Token 的确切规则取决于 Tokenization 算法和模型的训练数据。
大多数 LLM 使用诸如 Byte-Pair Encoding (BPE) 或 WordPiece 之类的子词 Tokenization 方法。 这些算法在将整个单词视为单个 Token 和将稀有或复杂的单词拆分为更小的部分之间取得平衡。 例如,BPE 首先将文本拆分为单个字符,然后迭代地合并最频繁的现有 Token 对。 这允许模型通过将未知单词分解为已知的子词单元来处理它们。 例如,单词“unhappy”可以拆分为 ["un", “happy”],其中两个子词可能已经存在于模型的词汇表中。 Tokenizer 词汇表的大小(通常从数万到超过 100,000 个 Token)是一个关键的设计选择。 较大的词汇表可以更有效地表示常用词,但可能难以处理稀有术语,而较小的词汇表会增加将单词拆分为子单元的可能性。
Tokenization 影响 LLM 处理特定任务和语言的方式。 例如,模型可能会将“don’t”拆分为 ["do", “n’t”],这保留了语法意义,但要求模型学习此类拆分之间的关系。 在多语言上下文中,Tokenization 变得更加复杂,因为脚本(如中文与拉丁文)和单词结构差异很大。 设计不佳的 Tokenizer 可能会导致效率低下,例如没有单词之间空格的语言(例如,日语)的 Token 计数过多。 开发人员还应该意识到,Token 限制(如 GPT-4 的 128k Token 上下文窗口)是基于 Token 而不是原始文本的,因此输入长度在很大程度上取决于 Tokenizer 的行为。 了解 Tokenization 有助于调试问题,例如处理非标准文本模式(如代码片段或非标准标点符号)时出现意外的模型输出或错误。