什么是 Token
Token 是 AI 模型处理文本的基本单位。它可以是一个单词、一个子词(subword)、一个字符,甚至是一个标点符号。
原文本: "我在学习 AI"
Token 化后: ["我", "在", "学习", "AI"]
为什么需要 Tokenization
计算机无法直接理解文字,只能处理数字。Tokenization 就是把文字转换为数字(token ID)的过程:
文字 → Token → Token ID → 嵌入向量 → 模型
Tokenization 方法
1. 词级分词 (Word-level)
按空格和标点分割:
"Hello, world!" → ["Hello", ",", "world", "!"]
缺点:
- 词表太大(英语常用词约 10 万+)
- 未登录词(OOV)问题
- 无法处理拼写错误
2. 字符级分词 (Character-level)
每个字符作为一个 token:
"hello" → ["h", "e", "l", "l", "o"]
优点:
- 词表很小
- 没有 OOV 问题
缺点:
- 序列太长
- 语义理解能力弱
3. 子词分词 (Subword-level) - 主流方法
结合词级和字符级的优点:
"unhappiness" → ["un", "##happ", "##ness"]
常见算法:
BPE (Byte Pair Encoding)
- 统计相邻字节对出现的频率
- 逐步合并高频对
- OpenAI GPT、GPT-2 使用
WordPiece
- 基于概率选择合并
- Google BERT 使用
SentencePiece
- 统一框架
- 支持 BPE 和 Unigram
- 端到端训练,不需要预处理
词表大小的影响
| 词表大小 | 特点 |
|---|---|
| 小 (3k-10k) | 序列短,但 token 语义弱 |
| 中 (30k-50k) | 平衡之选,如 GPT-2 |
| 大 (50k-100k+) | token 语义丰富,但序列长,如 GPT-4 |
关键点:
- 上下文窗口限制的是 token 数量,不是词数
- 相同含义,用更多 token 表示可能更精确
Token 的限制
1. 上下文窗口
模型一次能处理的 token 数量有限:
| 模型 | 上下文窗口 |
|---|---|
| GPT-3.5 | 4K / 16K |
| GPT-4 | 8K / 32K / 128K |
| Claude | 200K |
2. 费用计算
API 通常按 token 收费:
- 输入 token + 输出 token = 总消耗
- 中文 token 化后通常比英文长
3. 注意力复杂度
O(n²) 复杂度是长序列的主要瓶颈。
实战:查看你的文本有多少 Token
# 使用 tiktoken (OpenAI)
import tiktoken
enc = tiktoken.get_encoding("cl100k_base")
tokens = enc.encode("我在学习 AI")
print(f"Token 数量: {len(tokens)}")
print(f"Token IDs: {tokens}")
// 使用 tokenizer 库
import { Tokenizer } from "@anthropic/tokenizer";
const tokenizer = new Tokenizer();
const result = tokenizer.encode("我在学习 AI");
console.log(result.tokens.length);
编写提示时的 Token 优化
- 简洁表达:同样意思,用更少的词
- 避免重复:模板化的废话会浪费 token
- 利用上下文:一次性把相关要求说清楚
- 中文特殊性:中文 token 化后较长,有时英文反而省 token
# 对比
"请帮我写一个函数,计算斐波那契数列" # 约 15 tokens
"写一个 fibonacci 函数" # 约 6 tokens
总结
- Token 是模型处理文本的基本单位
- 子词分词是目前的主流方法
- 理解 token 有助于优化提示和估算成本
- 上下文窗口限制的是 token 数量而非词数
相关文章
评论
加载中...
评论
加载中...