Token 是什么?如何计算和控制 Token 数量?
Token 是什么?如何计算和控制 Token 数量?
这道题考的是对大模型底层机制的深刻理解。面试官想看你知不知道"模型看到的文本"和"我们写的文本"不是一回事,中间有个转换过程。
我分四个部分来讲:Token的本质、中英文分词差异、Token计算方法、实战控制策略。
板块1:Token的本质——模型看得懂的"积木块"
很多人以为Token就是一个字或一个词。
错。
Token是分词器(Tokenizer)把文本切分后的最小语义单元,最终会转成数字ID供模型计算。
看这个流程:
文本 → 分词器 → Token序列 → 数字ID → 向量嵌入 → 模型
就像乐高积木——分词器把完整的模型拆成一块块积木,模型只认识这些积木的形状,不认识整张图纸长什么样。
举个例子:
- "hello" 可能被切成 1 个 Token
- "unhappiness" 可能被切成 3 个 Token:un + happy + ness
- "人工智能" 可能被切成 2-4 个 Token,取决于分词器
模型根本"看不懂"你写的字,它只认识这些数字ID。
板块2:中英文分词差异——为什么"hello"和"你好"Token数不同
英文用子词切分。单词可以被拆成词根、前缀、后缀。目的有两个:
- 减少词表大小
- 让模型学会"un-"表示否定,"-ness"表示名词
中文分词完全不一样。没有天然的词边界,分词器按字或短语来切。同一段中文,不同分词器可能切出不同结果。
这导致一个很现实的问题:同样意思的内容,中文比英文更费Token。
估算一下:
- 英文:1 Token ≈ 0.75 个单词 ≈ 4 个字符
- 中文:1 Token ≈ 1.5-2 个字
这意味着同样的知识,中文文档可能比英文文档贵一倍的Token。
面试时说到这个点,面试官可能会追问:"那中文模型怎么处理这个问题?"
答案是:中文模型用更大的词表,把常见词组直接作为一个Token,比如"人工智能"、"机器学习"。
板块3:Token数量计算——手把手教你用工具
网上说"中文每字1.5-2 Token",这是个经验值。实际计算时误差可能超过30%。
为什么误差这么大?因为Token数跟内容本身有关——重复内容压缩率高,英文和数字穿插会影响结果。
所以别用经验估算,用工具。
Python里最常用的是tiktoken,OpenAI出的,专门算Token:
python
import tiktoken
用GPT-4的分词器
enc = tiktoken.get_encoding("cl100k_base")
text = "你好,世界!Hello, World!"
tokens = enc.encode(text)
print(f"Token数: {len(tokens)}")
print(f"Token IDs: {tokens}")
输出:
Token数: 12
Token IDs: [5761, 229, 165, 234, 220, 137, 40, 1333, 192]
也可以直接用OpenAI的官方工具网页算。
面试能说出"用tiktoken"这几个字,比背公式靠谱多了。
板块4:控制Token的实战策略——省成本提质量
这里问的是怎么控制成本、提升效果。四大策略:
1. 精简输入
Prompt别啰嗦,去掉废话。重复模板改成变量。指令和背景分开,让模型只处理必要信息。
2. max_tokens限制输出
API调用时设置max_tokens参数。但要注意:设太小会截断,设太大会浪费。
3. 截断策略
历史记录太长要截断,三种方式:
- Head策略:保留开头,扔掉后面的
- Tail策略:保留最新的,扔掉前面的
- Double策略:两边都保留,扔掉中间的
怎么选?看场景。
摘要类任务——用Head策略。开头通常是主题和总起。
聊天类场景——用Tail策略。最近几轮对话最关键。
长文档分析——用Double策略。开头结尾可能都有重要信息。
4. RAG检索增强
别把整个知识库塞进Prompt。分块处理,只检索最相关的片段进去。
成本控制的本质
说完策略,再讲个关键点。
输入Token便宜,输出Token贵。
GPT-4 Turbo:输入$0.01/1K tokens,输出$0.03/1K tokens。差了3倍。
为什么?
输入可以并行处理,模型一次看完全部内容。输出必须一个字一个字生成,慢,还占推理资源。
还有一个限制:上下文窗口。上限是128K tokens,不是无限的。输入太满,输出没空间。
面试怎么答
基础版(能过的回答):
Token是分词器处理的最小语义单位,不是简单的字或词。英文按子词切分,中文按字或短语,所以同样内容中文Token数更多。计算Token可以用tiktoken库或OpenAI官方工具。控制Token主要靠精简输入、设置max_tokens限制输出、选择合适的截断策略、以及RAG检索增强只把相关内容放进上下文。
加分版(让面试官眼前一亮):
补充几个实战细节:输入Token便宜可以并行计算,输出Token贵必须一个字一个字生成,要根据这个分配预算。还有,角色设定(system prompt)本身也消耗Token,输入太满会导致输出被截断。实用技巧是用日志追踪每次调用的Token使用量,持续优化成本。
一句话总结
Token是大模型的"字",懂它的脾气才能用好大模型。
