你有没有好奇过:大模型回答问题时,是像人一样"想好整句话再写",还是别的方式?
答案是------它根本不会先想好整句话。它是像一个"逐字接龙"游戏:根据已经写下的内容,一个字一个字地猜下一个最可能出现的词,直到写完。
这篇把这个机制彻底拆开:它怎么选词、Token 是什么、词表为什么重要、为什么"输出比输入贵"、以及 AI 是怎么"记住"你的。
目录
目录
[1.1 选词不是"猜一个",而是"按概率抽一个"](#1.1 选词不是"猜一个",而是"按概率抽一个")
[1.2 完整过程](#1.2 完整过程)
[1.3 自回归生成](#1.3 自回归生成)
[二、Token 是什么:AI 眼中的最小语言单位](#二、Token 是什么:AI 眼中的最小语言单位)
[2.1 切分形态](#2.1 切分形态)
[2.2 为什么需要 Token](#2.2 为什么需要 Token)
[3.1 生成范围](#3.1 生成范围)
[3.2 字节级回退:一个字符都不漏](#3.2 字节级回退:一个字符都不漏)
[4.1 致命伤一:算力闲置](#4.1 致命伤一:算力闲置)
[4.2 致命伤二:显存带宽被榨干](#4.2 致命伤二:显存带宽被榨干)
[4.3 致命伤三:KV Cache 占显存](#4.3 致命伤三:KV Cache 占显存)
[五、多轮对话:AI 是怎么"记住"你的](#五、多轮对话:AI 是怎么"记住"你的)
[5.1 为什么需要多轮对话](#5.1 为什么需要多轮对话)
[5.2 上下文超限:AI 也会"失忆"](#5.2 上下文超限:AI 也会"失忆")
[5.3 推理效率:长对话为什么又慢又贵](#5.3 推理效率:长对话为什么又慢又贵)
[5.4 模型能力局限:中间遗忘](#5.4 模型能力局限:中间遗忘)
一、大模型是怎么"蹦"出回答的:逐字预测
核心原理一句话:给定前文,计算下一个最可能出现的词是什么。

1.1 选词不是"猜一个",而是"按概率抽一个"
模型决定下一个 Token 的完整机制:
基于前文,算出词表里所有 Token 的概率分布,再用采样策略选出一个。
类比:像玩文字接龙。你写"今天天气真",正常人会接"好",但也可能接"棒""不错"。模型做的是同一件事------给每个候选词一个概率,再按概率挑一个。
1.2 完整过程
用户输入"中国的首都是哪里?":
| 轮次 | 模型"看到"的内容 | 预测下一个 |
|---|---|---|
| 1 | 中国的首都是哪里? | 北 |
| 2 | 中国的首都是哪里?北 | 京 |
| 3 | 中国的首都是哪里?北京 | 是 |
| ... | 不断拼接 | ... |
| 最后 | ...北京是... | <终止符> |
每预测出一个 Token,就拼到后面当新的输入,继续预测下一个,直到碰到终止符。
注意:终止符因模型而异------DeepSeek 默认的是
<|end▁of▁sentence|>,别家模型可能不同。
1.3 自回归生成
定义 :这种"用自己刚生成的,作为预测下一个的依据,像滚雪球一样一步接一步往外推"的方式,叫自回归生成(Autoregressive Generation)。
它是当前所有主流大模型(GPT 系)的工作方式。
二、Token 是什么:AI 眼中的最小语言单位
定义 :Token(词元)是大语言模型理解和处理文本的最小基本单位。
类比 :人读书要"断句"------"我爱大模型开发"会断成"我/爱/大模型/开发"再理解。AI 也一样,它不读完整句子,而是把句子拆成一个个 Token 来理解。这个"断句"过程叫分词(Tokenization)。

2.1 切分形态
| 形态 | 例子 |
|---|---|
| 完整单词 | Hello = 1 个 Token |
| 单词的一部分 | unbelievable = un / believe / able(3 个 Token) |
| 标点 | 逗号、句号、感叹号通常各占 1 个 Token |
| 中文 | 1 个汉字通常占 1~2 个 Token(视词频) |
不同厂商分词器不同,同一句话切出的 Token 可能不一样------就像有人把句子断成"大/模型",有人断成"大模型"。
2.2 为什么需要 Token
原因一:数字化,让机器能听懂
计算机只能处理数字。把文本变成数字要两步:
| 步骤 | 做什么 | 关键点 |
|---|---|---|
| ① 切分编号 | 把文本拆成 Token,每个分配整数 ID | ID 只是代号,没有大小含义------891 不比 432"更开心",直接拿 ID 做加减法毫无意义 |
| ② 映射向量 | 把每个 ID 映射成一串高维浮点数(向量) | 语义越近,向量在空间里越近:happy 和 glad 的向量距离很近 |
原因二:解决"词汇爆炸"问题
| 切法 | 问题 |
|---|---|
| 按字母切 | 太细,序列巨长,算力平方级增长,效率极低 |
| 按单词切 | 词表爆炸(英语几十万词+派生词),新造词没法处理 |
| 折中:子词(BPE) | 词表适中,又能拼出任意新词 |
主流 Tokenizer(BPE、SentencePiece)把文本切成"介于字和词之间"的子词单元------所以 unbelievable 被切成 un/believe/able。
三、词表:模型只能在"认识的词"里选
定义 :词表(Vocabulary)是模型预定义的一个映射字典,包含模型"认识"的所有 Token,每个 Token 对应一个唯一数字 ID。
类比 :一本"模型专用字典"。LLM 本质是数学函数(输入数字、输出数字),词表就是连接"人类语言"和"模型数字世界"的桥梁。

3.1 生成范围
- 模型不能生成词表之外的 Token ,但可以组合 词表里的 Token 拼出新词
- 例:un + believe + able → "unbelievable"
- 词表大小是固定的(如 GPT-2 是 50,257),模型永远不可能输出编号 50,258
- 代价 :词表里有的词,1 个 Token 就输出;没有的"新词",可能要 5~10 个 Token
- 这就是为什么处理冷门专业术语或罕见语言时,LLM 又慢又贵
3.2 字节级回退:一个字符都不漏
问题:词表里没有 😊 这个表情怎么办?
| 方案 | 做法 | 结局 |
|---|---|---|
| 传统分词器 | 直接抛"未知"标记 UNK | 模型看不懂,两眼一抹黑 |
| Byte-fallback | 把 😊 按 UTF-8 拆成 4 个字节,每个字节映射一个专用字节 Token | 表情被切成 4 个 Token 正常送入模型 |
为什么说它精妙? 对比历史方案:
| 方案 | 问题 |
|---|---|
| 纯字节级 BPE(GPT-2 早期) | 词表只有 256 字节,apple 占 5 个 Token、中文"苹果"占 6 个,上下文窗口被迅速吃满 |
| Byte-fallback | 完美结合:正常词用大 Token 保效率,生僻字/Emoji 降级到字节保鲁棒,100% 不漏字符 |
四、为什么输出比输入贵
同样长度的内容,模型"写出来"比"读进去"贵得多。原因藏在两个阶段的本质差异里,课件总结了三个"致命伤"。
4.1 致命伤一:算力闲置
| 阶段 | 怎么算 | 特点 |
|---|---|---|
| 输入(Prefill) | 1000 个 Token 打包成大矩阵,一次算完 | GPU 满载,利用率近 100%,但 0.1 秒干完 |
| 输出(Decode) | 每次只算 1 个 Token,还得搬出前面 1000 个缓存做计算 | GPU 闲置约 95%,生成 1000 Token 要串行跑 1000 步 |
类比 :输入像满载货车走高速 (费油但跑得快);输出像市区堵车(不费油但耗时极长)。出租车按打表收费,堵车当然更贵。
搬砖类比:盖房子要 1000 块砖------
- 输入:1000 个工人同时搬,1 轮搞定
- 输出:只有 1 个工人(下一个词依赖上一个),来回搬 1000 趟,而且搬得越多、每趟还要清点前面搬过的砖(KV Cache 越来越大),越走越慢
4.2 致命伤二:显存带宽被榨干
- 输入:消耗计算单元,这是 GPU 强项
- 输出:瓶颈变成显存搬运速度(Memory Bound)------每算一个新 Token,要把缓存里几千个 K 向量从显存搬到缓存
- 显存带宽是 GPU 最稀缺的资源之一(如 H100 带宽 3.35TB/s),输出阶段疯狂搬运,直接把带宽打满
4.3 致命伤三:KV Cache 占显存
| 阶段 | 显存占用 |
|---|---|
| 输入 | 算完就释放,不占地方 |
| 输出 | 每生成一个 Token,它的 K/V 就永久追加进显存,直到对话结束 |
- 生成 1000 Token = 占 1000 份显存空间
- 对云厂商:显存 = 钱。一张 A100 只有 80GB,一个用户生成长文本占了 40GB,这张卡能同时服务的用户就急剧减少
结论:不是厂商"黑",是输出阶段的计算方式(串行 + 高缓存 + 占显存)天然决定了它更贵。
五、多轮对话:AI 是怎么"记住"你的
先泼冷水:大模型本身没有记忆。
核心事实:LLM 本质是"无状态(Stateless)"的------模型处理每条指令时,默认并不知道你之前说过什么。你换个新会话,它连你叫什么都不记得。
那多轮对话怎么实现的? 靠应用层模拟:把历史对话记录连同当前新问题一起,重新打包发给模型。所谓"记住",其实是每次请求都把之前的话再发一遍。
类比:像你每次找同事帮忙,都得把前因后果重新讲一遍------不是同事记性好,是你每次都把背景带上了。

5.1 为什么需要多轮对话
| 原因 | 说明 | 例子 |
|---|---|---|
| 上下文依赖 | 语境是理解代词/隐喻的关键 | 先问"龙是什么",再问"它的头像什么" |
| 复杂问题逐步清晰 | 用户不会一次说清所有信息 | 看病:先"我头痛",再一步步补充 |
| 纠错与对齐 | 给用户机会纠正模型的错 | 模型说错刊物,用户纠正后它改对 |
5.2 上下文超限:AI 也会"失忆"
对话越长,历史 Token 越多,一旦超过上下文窗口上限(如 32K),最早的信息就被截断遗忘。
一个经典案例:你开头说"我对花生过敏",聊了 20 轮烘焙后,模型忘了这条,推荐了花生酱玛芬蛋糕。
解决思路:选择性记忆,而非全记住
| 方案 | 做法 |
|---|---|
| 对话摘要 | 超长后把旧对话压缩成简短摘要,之后基于摘要继续 |
| 滑动窗口 | 只保留最近 N 轮,更早的一刀切掉 |
| RAG 检索 | 把历史存入向量库,按需检索相关片段(后篇专讲) |
5.2.1 对话摘要

5.2.2 滑动窗口

5.2.3 RAG检索

5.3 推理效率:长对话为什么又慢又贵
每轮都要重新处理整个历史 → Token 消耗和延迟随轮次线性增长。
解决技术:
- 提示词缓存(KV Cache):缓存已算过的历史结果,每轮只算新内容(生产级服务都用)
- 上下文剪枝:移除对当前生成无用的历史 Token(比如删掉闲聊轮次,只留正题相关)
5.4 模型能力局限:中间遗忘
模型更容易记住上下文开头和结尾的信息,中间部分常被忽略------这就是"大海捞针"测试揭示的现象:关键信息藏在大量无关内容中间时,模型很难找到。
六、面试官追问
Q1:Token 怎么算费用?为什么充的钱一会儿就没了? A:计费按"输入 Token + 输出 Token"总和。输出 Token 单价更高(见第四节),长对话每轮都要把历史重新发给模型,Token 累积很快。所以同样的话,对话越长越费钱。
Q2:中文 1 个字 = 1 Token 吗? A:不一定。中文通常 1 个字 ≈ 1~2 个 Token,取决于切分和词频。常用字可能 1 个 Token,生僻字可能要拆成多个甚至触发字节级回退。精确数量用各家的 Tokenizer 工具可查。
Q3:上下文窗口为什么有限?塞满会怎样? A:因为注意力计算复杂度随长度平方增长,且 KV 缓存占显存、随长度线性增加。塞满后,超出部分会被截断(通常丢最前面的),模型就"忘了"早先的内容。(上下文窗口完整机制在系列后篇专门讲。)
Q4:大模型真的"记住"你说的话了吗?为什么换新会话它就不记得? A:没有真记忆。LLM 本质无状态,多轮对话是应用层把历史重新打包发给模型模拟出来的。换新会话=不带历史=它什么都不知道。所以"记忆"只是"把上下文带上"的假象,超长后连这个假象也会因截断而失效。
Q5:模型输出真的能"无中生有"吗?为什么生僻内容会更贵? A:模型只能从固定词表里选 Token,不能创造词表外的编号。词表里有的词 1 个 Token 就够;没有的新词/生僻字要拆成多个 Token,甚至触发字节级回退。Token 越多,计算越慢越贵------这就是冷门术语、罕见语言处理成本高的原因。
如果这篇让你看清了大模型"逐字接龙"的真相,欢迎点赞收藏。评论区聊聊:你知道 Token 要花钱后,有没有改变和 AI 聊天的方式?
