Jacky's blog
首页
  • Android
  • Web
  • Server
  • Python
  • iOS
  • Java
  • Vue
  • 计算机基础
  • AI
  • 全部工具
  • CLI 工具
  • 编辑器
  • 开发工具
  • 构建工具
  • 版本控制
  • 调试工具
  • 网络工具
  • 个人成长
  • 博客
  • 分类
  • 标签
  • 归档
收藏
GitHub (opens new window)

Jack Yang

编程; 随笔
首页
  • Android
  • Web
  • Server
  • Python
  • iOS
  • Java
  • Vue
  • 计算机基础
  • AI
  • 全部工具
  • CLI 工具
  • 编辑器
  • 开发工具
  • 构建工具
  • 版本控制
  • 调试工具
  • 网络工具
  • 个人成长
  • 博客
  • 分类
  • 标签
  • 归档
收藏
GitHub (opens new window)
  • 基础

  • AI 工具

  • 本地大模型

  • NLP 基础

    • 分词与 Token
      • Token 是什么
      • BPE 算法
      • pad_token 报错解决
        • 错误信息
        • 原因
        • 解决方法
        • 检查
    • 向量表示与 Embedding
    • RNN 循环神经网络
    • Hugging Face 开发指南
  • ai
  • nlp
Jacky
2025-05-13
目录

分词与 Token

# 分词与 Token

概念入口见 LLM 基础,模型加载见 Hugging Face。

# Token 是什么

LLM 处理文本的最小单位,不是字也不是词。

  • 一个 token 可能是完整单词、单词的一部分、标点或字节片段。
  • 同一个词在不同 tokenizer、位置或空白条件下,可能得到不同切分。
  • 使用目标模型的 tokenizer 实测,不把固定的“单词/汉字换算比例”当作通用规则。

参考:Transformers 分词算法说明 (opens new window)。

为什么用 token 而不是词:

  • 减少词汇表大小
  • 能处理未知词(组合子词)
  • 跨语言效率高

处理流程:

文本 → 分词(tokenize) → 映射为数字ID → 输入模型
模型输出 → 预测下一个token ID → 转回文本
1
2

# BPE 算法

Byte Pair Encoding,基于统计的分词算法,GPT 系列广泛使用。

核心思想:迭代合并高频相邻符号对,构建词汇表。下列字符级例子便于说明合并过程,实际实现还可能使用字节级初始符号和预分词规则。参见 Hugging Face BPE 说明 (opens new window)。

步骤:

  1. 所有文本分解为单个字符
  2. 统计相邻字符对频率
  3. 合并最高频字符对为新子词
  4. 重复直到达到目标词汇表大小

示例:

初始: l o w / l o w e r / n e w e s t / w i d e s t
合并 es: l o w / l o w e r / n e w es t / w i d es t
...继续迭代
1
2
3

优势:

  • 处理未知词(子词组合)
  • 平衡词汇表大小与语义表示
  • 捕捉常见模式(ing、ed 等后缀)
  • 跨语言适用

# pad_token 报错解决

# 错误信息

Asking to pad but the tokenizer does not have a padding token.
1

# 原因

批量处理时需要把不等长序列填充到相同长度,但 tokenizer 没有设置 pad_token。GPT-2 等模型默认没有 pad_token。

句子A: [Hello, world]      → 长度2
句子B: [Hi]                → 长度1
需统一: [Hello, world, PAD] / [Hi, PAD, PAD]
1
2
3

# 解决方法

方法一(推荐):用已有的 eos_token 当 pad_token

tokenizer.pad_token = tokenizer.eos_token
1

方法二:添加新的 pad token

tokenizer.add_special_tokens({'pad_token': '[PAD]'})
model.resize_token_embeddings(len(tokenizer))  # 模型也要 resize
1
2

# 检查

print(tokenizer.pad_token)              # None 就是没设置
print(tokenizer.special_tokens_map)
1
2
#NLP#LLM#base
上次更新: 2026/10/18, 22:14:48
LangChain + Ollama 本地 Agent
向量表示与 Embedding

← LangChain + Ollama 本地 Agent 向量表示与 Embedding→

最近更新
01
Codex 使用与会话管理指南
10-17
02
Tailscale 入门:让自己的设备跨网络互联
10-15
03
GitHub CLI(gh)工作流与 CI 排查
10-08
更多文章>
Theme by Vdoing | Copyright © 2019-2026 Jacky | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式