BPE和tiktoken都是什么?
知识串联:BPE 是方法,tiktoken 是工具
| 名称 | 类型 | 核心作用 | 所属领域 | 关系 | 
|---|---|---|---|---|
| BPE | 分词算法 | 字节对编码(Byte Pair Encoding),一种将文本拆分成**子词(subword)**的方法。 | 文本预处理、大语言模型 | tiktoken 实现了 BPE 及其变体,是使用这种方法的具体工具。 | 
| tiktoken | 分词工具库 | OpenAI 开发的高效分词库,用于将文本转换为其模型(如 GPT-3/4)使用的 Token 序列。 | OpenAI 模型、分词计数 | tiktoken 是 OpenAI 模型分词的官方标准,其核心算法是 BPE 的优化版本。 | 
BPE(Byte Pair Encoding,字节对编码)
BPE 是一种数据压缩技术,但它被引入 NLP 领域并成为目前大语言模型(如 Transformer 架构)中最常用的分词算法之一。
BPE 的核心思想
BPE 的目标是解决传统分词方法(如按词分词或按字符分词)的痛点,实现词汇表大小和表示能力的平衡:
- 初始化: 将文本中的每个字符视作一个初始的“Token”。
 - 合并: 迭代地寻找语料库中最常出现的相邻字节对(或字符对)。
 - 创建新 Token: 将这个最常出现的字节对合并成一个新的、单一的 Token。
 - 重复: 重复步骤 2 和 3,直到达到预设的词汇表大小或不再有符合条件的合并。
 
BPE 的优势
- 处理未知词(OOV): 即使遇到训练语料中从未见过的词,BPE 也可以将其拆分成已知的子词甚至单个字符,从而避免完全无法表示。
 - 平衡: 既保留了常见词的完整语义(将它们合并成一个 Token),又避免了词汇表过于庞大(将不常见词拆成子词)。
- 例如,”unlikable” 可能会被拆分成 $\text{[‘un’, ‘lik’, ‘able’]}$。
 
 
知识延伸:BPE 的变体
在实际的大模型中,通常使用的是 BPE 的变体,如 WordPiece (Google, BERT 使用) 或 SentencePiece (Google)。这些变体在处理空格和多语言字符集上进行了优化。
tiktoken
tiktoken 是由 OpenAI 开发的一个高效的开源 Python 分词库。
tiktoken 的核心作用
- OpenAI 模型的官方标准: 它是 OpenAI 的模型(如 GPT-3、GPT-4、Codex 等)用来将文本输入转化为模型能理解的 Token ID 序列的工具。
 - 计算 Token 数量: 由于 OpenAI 的 API 调用通常根据 Token 数量收费,tiktoken 是用户准确计算输入和输出文本 Token 数量的关键工具。
 - 高效性: tiktoken 库的核心实现采用了 Rust 语言,因此在速度上比纯 Python 实现的分词器快得多。
 
tiktoken 与 BPE 的关系
- 实现基础: tiktoken 库中包含并使用了专门为 GPT 模型训练的 **BPE 编码器(BPE Encoder)**及其特定变体(如用于处理 UTF-8 字节序列的 BPE)。
 - 不同编码器: tiktoken 库支持多种编码器,对应不同的模型家族:
cl100k_base:用于 GPT-4, GPT-3.5-Turbo, Text-Embedding V2 等。p50k_base:用于 Codex 模型和较老的 GPT-3 模型。
 
具体示例:tiktoken 的应用
假设您想知道一句话在 GPT-4 模型中占多少 Token:
| 文本输入 | 期望分词结果 (cl100k_base 编码) | Token 数量 | 作用 | 
|---|---|---|---|
| “tiktoken is efficient.” | $\text{[‘tik’, ‘token’, ‘ is’, ‘ efficient’, ‘.’]}$ | 5 | tiktoken 将“tiktoken”这个词拆成了两个子词 $\text{[‘tik’, ‘token’]}$,以实现高效编码。 | 
总结:
BPE 是一种算法思想,它定义了如何用子词来分割文本以平衡效率和表示能力。tiktoken 是一个具体工具,它高效地实现了这种算法思想,并成为特定大语言模型(OpenAI系列)的标准分词器。