在快速发展的人工智能领域,自然语言处理(NLP)技术一直处于研究链的顶端,如何让机器像人一样思考、推理、规划和行动,一直是研究人员们不断攀登的顶峰。而分词(tokenization)作为将原始文本转换为机器可处理格式的首要环节,具有不可替代的重要性。

分词过程将文本分割成离散单元——即token,这些token构成了后续分析的基础,包括词嵌入(embedding)、语法解析和模型训练等多个环节。早期的文本处理方法主要依赖简单的空格分割和正则表达式匹配。随着语言模型复杂度的提升和处理数据量的增加,对更智能、更具上下文感知能力的分词器的需求日益凸显。Tokenizer正是在这一背景下应运而生,它作为一种现代分词解决方案,具备高效性、适应性,并在设计过程中充分考虑了机器学习领域的最新进展。

本文基于个人在工作中对大模型相关知识的学习和实践,进行思考和总结,本文将梳理 tokenizer 的工作原理、训练方法、embedding关系以及实际使用流程,同时和大家探讨一下针对时序数据的特殊处理方式。

mark : 多总结,多归纳,多从业务角度看技术,会有收获。


一 、Tokenizer 基本概念

Tokenizer是一个工具、一个组件,一个分词器。在自然语言处理(NLP)中是一个关键组件,它负责将文本字符串转换成模型可以处理的结构化数据形式,通常是将文本切分成“tokens”或单词、短语、子词等单位。这些tokens是模型理解文本的基础。Tokenizer的类型和复杂性可以根据任务需求而变化,从简单的基于空格的分割到更复杂的基于规则或机器学习的分词方法。
所以,Tokenizer 也可看成是一个分词算法,是NLP大模型最基础的组件,基于Tokenizer可以将文本转换成独立的token列表,进而转换成输入的向量成为计算机可以理解的输入形式。

举个例子:

文本: "Hello world!"
Tokenizer: ["Hello", " world", "!"]  # 分词
token_ids = [154, 28, 900]           # 数字化表示
  • token:切分后的最小单元,可以是完整单词、子词或者字符
  • token_id:token 对应的整数索引,便于模型处理

可以归纳一下,Tokenizer就像桥梁,把文本和模型内部的数字世界连接起来。 放入到大模型完整的文本解析和输出流程,Tokenizers是第一个重要环节,而完整流程如下:

文本输入 → Tokenizer → token → token_id → Embedding → Transformer
模型输出 → token_id → token → 文本 
  • tokenizer 训练 → 生成词表 → token_id ↔ embedding ↔ 文本
  • 词表是桥梁,embedding 是模型内部语言

Tokenizer算法汇总分析

大语言模型中常用的tokenizer算法对于自然语言处理(NLP)任务至关重要。它们将文本分解为更小的单元(token),这些单元可以是单词、子词或字符,进而用于模型训练和推理。以下是几种常用的tokenizer算法及其详细介绍。

算法类型 主要特点 优缺点 适用场景
空格分词 简单、快速 处理复杂文本效果差 简单文本处理
正则表达式分词 灵活、可定制 需要手工定义规则 特殊字符处理
词汇表分词(WordPiece) 数据驱动、处理未见词汇 构建词汇表需要大量数据 BERT模型等
Byte-Pair Encoding (BPE) 频率统计、子词分解 需要训练词汇表 GPT系列模型
SentencePiece 无需预先分词、多语言支持 训练过程复杂 多语言模型(如T5)
神经网络分词 深度学习、复杂语言现象处理 训练资源需求大 高级NLP任务

Tokenizer函数及参数应用析

Tokenizer 允许使用两种方法向量化一个文本语料库:

  • 1、将每个文本转化为一个整数序列(每个整数都是词典中标记的索引)

  • 2、将每个文本转化为一个向量,其中每个标记的系数可以是二进制值、词频、TF-IDF权重等

    相对而言,Keras的Tokenizer使用起来比较顺畅,封装的比较完整,使用它我们可以对文本进行预处理、序列化、向量化等。Tokenizer基于矢量化语料库、单词数、TF-IDF等,将每个文本转换为整数序列或转换成矢量。

    keras里面的Tokenizer 函数使用:

  keras.preprocessing.text.Tokenizer(num_words=None,
      filters='路径路径路径路径路径和文件 ', 
      lower=True, 
      split=' ', 
      char_level=False, 
      oov_token=None, 
      document_count=0)

参数说明:

    num_words: 需要保留的最大词数,基于词频。只有最常出现的 num_words 词会被保留。
    filters: 一个字符串,其中每个元素是一个将从文本中过滤掉的字符。默认值是所有标点符号,加上制表符和换行符,减去 ’ 字符。
    lower: 布尔值。是否将文本转换为小写。
    split: 字符串。按该字符串切割文本。
    char_level: 如果为 True,则每个字符都将被视为标记。
    oov_token: 如果给出,它将被添加到 word_index 中,并用于在 text_to_sequence 调用期间替换词汇表外的单词。

Tokenizer 的核心输出:词表

训练完成后,会生成词表(vocabulary),用于在模型训练和推理时做映射:

映射类型 作用
token → token_id 文本转成数字,便于 embedding 查表和模型训练
token_id → token 模型输出转回文本,供人类阅读

存储方式:

  • BPE / RustBPEvocab.json(token→id)、merges.txt(BPE合并规则)、tokenizer_config.json
  • embedding lookup 时只用 token_id,而decode 时必须用词表

从 token_id 到 embedding

Embedding 是将Tokenizer生成的整数ID转化为稠密的向量表示的过程。与Tokenizer将文本转换为离散的整数ID不同,Embedding生成的是连续的实数值向量,这些向量能够捕捉词之间的语义关系。

Transformer 模型只能处理数字向量,而不是文本。Embedding 层就是把 token_id 转换成向量表示的组件:

Embedding matrix: shape = (vocab_size, embedding_dim)
每一行对应一个 token_id 的向量 

在Embedding阶段,语言模型通过查表的方式,将每个整数ID映射到一个高维向量空间中的向量。这个向量通常是一个固定维度的向量(例如,300维、512维或768维),用来表示单词或子词的语义特征。
例如,经过Tokenizer处理的文本“我喜欢学习”可能会生成整数ID序列 [1, 2, 3, 4, 5]。在Embedding阶段,这些ID会被转换为稠密向量表示,如:

• “我” -> [0.25, -0.34, 0.15, …]
• “喜欢” -> [0.12, 0.57, -0.22, …], [0.11, -0.09, 0.31, …]
• “学习” -> [0.33, -0.44, 0.19, …], [0.09, 0.23, -0.41, …]
这些向量并不是随机生成的,它们是在模型的训练过程中被学习得到的。Embedding向量的维度固定,但向量的数值根据模型对词语上下文的理解不断更新和优化,最终形成一个语义丰富的向量表示。

每一行 embedding 向量对应一个 token,序列顺序保持和原文本一致。

从 embedding 回到文本

embedding 是模型内部的数字表示,无法直接恢复文本。要还原文本,需要两步:

  1. embedding → token_id(通常由模型预测或取 argmax)
  2. token_id → token → 拼接成文本(通过 tokenizer 的 decode 方法

例如:

token_ids = [154, 28, 900]
 tokens = ["Hello", " world", "!"]
 text = "".join(tokens)  # "Hello world!" 

embedding 和文本的关系

可以把 embedding 想象成 token 的数字化“语义特征向量”:

  • 相似含义的 token → embedding 向量更接近
  • 不同含义的 token → 向量距离更远

类比

  • 文本 token = “苹果”、“香蕉”、“橙子”
  • embedding = 对应的特征向量 [红色, 圆形, 甜味]
  • 模型只看 embedding,理解 token 的语义

至此,再回顾整个流程

为补充上述文字说明,下面提供一张图,用于直观展示Tokenizer的数据流程,以增强理解清晰度。


┌────────────────┐
│   原始文本     │
│ "Hello world!" │
└───────┬────────┘
        │ Tokenizer 切分
        ▼
┌────────────────┐
│     Token      │
│ ["Hello",      │
│  " world",     │
│  "!"]          │
└───────┬────────┘
        │ 映射到词表
        ▼
┌────────────────┐
│   Token IDs    │
│ [154, 28, 900] │
└───────┬────────┘
        │ Embedding lookup
        ▼
┌───────────────┐
│ Embedding序列 │
│ shape=(3,2048)│
│ [E[154],E[28],│
│  E[900]]      │
└───────┬───────┘
        │ 输入 Transformer
        ▼
┌────────────────┐
│ Transformer    │
│ 计算与输出      │
└───────┬────────┘
        │ 模型预测 token_id
        ▼
┌────────────────┐
│   Token IDs    │
│ [154, 28, 900] │
└───────┬────────┘
        │ Tokenizer decode
        ▼
┌────────────────┐
│   还原文本      │
│ "Hello world!" │
└────────────────┘

Tokenizer 的优化

分词性能增强技术
随着NLP系统规模扩大至处理海量文本数据,性能优化变得尤为关键。Tokenizer 增加改进,通过集成性能优化模块以提升速度和内存效率:缓存与记忆化技术通过存储先前处理结果,使系统能快速检索重复输入的token,无需重新计算。这种方法在对话系统或实时文本分析等应用场景中尤为有效,因为这些场景中经常出现相似输入内容。

并行处理策略
适用于大规模数据集,通过将文本分块并同时处理,显著减少总处理时间。延迟评估技术则采用动态生成token的方式,而非一次性处理整个文本,从而节约内存并更高效处理流式数据。

内存与计算效率优化
处理大量文本时,高效内存管理至关重要。Tokenizer通过优化内存开销策略来解决:Python生成器的应用使系统能够一次生成一个token,显著降低内存占用;批量处理策略可以平衡计算负载,避免一次性处理整个输入导致的资源压力;优化的数据结构如哈希映射用于缓存和查找操作,确保即使在词汇量增长情况下,分词速度仍保持高效。

持久化缓存策略
在生产环境中,高效的词汇表映射和缓存机制对于减少重复计算工作至关重要,尤其是在处理大规模输入数据时。主要的增强功能包括:
动态词汇表更新,仅在遇到新token时才进行词汇表扩充;持久化缓存系统,可选择性将缓存结果保存到磁盘或快速内存数据库中,以便在高频率输入场景中复用。

多轮对话中的实时缓存机制:
在大模型的聊天场景中,多轮对话和实时高精度的意图理解尤为重要,聊天机器人需要快速而准确地理解用户输入。这时需要用到实时缓存机制技术。
频繁询问的问题在token化后被缓存,显著减少延迟;自适应词汇表:当聊天机器人遇到特定领域术语时,编码器动态更新词汇表;错误恢复能力:高级预处理能够净化嘈杂的用户输入(如俚语、拼写错误等)。从而确保了聊天机器人交互既高效又语义丰富。

一些实践经验

  • vocab_size 一般 32k ~ 65k,embedding_dim 根据模型大小选择

  • vocab_size 越大:

    • token 更短 → 精度高
    • embedding 大 → 显存占用高
  • vocab_size 越小:

    • embedding 小 → 内存占用低
    • token 序列变长 → 模型计算成本增加

通过理解 tokenizer 的工作原理,就能明白为什么大语言模型在训练和推理中会先做 tokenization,以及 embedding 层如何把文本映射为模型可理解的向量序列

拓展探讨:tokenizer和时序数据的处理

时间序列预测的核心是对未来值的条件分布进行建模。LLM作为强大的自回归语言模型,能够很好地拟合复杂的数字数据分布。实验表明,LLM对不同概率分布的拟合效果非常好,这也解释了其在时序预测中的潜力。

实验表明,LLM的预测效果超过了许多传统预测模型。尽管效果未必达到最优,但在zero-shot场景中,无需专门训练数据的情况下已经相当不错。然而,tokenizer处理时序数据还会有些问题,比如RLHF(基于人类反馈的强化学习)调优并不适合时序预测,而且一个比较普遍的问题是 大模型的tokenizer对时序数据不够友好,很容易爆context。要想解决这个问题,就需要训练专门的tokenizer来优化。

可以考虑通过数据标准化(Rescaling)方法来做序列数据的预处理,这个方法主要目的是减少token数量,通常使用MinMaxScaler对数值进行缩放,使其限制在特定范围内,以便模型更好地处理。

小结

本文围绕大模型核心组件 Tokenizer 展开系统梳理,结合实践经验从技术原理、应用方法到业务落地进行全面解析。Tokenizer 作为文本与模型数字世界的桥梁,核心功能是将原始文本切分为 token 并映射为 token_id,后续经 Embedding 层转换为语义向量供 Transformer 处理,最终通过解码还原为可读文本,完整流程覆盖 “文本→token→token_id→Embedding→模型→反向还原” 的全链路。
同时,针对性能优化,提出缓存机制、并行处理、内存管理等实用策略,尤其适配海量文本与多轮对话场景的业务需求,为Tokenizer 的选型、配置与优化提供了可落地的实践参考。
Tokenizer的发展反映了NLP领域整体的发展轨迹。随着语言模型变得越来越复杂,应用程序对处理速度的要求越来越高,所以Tokenizer技术变得尤为重要,期待未来新技术的演进能带来新的技术革命。


Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐