共计 1898 个字符,预计需要花费 5 分钟才能阅读完成。
Token 的核心概念与影响
在自然语言处理(NLP)中,Token 是模型处理文本的最小单位,类似于人类语言中的词或子词(Subword)。它是将原始文本分割后的离散片段,直接影响模型的输入表示和计算效率。例如,句子 ”ChatGPT 很棒 ” 可能被分割为 [“Chat”, “G”, “PT”, “ 很 ”, “ 棒 ”] 等 Token。

Token 的划分方式会显著影响两个方面:
- 计算资源消耗:模型的计算量通常与 Token 数量成正比,更多的 Token 意味着更高的内存占用和更长的推理时间。
- 语义理解质量:合理的 Token 划分能更好地捕捉词汇语义,尤其是对未登录词(OOV)的处理能力。
主流 Tokenization 策略对比
不同模型采用的分词(Tokenization)策略各有优劣,以下是两种典型方案的对比:
| 策略 | 原理说明 | 英文样例 | 中文样例 | 混合文本样例 |
|---|---|---|---|---|
| WordPiece | 基于统计的子词切分 | “unhappiness” → [“un”, “##happiness”] | “ 人工智能 ” → [“ 人 ”, “ 工 ”, “ 智能 ”] | “AI 技术 ” → [“A”, “I”, “ 技术 ”] |
| BPE | 迭代合并高频字符对 | “lowest” → [“low”, “est”] | “ 云计算 ” → [“ 云 ”, “ 计算 ”] | “Python 代码 ” → [“P”, “ython”, “ 代码 ”] |
Token 处理实战示例
1. 精确计算 Token 消耗
使用 OpenAI 的 tiktoken 库可以准确估算 GPT 模型的 Token 使用量:
import tiktoken
def count_tokens(text, model_name="gpt-3.5-turbo"):
try:
encoding = tiktoken.encoding_for_model(model_name)
return len(encoding.encode(text))
except KeyError:
print(f"Warning: Model {model_name} not found. Using cl100k_base encoding.")
encoding = tiktoken.get_encoding("cl100k_base")
return len(encoding.encode(text))
# 示例用法
text = "自然语言处理 (NLP) 是 AI 的核心领域"
print(f"Token 数量: {count_tokens(text)}")
2. 文本预处理优化
通过清洗数据可以减少无效 Token:
import re
def clean_text(text):
# 移除连续空格和特殊字符
text = re.sub(r'\s+', ' ', text)
text = re.sub(r'[^\w\s.,?!:;\u4e00-\u9fff]', '', text)
return text.strip()
raw_text = "这是一段包含多余空格 & 特殊符号 * 的文本!"
clean = clean_text(raw_text)
print(f"原始 Token 数: {count_tokens(raw_text)}")
print(f"清洗后 Token 数: {count_tokens(clean)}")
3. 参数配置策略
合理设置 max_tokens 等参数实现质量与成本的平衡:
def generate_with_budget(prompt, max_output_tokens=100, temperature=0.7):
# 预留 20% 的 Token 空间给输出
prompt_tokens = count_tokens(prompt)
max_tokens = min(max_output_tokens, int(4096 - prompt_tokens * 1.2))
if max_tokens <= 0:
raise ValueError("输入过长,请缩短提示文本")
# 这里应替换为实际的 API 调用
print(f"将使用 max_tokens={max_tokens}进行生成")
生产环境注意事项
长文本分块处理
- 切割时注意保留句子完整性,避免在单词 / 子词中间断开
- 添加重叠区域(如前一块的尾部 50 个 Token 作为下一块的头部)保持上下文连贯
多语言混输问题
- 中文通常需要 1.5- 2 倍于英文的 Token 数量
- 混合代码和文本时,符号可能被拆分为多个 Token
流式输出计数
- 实时 Token 计数需要考虑部分解码(Partial Decoding)情况
- 建议使用官方 SDK 提供的 Usage 字段而非自行计算
延伸思考问题
- 如何评估不同 Tokenizer 对特定领域文本(如医学、法律)的适应性?
- 在有限的 Token 预算下,哪些文本压缩技术(如实体缩写)最有效?
- 如何设计动态 Tokenizer,在运行时根据输入内容调整分词策略?
正文完
发表至: 人工智能
近三天内
