什么是 Token - AI 面试题全解析
一、核心要点速览
💡 核心考点
- Token 定义: LLM 处理文本的最小单位,可以是词、子词或字符
- 计算方式: 不同模型有不同的分词策略(BPE、WordPiece 等)
- 成本影响: API 调用按 Token 数量计费,直接影响使用成本
- 长度限制: 模型上下文窗口以 Token 为单位(如 GPT-4 支持 8K/128K Tokens)
二、Token 是什么
1. 基本概念
Token 是大语言模型(LLM)处理和生成文本时的最小单位。模型并不直接理解"单词"或"汉字",而是将文本拆分成更小的单元——Token。
示例文本: "Hello, world!"
分词结果: ["Hello", ",", " world", "!"]
Token 数量: 4 个 tokens2. 中文 vs 英文的 Token 差异
| 语言 | 示例 | Token 数 | 说明 |
|---|---|---|---|
| 英文 | "I love AI" | ~3 tokens | 通常一个单词 = 1 token |
| 中文 | "我爱人工智能" | ~6-7 tokens | 一个汉字 ≈ 1-1.5 tokens |
| 混合 | "AI技术" | ~3-4 tokens | "AI" + "技" + "术" |
⚠️ 注意
中文的 Token 效率通常低于英文,因为:
- 英文常用词可能被识别为单个 Token
- 中文字符通常需要多个 Token 表示复杂概念
三、Token 的计算方式
1. 常见分词算法
BPE (Byte-Pair Encoding)
- 原理: 从字符级别开始,反复合并最频繁的字节对
- 应用: GPT 系列、Llama 等模型使用
WordPiece
- 原理: 基于概率最大化选择子词单元
- 应用: BERT、Transformer 等模型使用
Unigram LM
- 原理: 从大词汇表开始,逐步移除低频率单元
- 应用: SentencePiece、XLNet 等
2. 实际计算示例
python
# 使用 tiktoken (OpenAI 官方库) 计算 Token
import tiktoken
encoding = tiktoken.encoding_for_model("gpt-4")
# 英文示例
text_en = "Hello, how are you?"
tokens_en = encoding.encode(text_en)
print(f"英文 Token 数: {len(tokens_en)}") # 输出: 5
# 中文示例
text_zh = "你好,世界!"
tokens_zh = encoding.encode(text_zh)
print(f"中文 Token 数: {len(tokens_zh)}") # 输出: 63. 在线工具推荐
| 工具名称 | 链接 | 特点 |
|---|---|---|
| OpenAI Tokenizer | platform.openai.com/tokenizer | 官方工具,支持 GPT 模型 |
| Tiktoken Demo | github.com/openai/tiktoken | 本地运行,精确计算 |
| Hugging Face Tokenizers | huggingface.co/tokenizers | 支持多种模型 |
四、Token 的重要性
1. 成本计算
OpenAI API 定价示例(GPT-4):
| 类型 | 价格 | 说明 |
|---|---|---|
| 输入 Token | $10 / 1M tokens | Prompt 部分 |
| 输出 Token | $30 / 1M tokens | Completion 部分 |
实际案例:
- 一次对话: 500 输入 tokens + 200 输出 tokens
- 成本: (500 × $10 + 200 × $30) / 1,000,000 = $0.011
- 1000 次对话成本: $112. 上下文窗口限制
| 模型 | 上下文窗口 | 约等于 |
|---|---|---|
| GPT-3.5 Turbo | 16K tokens | ~12,000 单词 |
| GPT-4 | 8K / 128K tokens | ~6K / 100K 单词 |
| Claude 3 | 200K tokens | ~150,000 单词 |
| Llama 3 | 8K / 128K tokens | ~6K / 100K 单词 |
💡 优化建议
长文档处理技巧:
- 分段处理: 将长文本拆分为多个片段
- 摘要压缩: 先提取关键信息再输入
- 向量检索: 使用 RAG 技术按需检索相关内容
3. 性能影响
- 推理速度: Token 越多,生成速度越慢
- 内存占用: 上下文越长,显存需求越大
- 响应延迟: 输出 Token 数直接影响首字延迟(TTFT)
五、Token 优化策略
1. Prompt 优化
❌ 冗余写法 (Token 浪费):
"请你帮我分析一下下面这段文本的情感倾向是积极的还是消极的还是中性的..."
✅ 精简写法:
"分析情感倾向: [文本]"2. 输出控制
python
# 限制最大输出 Token 数
response = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": "简要回答"}],
max_tokens=100 # 限制输出长度
)3. 缓存策略
- 复用 Prompt: 相同系统提示词只需发送一次
- 向量化存储: 将常见问题答案缓存,避免重复调用
六、常见面试题
Q1: Token 和单词有什么区别?
标准回答: Token 不等于单词。Token 是模型处理文本的最小单位,可能是一个完整单词("hello")、子词("ing")、单个字符(中文字)甚至标点符号。英文中一个单词可能对应 1 个或多个 Token,中文中一个汉字通常对应 1-1.5 个 Token。
记忆口诀: "Token 非单词,拆分看模型;英文较高效,中文略费令"
Q2: 为什么中文的 Token 效率较低?
标准回答: 主要原因有三点:
- 训练数据偏差: 主流模型训练数据中英文占比高,词表对英文优化更好
- 编码策略: BPE 等算法对英文空格分隔友好,中文无空格导致切分粒度更细
- 信息密度: 中文单字信息密度高,表达相同意思需要更多字符
优化建议: 在中文场景下,可通过 Prompt 精简、批量处理等方式降低 Token 成本。
Q3: 如何估算一个文本的 Token 数量?
标准回答: 有三种常用方法:
- 经验估算: 英文 ~0.75 词/token,中文 ~1.5-2 字/token
- 官方工具: 使用 OpenAI Tokenizer 或 tiktoken 库精确计算
- API 返回: 调用 API 后查看 response.usage 中的实际 Token 数
对于生产环境,建议使用官方库进行预计算,以便成本控制。
七、实战案例
案例 1: 计算对话成本
python
import tiktoken
def calculate_cost(prompt: str, completion: str, model: str = "gpt-4"):
"""计算 API 调用成本"""
encoding = tiktoken.encoding_for_model(model)
prompt_tokens = len(encoding.encode(prompt))
completion_tokens = len(encoding.encode(completion))
# GPT-4 定价
input_price = 10 / 1_000_000 # $10 per 1M tokens
output_price = 30 / 1_000_000 # $30 per 1M tokens
total_cost = (prompt_tokens * input_price +
completion_tokens * output_price)
print(f"输入: {prompt_tokens} tokens")
print(f"输出: {completion_tokens} tokens")
print(f"总成本: ${total_cost:.6f}")
return total_cost
# 使用示例
calculate_cost("写一篇关于AI的文章", "AI是人工智能的缩写...")案例 2: Token 计数器实现
javascript
// 前端实时 Token 计数
async function countTokens(text) {
// 方法1: 调用后端 API
const response = await fetch('/api/count-tokens', {
method: 'POST',
body: JSON.stringify({ text })
});
const data = await response.json();
return data.tokenCount;
// 方法2: 使用 WebAssembly 运行 tiktoken
// const encoder = await initTiktoken();
// return encoder.encode(text).length;
}八、总结与展望
核心要点回顾
| 维度 | 关键点 |
|---|---|
| 定义 | Token 是 LLM 处理文本的最小单位 |
| 计算 | 不同模型有不同分词策略 |
| 成本 | API 按 Token 数量计费 |
| 限制 | 上下文窗口以 Token 为单位 |
| 优化 | Prompt 精简、输出控制、缓存策略 |
未来趋势
- 更高效的分词: 针对多语言优化的 Tokenization 算法
- 动态上下文: 突破固定窗口限制的技术(如 Ring Attention)
- 成本下降: 随着技术进步,Token 单价持续降低
- 开源替代: Llama 等开源模型提供更经济的 Token 处理方案