知识串联: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 的目标是解决传统分词方法(如按词分词或按字符分词)的痛点,实现词汇表大小和表示能力的平衡

  1. 初始化: 将文本中的每个字符视作一个初始的“Token”。
  2. 合并: 迭代地寻找语料库中最常出现的相邻字节对(或字符对)
  3. 创建新 Token: 将这个最常出现的字节对合并成一个新的、单一的 Token。
  4. 重复: 重复步骤 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系列)的标准分词器。