Skip to content

Tokenization

什么是Tokenization

Tokenization(分词)是将文本切分成更小单位(称为Token)的过程。这些Token是AI模型理解和处理文本的基本单位。

简单理解:Tokenization就像把一篇文章拆成一个个词语或字符,让AI能够逐个处理和理解。

Token与字符、单词的关系

英文文本

在英文中:

  • 1个Token ≈ 0.75个单词
  • 1个Token ≈ 4个字符

示例

文本: "Hello, world!"
Tokens: ["Hello", ",", "world", "!"]
单词数: 2
Token数: 4

中文文本

在中文中:

  • 1个Token ≈ 1-2个汉字
  • 常见词通常1个Token
  • 生僻词可能多个Token

示例

文本: "你好,世界!"
Tokens: ["你好", ",", "世界", "!"]
汉字数: 6
Token数: 4

常见分词方法

1. BPE (Byte Pair Encoding)

BPE是一种常用的分词方法,它通过统计文本中常见的字符对来构建词表。

工作原理

  1. 从单个字符开始
  2. 统计最常见的字符对
  3. 合并最常见的字符对
  4. 重复直到达到词表大小限制

优点

  • 处理未知词能力强
  • 词表大小可控
  • 适合多语言

缺点

  • 可能产生不直观的切分
  • 需要训练词表

示例

原始: "hug"
步骤1: ["h", "u", "g"]
步骤2: ["h", "ug"] (合并u和g)
步骤3: ["hug"] (合并h和ug)

2. WordPiece

WordPiece是BERT等模型使用的分词方法,与BPE类似但有一些改进。

工作原理

  • 选择能最大化训练数据似然的合并方式
  • 使用"##"前缀标记子词

示例

文本: "unhappiness"
Tokens: ["un", "##hap", "##pi", "##ness"]

3. SentencePiece

SentencePiece是一个通用的分词工具,支持多种分词算法。

特点

  • 语言无关
  • 支持多种分词算法
  • 处理空格特殊

示例

文本: "Hello world"
Tokens: ["▁Hello", "▁world"]

Token计数与成本

Token计费

大多数AI服务按Token计费:

  • 输入Token:你发送给模型的内容
  • 输出Token:模型生成的内容

示例

输入: 1000 tokens
输出: 500 tokens
总Token: 1500 tokens

成本计算

不同模型的定价不同:

模型输入成本输出成本
GPT-3.5$0.001/1K tokens$0.002/1K tokens
GPT-4$0.03/1K tokens$0.06/1K tokens
Claude$0.015/1K tokens$0.075/1K tokens

计算示例

使用GPT-4处理1000输入tokens和500输出tokens:
输入成本: 1000 * $0.03/1000 = $0.03
输出成本: 500 * $0.06/1000 = $0.03
总成本: $0.06

优化Token使用

方法

  1. 精简输入文本
  2. 删除冗余信息
  3. 使用简洁的表达
  4. 避免重复内容

示例

❌ 冗长(约100 tokens):
我想要请你帮我分析一下这篇关于人工智能的文章,这篇文章主要讨论了人工智能的发展历史、现状和未来趋势,请你仔细阅读后给我一个详细的总结...

✅ 精简(约30 tokens):
总结这篇关于人工智能发展历史、现状和未来趋势的文章

多语言分词挑战

挑战1:不同语言的分词方式

不同语言有不同的分词特点:

  • 英文:单词之间有空格
  • 中文:没有空格,需要智能切分
  • 日文:混合汉字、假名、罗马字
  • 阿拉伯文:从右到左书写

挑战2:词表大小限制

词表大小需要平衡:

  • 太小:很多词需要多个Token
  • 太大:模型参数增加,训练成本高

示例

小词表(10K):
"artificial" -> ["art", "##ifi", "##cial"] (3 tokens)

大词表(100K):
"artificial" -> ["artificial"] (1 token)

挑战3:未知词处理

如何处理训练时未见过的词:

  • 使用子词切分
  • 使用特殊标记(如[UNK])
  • 动态扩展词表

示例

未知词: "bioinformatics"
小词表: ["bio", "##info", "##rm", "##atics"]
大词表: ["bioinformatics"]

如何优化Token使用

1. 选择合适的模型

根据任务选择合适的模型:

  • 简单任务:使用小模型(词表小,Token效率高)
  • 复杂任务:使用大模型(词表大,理解能力强)

2. 精简表达

使用简洁的表达方式:

❌ 冗长:
我想请你帮我分析一下这个代码,这段代码的主要功能是实现一个用户登录的功能,包括用户名和密码的验证...

✅ 精简:
分析这段用户登录验证代码:[代码]

3. 删除冗余

删除不必要的信息:

  • 重复的说明
  • 过长的背景介绍
  • 不相关的细节

4. 使用结构化格式

使用结构化格式减少Token:

❌ 非结构化:
用户张三,年龄25岁,性别男,职业工程师,居住在北京...

✅ 结构化:
用户信息:
- 姓名:张三
- 年龄:25
- 性别:男
- 职业:工程师
- 居住地:北京

5. 批量处理

批量处理相似任务:

❌ 单独处理:
翻译这句话:Hello
翻译这句话:World
翻译这句话:AI

✅ 批量处理:
翻译以下句子:
1. Hello
2. World
3. AI

实际应用案例

案例1:代码分析

场景:分析一段代码

优化前(约200 tokens):

我想要请你帮我分析一下下面这段代码,这段代码是用Python写的,主要功能是实现一个快速排序算法,请你仔细阅读后告诉我这段代码的时间复杂度、空间复杂度以及可能的优化方向...

优化后(约50 tokens):

分析这段Python快速排序代码:
[代码内容]

请说明:
1. 时间复杂度
2. 空间复杂度
3. 优化方向

案例2:文本翻译

场景:翻译多段文本

优化前(每次约100 tokens):

翻译这句话:Hello world
翻译这句话:How are you
翻译这句话:Good morning

优化后(约80 tokens):

翻译以下句子为中文:
1. Hello world
2. How are you
3. Good morning

案例3:长文档处理

场景:处理长文档

优化前(一次性处理,可能超出上下文窗口):

分析这篇10000字的文章:[全文]

优化后(分段处理):

分析文章第1部分:[第1部分]
分析文章第2部分:[第2部分]
...
整合以上分析,总结全文

总结

Tokenization是AI处理文本的基础:

要点

  • ✅ Token是AI处理文本的基本单位
  • ✅ 不同语言的Token化方式不同
  • ✅ Token数量直接影响使用成本
  • ✅ 优化Token使用可以降低成本

最佳实践

  1. 理解Token与字符、单词的关系
  2. 选择合适的分词方法
  3. 优化表达,减少Token使用
  4. 批量处理相似任务
  5. 分段处理长文档

成本优化

  • 精简输入
  • 删除冗余
  • 使用结构化格式
  • 选择合适的模型

理解Tokenization有助于更高效地使用AI工具,控制使用成本。

下一步学习

MIT Licensed