Token的定义
Token 是大语言模型(LLM)处理和理解文本时的最小基本单位(Basic Unit)。它不是简单的“字符”或“单词”,而是模型词汇表中一个唯一的数字 ID。
为了让你更透彻地理解这个定义,我们需要把它拆解为三个层面的含义:
1. 它是“最小处理单元” (The Basic Unit)
模型无法直接理解人类的自然语言文字(如 "Hello" 或 "你好")。
- 定义视角:Token 是模型“看得懂”的最小语义或字符片段。
- 例子:
- 在英文中,一个单词
apple可能是一个 Token,但一个长单词unbelievable可能会被拆分为三个 Token:un、believ、able。 - 在中文中,通常一个汉字是一个 Token,但有时两个字的词(如“人工智能”)如果在训练数据中高频出现,也可能被合并为一个 Token。
- 在英文中,一个单词
2. 它是“数字 ID” (The Numerical ID)
这是最本质的定义。根据 OpenAI 的技术逻辑,模型内部其实是一个巨大的数学计算引擎,它只认数字。
- 定义视角:Token 是文本字符与模型内部数字向量之间的映射桥梁。
- 过程:
- 文本:
"你好" - 分词 (Tokenization):拆分为
["你", "好"] - 编号 (Token ID):映射为数字 `` (假设值)
- 向量 (Embedding):模型读取 ID 对应的向量进行计算。
- 文本:
3. 它是“计费与限制单位” (The Unit of Measure)
在商业应用中(如 OpenAI API),Token 是衡量资源消耗的“货币”。
- 定义视角:它是计算模型输入输出长度、显存占用和成本的基准单位。
- 官方口径:OpenAI 官方文档指出,“Token 是衡量你使用了多少计算资源的单位。你的文本输入和模型的输出都会被转换为 Token 进行计费。”
Token和字符的关系
字符(Character)与 Token 的关系:是“积木”与“预制件”的关系
我们不能绝对地认为“1 字符 = 1 Token”,但可以认为“Token 数量与字符数量成正比”。大模型在处理文本时,会使用一种叫做分词器(Tokenizer)的工具,把文本切分成更小的单元(Token)。这个切分逻辑在中英文之间差异很大:
对于中文
通常情况:1 个汉字 ≈≈ 1 个 Token。
例如:“你好”,通常会被切分为["你", "好"],也就是 2 个 Token。
特殊情况:如果是一些非常生僻的字,或者特殊的符号、表情,可能会被切得更碎,1 个字变成 2-3 个 Token,但这种情况较少。
对于英文
通常情况:1 个单词 ≈≈ 1-2 个 Token。
英文不是按字母算的。常见词如 "ChatGPT" 可能是一个 Token,但如果是 "Transformers" 这种长词,可能会被拆成["Trans", "former", "s"]三个 Token。
估算公式:通常 100 个英文单词大约对应 130 个 Token 左右。
Token 延迟 (Latency):反应速度
通俗理解:用户问一个问题,模型“打字”回复的速度。通常分为两个阶段:
- 首 Token 延迟 (Time to First Token, TTFT):用户按下回车,到屏幕上出现第一个字的时间。这决定了用户感觉系统“卡不卡”。
- Token 生成间隔 (Inter-Token Latency):第一个字出来后,后续每个字之间的间隔时间。这决定了阅读的流畅度。
在大模型内部,延迟对应什么?
这对应了模型进行数学计算所花费的时间。
- 计算过程:
- 模型接收到你的输入(Prompt)后,需要进行复杂的矩阵运算(主要是矩阵乘法)来预测下一个字(Token)。
- 这是一个串行过程:模型必须算出第一个字,才能基于第一个字去算第二个字,以此类推。
- 资源对应(测试视角的映射):
- GPU 算力 (Compute):这是最主要的瓶颈。模型参数越大(如 70B vs 7B),需要的计算量(FLOPs)就越大,GPU 的计算单元(CUDA 核心)就需要忙更久。
- 显存带宽 (Memory Bandwidth):GPU 计算时,需要频繁地从显存(VRAM)中读取模型权重和中间结果。如果显存带宽不够(比如用消费级显卡跑大模型),计算单元就会“饿死”——算得快,但数据喂不进来,导致延迟飙升。
- 网络延迟:如果是调用云端 API,还包括数据在网络上传输的时间。
测试类比:这就像是测试一个 Web 接口的 响应时间 (Response Time)。TTFT 就像 TTFB,而生成间隔就像数据流的传输速率。
Token 消耗 (Consumption/Cost):资源开销
通俗理解:运行一次对话,系统“烧”了多少钱,或者占用了多少硬件资源。
在大模型内部,消耗对应什么?
这对应了模型运行时的内存占用和计算量。
- 显存占用 (Memory/VRAM):
- 模型权重:这是最大的开销。一个 FP16 精度的 7B 模型,光权重就占约 14GB 显存。
- KV Cache (关键!):这是 RAG/LLM 特有的开销。为了保证上下文连贯,模型必须把之前所有对话的“注意力键值”缓存在显存里。
- 公式:
KV Cache 显存 ≈ 2 * 层数 * 头维度 * 序列长度 * 精度。 - 结论:上下文越长(长文档 RAG),显存占用越高,且是线性增长。
- 公式:
- 计算量 (Compute):
- 每生成一个 Token,都需要进行一次完整的前向传播计算。
- 消耗 = 输入 Token 数 + 输出 Token 数。输入 Token 决定了“预填充(Prefill)”阶段的计算量,输出 Token 决定了“解码(Decoding)”阶段的计算量。
资源对应(钱/成本)
在商业云服务中(如 OpenAI, Azure),Token 消耗直接等于金钱。
- 输入 Token:通常较便宜(读你的文档)。
- 输出 Token:通常较贵(模型生成回答)。
在自建服务中(你的 DevOps 场景),Token 消耗对应硬件成本:
- GPU 卡数:显存不够,就得用更多卡做模型并行。
- 电力与散热:GPU 满载运行的电费。
总结:一张表看懂 Token 与资源的映射
| 指标 | 大模型内部含义 | 对应的服务器资源 | 优化手段 (结合你学的知识) |
|---|---|---|---|
| Token 延迟 | 计算时间 | GPU 算力 (主)、显存带宽 | 量化 (LoRA/INT8):减少计算量;推测解码:一次算多个 Token。 |
| Token 消耗 | 资源占用 | GPU 显存 (主)、计算时长 | KV Cache 优化:减少内存碎片;模型剪枝:减小模型体积。 |
| 上下文长度 | 记忆长度 | 显存带宽 (瓶颈) | PagedAttention:像操作系统管理内存一样管理显存。 |
给测试工程师的建议
概要总结:
我们可以把 Token 理解为大模型世界的“资源代币”。Token 延迟就是 GPU 的计算时间,Token 消耗就是 GPU 显存和算力的占用量。它们就是服务器资源在大模型世界里的具体表现形式。在做测试或估算成本时,针对中文系统,完全可以把“字数”直接等同于“Token 数”来估算资源消耗,这会非常接近真实值。
压测大模型策略
可以从以下几个维度去“压测”一个大模型服务:
- 显存泄漏测试:模拟超长对话(几千 Token),观察 KV Cache 是否被正确释放。如果显存占用一直涨不降,那就是内存泄漏。
- 吞吐量测试 (Throughput):
- 输入密集型:发很长的文档让模型总结(考验 Prefill 阶段的显存带宽)。
- 输出密集型:让模型写几千字的小说(考验 Decoding 阶段的计算速度)。
- 成本测试:监控 Token 消耗。如果一个简单的问答消耗了巨大的 Token 数,说明模型的提示词(Prompt)设计有问题,或者检索(Retrieval)回来的上下文太冗余。
一定记住下面八条
- 1 个中文字符 ≈≈ 1 个 Token(估算时非常准确)。
- Token 越多 →→ 模型“脑容量”占用越高(显存)。
- Token 越多 →→ 模型“思考”越慢(计算延迟)。
- Token 越多 →→ 传输流量越大(带宽)。
- 内存占用(Memory / VRAM):随 Token 线性增长。
- CPU/GPU 计算量(Compute):随 Token 平方级增长(在长文本时),也就是说,当文本长度从 1000 Token 变成 2000 Token 时,计算量可能不是翻倍,而是变成 4 倍。
- 带宽(Bandwidth):随 Token 线性增长
- 延迟(Latency):生成的字符越多,用户等待的时间(首 Token 延迟和生成间隔)就越长。