一句话进去,一句话出来。中间到底发生了什么?
把这个黑箱拆成零件,一个一个给你看。
你敲下的那行字,会在模型内部走过这么一条链路。注意最后那个回环箭头 —— 这是大模型和所有传统程序最不一样的地方:它一次只吐一个词,然后把自己吐出来的东西当输入,再来一遍。
模型不认识汉字、也不认识英文字母。它只认识编号。所以第一步,是把你的句子切成一堆小块(token),每块查一个编号(ID)。下面这个输入框可以直接改,实时看切分结果。
编号本身毫无意义 —— 编号 37 不比编号 12 更接近编号 9。所以模型给每个 token 配了一串长长的数字(词向量,通常 768~12288 维)。这串数字就是它在"语义空间"里的坐标。
下面是 token「猫」的向量前 24 维(真实模型有几千维,这里截取开头)。点下面的词切换。
把几千维压成 2 维看一眼(示意)。点任意一个点,看它跟谁最亲。
注意:下面两张图里的「苹果」是同一个 token、同一个 ID。但读完句子之后,它在模型内部的向量已经变成了两副样子 —— 因为注意力把上下文的含义加进了它自己。
两串数字的夹角约 66° —— 明显相关,但已经分开了。
夹角越小 = 方向越接近 = 语义越相似。两个「苹果」既没有完全重合(毕竟语境差太多),也没有彼此垂直(它们终究还是同一个词), 而是落在中间某个位置 —— 这就是"一词多义"在向量空间里的样子。
这是 Transformer 的心脏。核心动作只有一句话:每个词都去问其他所有词 ——「你跟我有多大关系?」 关系大的,信息就多拿一点。
① 点下面的任意一个词看它把注意力分给了谁;② 再点 H1~H8 切换不同的注意力头,看同一句话被拆解成多少种关系。全部可交互。
每个 token 会通过三次线性变换,变成三个不同的身份。这就是注意力的全部机关。
Q·Kᵀ → 算两两相关度 | ÷√d → 防止数值爆炸 | softmax → 变成加起来等于 1 的权重 | ×V → 按权重加权求和
这一步最常被跳过,但它是"多头"真正成立的关键。8 个头各算各的,每个只输出 64 维 —— 它们必须先拼接(concat)回 512 维, 再经过一个线性层 WO 做跨头混合,才得到这一层真正的输出。点按钮逐步看。
注意力做完之后,每个词的向量还要单独穿过一个两层的前馈网络:先升维 4 倍,过一遍非线性激活,再压回原维度。 它占了单层参数的三分之二,而且有一个很反直觉的性质 —— 它完全不看别的词。
一个 Transformer 块 = 多头注意力 + 前馈网络 + 残差连接。这种块被复制堆叠几十到上百层。信号从下往上穿过,每一层都在上一层的理解之上,再抽象一层。
上一节那两个计算(注意力、FFN)并不是首尾直接串起来的,中间夹着一条旁路。这条旁路叫残差连接, 它让每一层的输出变成 输入 + 变换结果,而不是替换输入。没有它,96 层根本训不起来。
最后一层输出是全词表每个词的"原始得分"(logits)。经过 softmax 变成概率后,就要做决定了。拖动下面的温度滑块 —— 概率分布会实时重算(真算,不是假的)。
上文:今天天气真 _
永远选概率最高的那个(贪心)。稳定、可复现,但容易死板、复读、创造力差。
按模型学到的真实分布采样。日常对话、通用写作的默认档位。
低概率词也被大幅抬升。更有创意,但也更容易跑偏、胡说。
温度决定"分布多平",这两者决定"留几个候选"。
| 策略 | 做法 | 效果 |
|---|---|---|
| Top-k | 只保留概率最高的 k 个(如 k=50),其余归零后重新归一化 | 简单粗暴地砍掉长尾垃圾词,但 k 固定,不适合"有时候只有 3 个合理候选"的场景 |
| Top-p(核采样) | 按概率从高到低累加,攒到 0.9(或 0.95)就停,只在这堆词里抽 | 候选池动态伸缩 —— 模型越确定,池子越小。目前最主流 |
| 重复惩罚 | 已出现过的词,logit 打折 | 压制复读机倾向,代价是可能回避必要的重复词 |
模型没有"先想好整句再吐出来"的能力。它一次只能决定一个 token,然后把刚吐的这个词接回输入末尾,重跑一遍整个网络,再决定下一个。
前面讲的都是"推理"(模型已训练完,在回答你)。而这些能力,是靠三个阶段一步步喂出来的。
拿互联网级别的海量文本(数万亿 token),做一件极简单的事:遮住下一个词,让它猜,猜错了调参数。这个动作重复几个月、几万张显卡。
基座模型只会"续写",你跟它说话它会继续编你的话。所以要拿几万到几十万条人类写好的(提问 → 优质回答)示范数据去教它:被问到时,该以助手的身份作答。
同一问题让模型生成多个回答,人类排序(A 比 B 好)。用这些偏好数据训练一个"奖励模型",再用强化学习(或更简单的 DPO 直接优化)让模型倾向于产出人类更喜欢的回答。
理解了前面的机制,幻觉就不再神秘 —— 它不是"故障",而是这套机制的必然副产品。
存的是事实条目。找到就返回,找不到就明说"没有结果"。
不会编造,因为它根本没有"生成"这个动作。
存的是语言的统计规律。它永远会输出一个"最像答案的文本",
哪怕正确答案并不存在 —— 因为它必须给一个概率分布。
| 手段 | 思路 |
|---|---|
| RAG 检索增强 | 先从可信文档里查出相关段落,塞进上下文,让模型"照着材料答"。把闭卷考试变成开卷考试 —— 目前性价比最高的方案 |
| 工具调用 | 算数交给计算器,查实时信息交给搜索 API。让模型只负责"决定调用什么"和"组织语言" |
| 思维链 CoT | 强制先输出推理过程再给结论。让深层网络多跑几轮,显著降低推理类错误 |
| 降低温度 | 事实类任务把 T 调到 0.1~0.3,牺牲多样性换稳定性 |
| 引用与校验 | 要求标注出处,再用另一个流程验证引用是否真实存在 |
| 环节 | 在干什么 | 一句话类比 |
|---|---|---|
| 分词 | 文字 → token ID 序列 | 把整句话拆成乐高积木 |
| 向量化 | token ID → 高维向量 | 给每块积木标上三维坐标 |
| 位置编码 | 注入顺序信息 | 给积木贴上"第几块"的标签 |
| 自注意力 | 每个词按相关度吸收上下文 | 开会时每个人听谁的发言 |
| 前馈网络 | 逐位置做非线性变换 | 每个人私下消化笔记 |
| 残差连接 | 输出 = 输入 + 变换 | 保证原始信息不会中途丢失 |
| 堆叠 N 层 | 反复抽象,层层深入 | 从认字 → 懂语法 → 悟意图 |
| 输出层 | 全词表 → logits → 概率 | 开出十几万个候选的赔率表 |
| 采样 | 温度 / Top-k / Top-p 挑一个 | 按赔率下注,未必押最热的 |
| 自回归 | 吐出的词接回输入,循环 | 写填空题,一次只填一格 |
| 预训练 | 海量文本上练"猜下一个词" | 读了整个图书馆 |
| SFT + RLHF | 学对话格式 + 对齐人类偏好 | 上岗培训 + 价值观校准 |