1. 先搞清楚一件事:预测下一个词,为什么等于“理解”
很多人第一次接触大语言模型(LLM)时,都会卡在一个奇怪的地方:训练目标不就是“根据前面的内容预测下一个词”吗?听起来像小学生做的填空题,怎么就能催生出写诗、编程、推理对话的能力?
我先抛一个反直觉的结论:预测下一个词这件事,比大多数人想象中“难得多”,也“深得多”。你平时以为的“预测下一个词”,是在一个完整句子里补最后一个空;而LLM实际做的,是在没有任何人类标注、没有任何规则约束的情况下,仅凭海量文本的统计规律,去猜一个高维空间里最合理的下一个片段。这个任务本身,就逼迫模型在“字面预测”之外,顺带学会语法、常识、逻辑链条甚至隐含意图。
打个比方。三岁的孩子背下了一整座图书馆的书,你随便翻开一页读前半句,他能一字不差接出后半句。这时你会说他只是死记硬背。但问题来了——当这座图书馆里有数学书、编程手册、医学论文、小说剧本,而孩子不仅仅能接“前半句”,还能根据你随口给的从未出现过的开头,续写出合乎语法、逻辑自洽、甚至带点风格的段落时,你还能简单地说这是“背”吗?
深度学习这几年反复上演同一件事:很多我们以为是“高级智能”的能力,其实是“大量简单计算 + 海量数据 + 足够大的模型”涌现出来的副产品。预测下一个词,就是这个“简单计算”。而LLM的智能,是在这个简单目标驱动下,整个网络结构被迫学出的一套“关于世界的压缩表示”。
这篇文章想做的,是把这条路径完整拆开:从文本怎么变成数字,到Transformer为什么能处理长距离依赖,到训练的两段式炼丹,再到推理时温度、上下文窗口这些参数到底在干什么。适合三类读者:完全零基础但好奇大模型为什么“懂人话”的朋友;调过API但没搞懂底层逻辑的开发者;以及想系统梳理知识体系的AI爱好者。
2. 从文本到数字:词元(Token)与词嵌入,大模型眼中的世界长什么样
2.1 模型不读字,它读“词元”
神经网络不能直接吃字符串,所有进入模型的内容都必须变成数字。但LLM并不是一个字一个字读的,而是先把文本切成一串“词元(Token)”。
这个切割逻辑很多人会误解,以为Token就是“词”。其实Token是“比词更碎、比字更整”的单位。英文里,“unbelievable”可能被切成“un”、“believ”、“able”三段;中文里,一个汉字通常就是一到两个Token,常用词可能整体是一个Token。ChatGPT当年有个著名的“陷阱”:让它数“strawberry里有几个r”,它容易数错,就是因为strawberry在词元化时被切成了整块或半块,模型根本看不到单个字母。
tokenization这一步看似简单,却决定了后续一切效果的边界。它像一个乐高积木的切分方案:切得太粗,模型学不到字符级规律,拼不出没见过的词;切得太细,序列长度暴涨,算力成本翻倍。工业界普遍用**BPE(字节对编码)**这类算法,先统计语料里最高频的字符组合,逐步合并成子词单元,最后形成一个几千到几万大小的词元表。
实操提示:你写prompt时的一句话,实际进入模型的可能是几十个Token。国内很多平台按Token计费,但“一个汉字≈1到2个Token”和“一个英文单词≈1到2个Token”的换算关系不是严格的,批量处理前最好先用平台的tokenizer工具数一下。
2.2 词嵌入:每个词元,被映射到一个高维空间
词元ID只是一个编号,比如“猫”是3286,“狗”是5411。但编号本身没有含义,模型还需要把这些ID变成“携带语义信息”的向量,这就是词嵌入(word embedding)。
这一步的关键在于:每个词元被映射成一个几百上千维的稠密向量,向量里每一个数字都是可训练的。训练完成之后,这个高维空间会出现一个奇妙的结构——语义相近的词,向量距离也近;“国王”的向量减去“男人”的向量,加上“女人”的向量,结果非常接近“王后”的向量。这就是著名的“语义三角形”现象,也是为什么词嵌入后来成了整个深度学习的基础设施。
我常跟初学者说:理解词嵌入,就把高维空间想象成一个城市地图,每个词是一座地标建筑。训练过程就是在反复调整这些建筑的位置,最终让“动词”“食物”“科技”各自街区——同类聚在一起,相关概念之间还能通过“向量加减”走出有意义的路径。
2.3 为什么“词的排列顺序”能变成“世界的运行规律”
模型读进去的,可能是一整段几百个词元的序列,每一个词元都对应一个嵌入向量。然后这些向量按顺序排成一个矩阵,送入后续的Transformer层。接下来的核心命题是:这个矩阵里,单个词是“静态的”,但它们拼接起来的整体,却携带了上下文信息。
你可以把每层网络想象成“让每个词元反复听取其他词元汇报”的会议流程。每个词元在每层都被更新、被充实,逐渐从一个“孤立的词义”变成“在具体语境中携带具体角色”的表示。比如“苹果”这个词,当它和“手机”“系统”放在一起时,经过几层网络后,它在高维空间里的位置会明显偏向“科技公司”;和“香蕉”“水果”放在一起时,则偏向“水果”。这就是上下文对词义的动态修正,也是后续一切语言能力的根基。
因此在LLM内部,训练的最终产物不只是一个“会猜词的机器”,而是一套把词与词之间、概念与概念之间的统计关系,压缩到数以亿计的参数里的“世界模型”。这个压缩并不完美,但它的存在,就是智能对话的基础。
3. Transformer的招牌菜:注意力机制,让模型学会“读一句、想一句”
3.1 为什么要特地设计一个新架构
在Transformer之前,主流序列模型是RNN/LSTM。它们的思路很朴素:一个词一个词地读,用一个“隐藏状态”把前面所有信息一笔一笔记在小本子上。问题是小本子的容量有限,读到第1000个词时,第2个词的信息早就被冲淡得没影了。长文本处理一直是个老大难。
后来团队想出一个更直接的方案:不要试图“压缩记忆”,干脆让序列里每个词元都能直接访问所有其他词元的信息。这就像大家不再靠一个人复述会议内容,而是所有人手里都有一份完整通讯录,随时按需打电话。这个机制就是注意力(Attention)。
3.2 注意力在数学上做了什么
注意力机制的具体计算路径,我拆成人话版本:
- 每个词元生成三个向量:Query(我想找什么)、Key(我能提供什么)、Value(我实际给出的内容)。
- 用Query和所有Key做点积,算出相关度分数,再经过Softmax归一化成权重。
- 用这些权重去加权求和所有Value,得到这个词元“整合全局信息后”的新表示。
“Query-Key-Value”这组词来自数据库检索,你可以这样理解:你在机场大厅想知道“去三号航站楼怎么走”,这就是你的Query;每个路标的标题就是Key;路标上写的详细指引就是Value。你和路标标题做相似度匹配,匹配度高的路标内容,会被你重点参考。
这里有一个反直觉但极其重要的细节:为什么点积能衡量“相关度”?两个向量的点积,本质上是比较它们在方向上是否一致。方向越接近,点积越大。在经训练后嵌入的高维空间里,“方向接近”往往意味着语义相关,因此点积就成了一个廉价而有效的匹配方式。
Transformer的实际计算不是逐词循环,而是把整段序列打包成矩阵,一次算出所有位置之间的注意力权重图。这个矩阵里,“这”和“句”挨得近,“主语”和“谓语”之间有强关联,长距离的“虽然”和“但是”也能形成一条清晰的高权重连线。
3.3 多头注意力、位置编码和残差连接
如果只做一次注意力,模型对关系的刻画太“单线程”了。所以Transformer用多头注意力:把嵌入维度切成若干个子空间,每个头独立做一次注意力,捕获不同层面的关系——有的关注语法邻近,有的关注指代关系,有的关注全局主题。最后把所有头的结果拼起来,再线性变换一次。这正是Transformer被称为“多头”的原因:相当于同时开了好几条专线,从不同角度审视同一段话。
但也别忽略一个看似琐碎的问题:既然注意力计算是对所有位置两两交互,它本身根本不区分顺序,“我喜欢你”和“你喜欢我”在模型眼里完全一样。所以必须在输入向量上额外叠加位置编码,告诉模型每个词元处在第几个位置。早期用的是正弦函数族,后来很多模型改用可学习的位置向量或旋转位置编码,目的都是让“词序”信息真正参与计算。
残差连接和层归一化则是训练稳定性的保障。前者让梯度能直接流过深层网络,避免深层次训练退化;后者约束每层输出的数值范围,防止激活值剧烈波动导致收敛失败。这两个机制在工程上极其重要,很多初学Transformer的人会忽略它们,等到自己训练模型时却发现怎么都训不动。
一句话总结Transformer的工程价值:它让“任意两个词元之间的相互影响”只需要一步计算,而不是像RNN那样需要跨越所有中间词元。这种结构上的优势,直接让大模型可以吃下海量数据、做超深网络,也是“大力出奇迹”能够成立的结构前提。
4. 训练过程:从“胡乱造句”到“言之有物”的两段式炼丹
4.1 预训练:让模型“背”下整座互联网
LLM训练的第一阶段叫预训练。数据是海量的、未经人工标注的文本——网页、书籍、论文、代码、论坛帖子,几乎是一切能下载到的公开文本,体量动辄万亿Token级别。
任务是那个看似简单的“预测下一个词”。模型读一段文本的前面部分,输出一个对下一个词元的概率分布,然后和真实的下一个词元对比,计算损失,反向传播更新所有参数。这个过程重复几十万步之后,模型学到的不再是“高频词搭配”,而是越学越深的语法结构、知识关联和逻辑模式。
我经常用一个“炼丹”的类比:预训练就是先用大火把一锅食材煮沸、煮透。这个阶段决定模型的“知识底座”和“语言能力”。但光有这个底座,模型只能模仿文本风格,还远远不能“回答问题”。你问它“北京的秋天适合做什么”,它最自然的反应可能是接着写一段散文,而不是给你列三个推荐地点。原因也很简单——它学的任务就是“续写”,而不是“问答”。
4.2 指令微调:从“会接话”到“会回答问题”
第二阶段叫指令微调,也叫监督微调(SFT)。做法是人工编写大量“用户问题–理想回答”配对数据,让模型在这些配对上继续训练一小段时间。
这一阶段的本质,是把“续写模型”改造成“助手模型”。模型在预训练时已经掌握了海量知识,只是不知道“用户想要什么形式的回答”;指令微调等于给它一套“交互礼仪”:如果是问句,就给出结构化回答;如果是命令,就执行相应动作;如果信息不足,就承认不知道。
微调数据里通常还会加入思考链(Chain of Thought)类型的样本:先展示推理步骤,再给出答案。这让模型学会在回答复杂问题时“一步一步想”,而不是直接蹦结论。很多人以为思考链是模型“自动涌现”的能力,其实一部分是这类数据教出来的。
4.3 对齐与偏好优化:让回答更像“人话”、更有“分寸”
到了第三阶段,事情变得微妙起来。指令微调解决了“形式问题”,但模型仍然可能输出有害、偏激、废话连篇的内容。于是引入基于人类反馈的强化学习(RLHF)或其变体。
流程大致是:先用微调模型生成多个回答,让人类标注员(或AI打分模型)给回答排序,训练出一个“奖励模型”来模拟人类偏好;再用强化学习去更新生成模型,让它学会“讨好”奖励模型。其核心是让模型学会在多个合理回答中,选出人类更喜欢、更安全、更有条理的那一个。
这个阶段还催生了一些工程变体,比如直接偏好优化(DPO),思路更直接:让模型在“被偏好的回答”和“未被偏好的回答”之间拉开差距,不再需要单独训练奖励模型,实现更简单、训练更稳定。
三段式训练,总给人一种“三层楼”的既视感:预训练决定模型“懂多少”,指令微调决定模型“会答不问”,偏好对齐决定模型“答得多招人喜欢”。这也是为什么市面上很多开源模型“什么都知道”,但用起来体验糟糕——它们可能跳过或弱化了第三阶段,底层数据量很足,却输出不够得体。
4.4 一张表说清各阶段的差别
| 阶段 | 数据形态 | 训练目标 | 模型学到了什么 |
|---|---|---|---|
| 预训练 | 海量无标注文本 | 预测下一个词元 | 语法、知识、推理模式的底座 |
| 指令微调 | 问题-答案配对 | 根据指令输出规范回答 | 理解指令、组织回答的形式能力 |
| RLHF/DPO | 回答排序/成对偏好 | 提升人类偏好度 | 安全合规、简洁、有用的表达风格 |
5. 推理阶段:温度、上下文窗口、幻觉,以及那些人人会遇到的实际问题
5.1 模型推理不是“查答案”,而是“掷骰子”
模型训练完成后,每次生成回答走的都是同一条路径:输入文本变成词元序列,经过几十层Transformer计算,最终在词元表上输出一个概率分布——每个候选词元都有个0到1之间的概率。然后“选哪个词”这件事,就交给了解码策略。
这里有个关键误解:LLM不是每次都会选概率最高的那个词。如果永远选概率最高的词,生成结果会变得单调、机械,并且容易陷入重复循环。实际推理时,一般会在概率分布上做采样,引入随机性,让生成结果更自然、更多样。
训练好的LLM只要你问同一个问题,输出是动态的,这根本不是“bug”,而是采样机制作用的结果。
5.2 温度参数,到底在调什么
温度(temperature)是控制随机性最常用的旋钮。它不改变概率分布的排序,只改变分布的“陡峭程度”:
- 温度趋近0,分布变得极端尖锐,几乎总是选中最大概率的词,输出稳定、准确,适合代码和数学题。
- 温度调高(比如0.8~1.0),分布被拉平,低概率的词也有机会被选中,输出更有创造性,但也更容易偏离事实。
生活化理解:温度像一个“创意旋钮”,调低了模型是严谨的学者,调高了模型是放飞自我的诗人。实操建议是写SQL、查代码时用0~0.3,做内容综述或头脑风暴时用0.7左右,写故事或营销文案可以尝试0.9。
和温度经常搭配出现的还有Top-p(核采样):每次只从“累计概率达到p的最小子集”里采样,p设为0.9时,模型会忽略那些尾巴上概率极低的怪词,保证了多样性同时又不会语无伦次。我通常建议两个参数搭配使用,而不是只调一个:先选一个合适的Top-p固定,再慢慢微调温度。
5.3 上下文窗口,是一把双刃剑
上下文窗口决定了模型一次能“看到”多少Token。早期GPT-2只有1024个Token,如今很多模型已经到了128K甚至200K。窗口越大,模型能处理的长文档、长对话就越多,这当然是好事。但这里有两个常被忽略的坑:
第一,窗口并不等于有效记忆长度。注意力机制对所有位置两两计算,位置相距越远,信息的传递路径越长,模型对远处信息的利用效率会显著下降。业内俗称“lost in the middle”现象:当关键信息恰好落在长文本的中间位置时,模型最容易“看漏”,而开头和结尾的信息反而更容易被记住。所以构造长文本提示词时,重要指令最好放在开头或结尾,别丢在中间。
第二,Token长度计费模型下,塞入超长上下文会迅速抬高成本,还会拖慢生成速度。实用做法是:在喂入大段资料前先做清洗,去掉无关内容,必要时先让模型对长文本做摘要,再把摘要作为上下文输入。
5.4 幻觉的来龙去脉
幻觉可以说是大模型目前最出名的缺点:一本正经地输出完全不存在的内容,甚至编造引用文献、虚构人物经历。幻觉的根源,我理解为一个“统计平滑”问题:训练数据里没有某个事实,但回答时对应的词元仍有nonzero概率被采样到。加上训练目标本来就是“生成最合理的文本”,而不是“验证信息真假”,所以模型天然更倾向于“流畅地编”,而不是“正确地答”。
处理幻觉的常规手段,从工程实践来看主要分三层:
- 提示词层:明确要求“不确定就回答不知道”,让模型给出信息来源或推理依据。
- 检索增强层:把大模型和外部知识库、搜索引擎结合,强制模型根据检索结果作答,而不是完全依赖参数记忆。
- 系统架构层:在生成流程中引入事实核查模块,对输出做二轮校验。
但最底线的认知必须是:LLM的本质是“文字接龙大师”,不是“数据库”。任何需要精确事实的场景,都不能只靠模型本身,必须加验证环节。
6. 写在最后:把LLM当人看,也别真把它当人看
说了这么多,最后聊点个人体会。
我调试模型这么久,最大的转变是:不再把LLM当成“一个无所不知的搜索引擎”,而是当成**“一个读过很多书、记忆力不太精确、但特别擅长组织语言的助手”**。它给出的每一个字都是“当前概率下最合理的续写”,不是“经过核实的事实”。理解了这一点,你就能解释为什么它既能在考试题上拿高分,又会一本正经地编造不存在的论文——这两件事其实来自同一个机制,没有矛盾。
对于想深入研究LLM的读者,我在实际学习中给出的建议顺序是:先用现成API多维度调试,观察温度、Top-p、System Prompt等等对输出的影响,建立直觉;然后读一两篇核心论文,理解Transformer的结构和训练过程;最后有条件的话,在自己的设备上微调一个小模型,哪怕是几千条数据、几百MB参数规模,这能让你对“训练”这件事产生完全不同的认识。
智能对话的奥秘,拆到最底层,也不过是“海量数据 + 大量参数 + 一个简单的预测目标”,再用三层训练把它的输出打磨得符合人类预期。真正迷人的地方在于:这个看似机械的过程,最终生成的模型竟然能跟人类进行如此流畅、细腻、有创造力的对话——仿佛有什么东西,在千亿参数之间悄悄醒了。
而你要做的,只是把它当成一个强大但不完美的工具,理解它的边界,用对它的脾气。