本页面解释了 Llama 2 中的词元化过程,重点介绍文本如何转换为词元并由模型处理。词元化是一个关键的预处理步骤,它在自然语言文本和模型内部使用的数值表示之间架起了桥梁。
有关使用词元化输入进行文本生成的信息,请参见文本生成系统。
Llama 2 中的词元化将输入文本转换为模型可以处理的数值词元ID。该实现使用 SentencePiece,这是一种基于频率统计将文本分解为更小单元(词元)的子词词元化算法。
来源:llama/tokenizer.py14-69 llama/generation.py233-282
Tokenizer 类负责使用 SentencePiece 模型对文本进行编码和解码。
词元分析器使用 SentencePiece 模型文件进行初始化,并提供文本编码和解码的方法。它还会跟踪特殊的词元ID,包括
词元分析器通过 SentencePiece 模型文件的路径进行初始化
模型词汇表大小和特殊词元ID从加载的 SentencePiece 模型中检索。
encode 方法将字符串转换为词元ID列表
编码过程
decode 方法将词元ID列表转换回字符串
此方法直接使用 SentencePiece 模型的解码功能将词元ID转换回文本。
词元化在 Llama 2 的文本生成过程中起着至关重要的作用
在 text_completion 方法中,词元分析器对每个提示进行编码,添加 BOS 词元但不添加 EOS 词元
生成后,词元被解码回文本以作为最终输出
对于对话补全,词元化更为复杂,因为它需要处理带有特殊格式词元的结构化对话
[INST]、[/INST]、<<SYS>> 和 <</SYS>> 用于格式化对话生成的词元序列随后被传递给生成函数。
在模型初始化期间,词元分析器的词汇表大小被传递给模型
Llama.build 方法中的相关代码
这确保了模型的嵌入层和输出投影与词元分析器的词汇表大小相匹配。
特殊词元在 Llama 2 系统中扮演重要角色
| 标记类型 | ID 访问器 | 目的 |
|---|---|---|
| BOS (序列开始) | tokenizer.bos_id | 标记序列的开始 |
| EOS (序列结束) | tokenizer.eos_id | 标记序列的结束并在生成过程中表示完成 |
| PAD | tokenizer.pad_id | 用于将批次中的序列填充到相同长度 |
特殊格式词元也用于对话补全
[INST] 和 [/INST] 包装用户指令<<SYS>> 和 <</SYS>> 包装系统消息来源:llama/tokenizer.py28-35 llama/generation.py44-47 llama/generation.py318-361
对话补全方法包含清理检查,以防止通过特殊词元进行提示注入
如果用户输入中检测到特殊词元,系统将返回错误消息而不是生成响应
这可以防止通过精心制作的提示对模型进行潜在的操纵。