共计 1600 个字符,预计需要花费 4 分钟才能阅读完成。
核心概念:Token 的本质
在自然语言处理中,Token 是模型理解和处理文本的最小功能单位。不同于人类认知中的 ” 单词 ”,Token 可能是子词(subword)、单个字符甚至标点符号。例如:

- 英文短语 ”unhappiness” 可能被拆分为
["un", "happiness"] - 中文句子 ” 深度学习 ” 可能被分解为
["深", "度", "学习"] - 表情符号 ”😊” 通常作为独立 Token 存在
这种设计使模型能:
1. 有效处理未登录词(OOV)
2. 平衡词表大小与语义粒度
3. 统一处理多语言混合文本
技术实现:主流分词算法解析
1. Byte Pair Encoding (BPE)
BPE 通过迭代合并高频字符对构建词表:
# 简化版 BPE 实现示例
from collections import defaultdict
def train_bpe(text, vocab_size):
vocab = list(set(text))
while len(vocab) < vocab_size:
pairs = defaultdict(int)
# 统计相邻符号对频率
for word in text:
symbols = word.split()
for i in range(len(symbols)-1):
pairs[(symbols[i], symbols[i+1])] += 1
# 合并最高频对
most_frequent = max(pairs, key=pairs.get)
new_vocab = []
for word in text:
word = ' '.join(word)
word = word.replace(''.join(most_frequent),''.join(most_frequent))
new_vocab.append(word)
text = new_vocab
return text
2. WordPiece
与 BPE 类似,但基于概率合并(而非单纯频率):
# HuggingFace 实际调用示例
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
tokens = tokenizer.tokenize("Hello world!") # ['hello', 'world', '!']
性能考量:Token 的经济学
| 模型 | 最大 Token 数 | 每千 Token 成本 |
|---|---|---|
| GPT-4 | 32,768 | $0.06 |
| Claude 3 | 200,000 | $0.025 |
| Llama 3-70B | 8,192 | $0.0018 |
关键发现:
1. 长 Token 序列增加:
– 内存占用(平方级关系)
– API 调用成本
– 推理延迟
2. 短 Token 丢失:
– 语义连贯性
– 指代消解能力
避坑指南:多语言处理
常见问题:
1. 中日韩文本 Token 膨胀(2- 3 倍于英文)
解决方案:优先使用专用 tokenizer 如cl100k_base
-
数学公式 / 编程代码异常拆分
解决方案 :添加特殊标记<code>保护区域 -
混合语言编码混乱
案例:” こんにちは Hello” 可能被错误切分
修复:强制指定tokenizer.set_language("ja")
实践优化策略
对话系统:
- 压缩历史消息:保留最近 3 轮 + 关键实体
- 用
[summary]标签替代长文本
文本摘要:
- 优先截断冗余内容(如版权声明)
- 动态计算
rouge分数决定截断点
def optimize_input(text, max_tokens=1024):
sentences = split_by_punctuation(text)
while len(tokenizer.encode(sentences)) > max_tokens:
sentences = sentences[:-1] # 从后向前截断
return sentences
开放性问题
当处理法律 / 医疗文档时:
– 如何权衡 Token 效率与术语完整性?
– 是否存在领域自适应的分词策略?
– 低资源语言是否应该采用字符级 Token?
正文完
发表至: 人工智能
近一天内
