菜单

分词

相关源文件

本页面解释了 Llama 2 中的词元化过程,重点介绍文本如何转换为词元并由模型处理。词元化是一个关键的预处理步骤,它在自然语言文本和模型内部使用的数值表示之间架起了桥梁。

有关使用词元化输入进行文本生成的信息,请参见文本生成系统

1. 词元化概述

Llama 2 中的词元化将输入文本转换为模型可以处理的数值词元ID。该实现使用 SentencePiece,这是一种基于频率统计将文本分解为更小单元(词元)的子词词元化算法。

来源:llama/tokenizer.py14-69 llama/generation.py233-282

2. 词元分析器实现

Tokenizer 类负责使用 SentencePiece 模型对文本进行编码和解码。

词元分析器使用 SentencePiece 模型文件进行初始化,并提供文本编码和解码的方法。它还会跟踪特殊的词元ID,包括

  • 序列开始 (BOS) 词元
  • 序列结束 (EOS) 词元
  • 填充 (PAD) 词元

来源:llama/tokenizer.py14-37

2.1. 初始化

词元分析器通过 SentencePiece 模型文件的路径进行初始化

模型词汇表大小和特殊词元ID从加载的 SentencePiece 模型中检索。

来源:llama/tokenizer.py16-37

3. 词元化过程

3.1. 将文本编码为词元ID

encode 方法将字符串转换为词元ID列表

编码过程

  1. 接收输入字符串
  2. 使用 SentencePiece 将其转换为词元ID
  3. 可选地在前面添加序列开始 (BOS) 词元
  4. 可选地在末尾添加序列结束 (EOS) 词元

来源:llama/tokenizer.py38-56

3.2. 将词元ID解码为文本

decode 方法将词元ID列表转换回字符串

此方法直接使用 SentencePiece 模型的解码功能将词元ID转换回文本。

来源:llama/tokenizer.py58-68

4. 生成管线中的词元化

词元化在 Llama 2 的文本生成过程中起着至关重要的作用

4.1. 在文本补全中

text_completion 方法中,词元分析器对每个提示进行编码,添加 BOS 词元但不添加 EOS 词元

生成后,词元被解码回文本以作为最终输出

来源:llama/generation.py233-282

4.2. 在对话补全中

对于对话补全,词元化更为复杂,因为它需要处理带有特殊格式词元的结构化对话

  1. 特殊词元如 [INST][/INST]<<SYS>><</SYS>> 用于格式化对话
  2. 系统消息被添加到第一条用户消息之前
  3. 每个用户/助手消息对都使用相应的特殊词元进行编码
  4. 最终的用户消息使用特殊词元进行编码,但没有助手响应

生成的词元序列随后被传递给生成函数。

来源:llama/generation.py284-395

5. 与模型加载的集成

在模型初始化期间,词元分析器的词汇表大小被传递给模型

Llama.build 方法中的相关代码

这确保了模型的嵌入层和输出投影与词元分析器的词汇表大小相匹配。

来源:llama/generation.py52-123

6. 实践考虑

6.1. 特殊词元处理

特殊词元在 Llama 2 系统中扮演重要角色

标记类型ID 访问器目的
BOS (序列开始)tokenizer.bos_id标记序列的开始
EOS (序列结束)tokenizer.eos_id标记序列的结束并在生成过程中表示完成
PADtokenizer.pad_id用于将批次中的序列填充到相同长度

特殊格式词元也用于对话补全

  • [INST][/INST] 包装用户指令
  • <<SYS>><</SYS>> 包装系统消息

来源:llama/tokenizer.py28-35 llama/generation.py44-47 llama/generation.py318-361

6.2. 词元化安全性

对话补全方法包含清理检查,以防止通过特殊词元进行提示注入

如果用户输入中检测到特殊词元,系统将返回错误消息而不是生成响应

这可以防止通过精心制作的提示对模型进行潜在的操纵。

来源:llama/generation.py318-395