总有朋友在技术群里问我:LLM 到底是什么?多数人的第一反应是“一个很会聊天的 AI”,或者“一个能写代码的助手”。这个理解没错,但如果你真的想在自己项目里用好它,想在模型输出离谱时不抓瞎,就必须把“语言模型”这四个字背后的机制拆开看。这篇是“深入学习 LLM”系列的第一篇,我会带着大家把最底层的心智模型建立起来:LLM 到底在做什么、Transformer 为什么能统治这个时代、模型是怎么训练出来的、能力边界在哪里、以及落到现在工程里该怎么选型和评估。系列后续还会往下拆 token 细节、微调实操、RAG、多智能体等话题,这一篇先把“地基”打牢。
1. 先看透 LLM 的本质:它到底在做什么
1.1 语言模型的本义:给文字接龙打分
很多人以为 LLM 是一个“装着海量知识的数据库”,模型回答问题时在数据库里查答案。这个印象大错特错。严格来说,大语言模型的核心是一个概率模型:给定一段已经存在的文字,它计算“下一个词是什么”的概率分布。
举个例子,给出“今天天气真”,模型计算概率时会认为“好”的概率很高,“坏”也有可能,“桌子”的概率极低。生成回答的过程,本质上就是一次次的“接龙”——每次预测一个词,把预测结果拼到已有内容后面,再继续预测下一个词,循环往复。
这听起来简单,但所有神奇的现象都源自这个机制。模型能写文章、能写代码、能做推理,都是因为它在海量文本上把“接龙”这件事练到了极致:它学会了“人类语言里,哪些词经常跟哪些词一起出现”的统计规律,而这些统计规律在足够复杂时,外化成了语法能力、知识记忆、甚至逻辑推理的表象。
1.2 Token 化:模型看到的世界和你不一样
“接龙”的单位不是“字”,也不是“词”,而是 token。Token 是模型处理文本的最小单位,可以理解成一种“半词半字”的碎片化表示。不同分词策略会导致同样一段文本被切成不同 token:Hello World可能被切成两个 token,大模型可能被切成“大”“模型”两个 token,也可能被切成“大”“模”“型”三个 token。
这带来一个实际影响:你买到的上下文窗口,是按 token 数计费的,而不是按字数。一个 8K 上下文的模型,不等于能处理 8000 个汉字。英文场景下 1 个 token 大约对应 0.75 个单词;中文场景下 1 个汉字通常占 1 到 2 个 token。我在实际项目里经常看到新人算错成本:明明觉得“我就问了 3000 字的文档,怎么就说超长了”,一查 token 数,中文直接翻倍。
理解 token 化是工程第一课。做长文本分析时,先估算输入内容的 token 量级,再决定用什么模型、是否要分块、是否要压缩摘要,否则后续所有环节都会踩坑。
1.3 概率与随机性:为什么同一个问题会得到不同答案
既然模型输出的是“下一个 token 的概率分布”,那么“选哪个 token”就有两种策略:一种叫贪心解码,永远选概率最高的那个;另一种叫采样,按概率分布随机抽一个。
实际 API 里的temperature参数控制的就是这个随机性。温度越低,输出越接近“最确定的答案”,适合代码生成、JSON 输出这类需要稳定性的场景;温度越高,越容易出现意外但更有创意的表达,适合文案、头脑风暴。工程上还有个容易被忽略的参数叫top_p,它限制只在累积概率超过阈值的 token 里采样,两者配合才能把“随机性”控制到合适范围。
这也带来了大模型落地时的一个核心难题:模型不是确定性的。同一段 prompt 可能得到不同结果,单测、断言、回归测试的传统经验在这里全被打破,后面我会专门聊评估问题。
2. Transformer 架构:为什么偏偏是它统治了大模型时代
2.1 从 RNN 到 Attention:记住顺序不如看见全貌
在 Transformer 之前,主流的序列模型是 RNN(循环神经网络)和 LSTM。它们的核心思路是按顺序读入句子,每一步把“当前词 + 之前的记忆”压缩成一个状态,传给下一步。
这个思路想象起来很直观,类比一下:你一边走一边复述沿途看到的招牌,走十步还能记得前面三家店,走到第一百步时,第一家的招牌早就模糊了。RNN 的问题正是如此:越靠前的信息经过越多步传递,就越容易被稀释、遗忘,这被称为长距离依赖问题。一旦句子长一点,或者需要关联前后隔得很远的信息,RNN 就显得力不从心。
Transformer 换了一个思路:我不按顺序一步一步读,而是让每一个词都能直接“看到”句子里的所有词,一次性建立全量关联。这个设计思路来自 2017 年的论文 Attention Is All You Need,它用自注意力机制替代了循环结构。你可以理解为:模型刚开始看一个句子时,每个词都可以自由地决定“我要多关注哪些其他词”,关注的方式是给每个词对打一个相关性分数,然后按分数加权融合信息。这个过程可以并行计算,也就为后来用海量 GPU 训练超大模型铺平了道路。
2.2 Self-Attention 的直觉:Query、Key、Value 是怎么配合的
自注意力机制内部有 Query(查询)、Key(键)、Value(值)三个角色。很多人第一次接触这几个词会觉得抽象,我用档案室查询做类比:你去档案室找资料,手上有一张需求单(Query);每份档案盒侧面贴着标签(Key);档案盒里装着正文(Value)。你要做的事情是:拿需求单去和所有档案标签比对,算出每份档案的相关性,然后按相关性把各档案正文加权汇总。相关性高的档案,在最终结果里占的比重就大。
对应到句子里,每个词都会发出自己的 Query,去和所有词的 Key 求相似度,再用算出的权重去加权其它词的 Value。这样每个词在编码时就已经把“该看谁”的信息融合进自己的表示。句子里的“它”会自动更关注前面的人名而不是旁边的桌子,这种关联能力让模型对语义的理解远超老一代 RNN。
多头注意力则是把刚才这套查询过程重复多次,每次用不同的投影空间,相当于多个领域的专家同时各看各的:一个头关注语法关系,一个头关注指代关系,一个头关注语义相似性,最后把多组结果拼在一起。这也是为什么 Transformer 能同时处理语言中多层面的复杂规律。
实际项目里你不会直接操作这些内部参数,但理解这一层很关键:模型是“全局关联”的,信息是否被用到,取决于注意力权重的高低,而不是“存在某个记忆卡槽里”。这也直接影响后面要聊的上下文窗口问题。
2.3 预训练:在语料里做接龙,到底让模型学到了什么
Transformer 只是模型骨架,它的能力来自预训练:把海量文本喂进去,让模型反复做“预测下一个 token”。主流 LLM 的预训练语料是万亿 token 级别的网页、书籍、代码库、论文等公开数据。这个阶段的主任务是训练损失(loss)不断下降,即预测准确率不断提高。
为了预测准确,模型被迫做很多事情:要记住词的搭配习惯,于是学到了语法;要理解指代关系,于是学到了句法结构;要回答常识问题,于是学到了世界知识;要跟上下文保持一致,于是学到了推理模式。这些能力不是有人刻意教它的,而是“为了预测下一个词而不得不学会”的副产品。
这里有一个重要认知:模型并不是在“背诵数据库”。你问它“法国首都在哪里”,它能答出“巴黎”,不是因为它存了一条“法国首都=巴黎”的记录,而是因为它的参数统计规律里,“法国”和“首都”跟“巴黎”存在强相关,接龙时最自然的词就是它。这个区别在讲幻觉时很关键:当模型遇到一个没见过、或训练语料里矛盾的信息时,它不会说“我不知道”,而是会按照统计规律硬编出一个“最像样”的答案。
3. 训练一台 LLM:从海量文本到“会聊天”的完整链路
3.1 预训练阶段:规模化法则的代价
从零训练一个大模型,第一步是预训练,选好架构后用海量文本数据跑非常长的时间。OpenAI 的 Scaling Law 研究给行业一个核心结论:模型能力大致随参数量、数据量、计算量的同步增长而稳定提升,没有明显的“捷径”。
但这条路代价极高。以 70B 级别模型为例,哪怕在数千张高性能 GPU 上训练,也要跑几十天,电费和算力成本以千万美元计。这决定了绝大多数团队没有能力训自己的底座模型,现实做法都是基于已有预训练模型做适配。如果你听到某个中小团队说“我们训练了自己的大模型”,大概率是指基于开源底座做了微调,而不是从零预训练。
预训练阶段的目标很纯粹:让模型见足够多的文本模式,把基础语言能力练出来。它是大模型的“原始大脑”,但此时它还不会“好好说话”——你给它一段话,它只会本能地续写,而不是顺着你的指令回答。
3.2 SFT:教模型“好好回答问题”
指令微调(Supervised Fine-Tuning,SFT)是解决“只会续写”问题的关键步骤。做法是准备一大批“指令+期望回答”的数据对,让模型在这些样本上继续训练,学会把输入映射成符合预期的输出。
SFT 的数据从哪来?除了人工标注,很多团队会用自己的业务数据来构造,比如客服聊天记录、工单处理记录、项目文档问答对。热搜里提到的“使用聊天记录模型精调 LLM”就是这个思路:把真实对话整理成指令格式,让模型学习特定场景下的话术和逻辑。这是当前企业微调最常见的路径,成本相对可控,效果却立竿见影。
做 SFT 有一个容易犯的错误:数据量盲目求大。我见过有人整理了几百万条对话做微调,结果模型学了一堆互相矛盾的回答,效果反而不如精心清洗过的 5 万条。指令数据更看质量,要保证示例多样性、回答准确性、格式一致性。数据里如果带了偏差,模型放大偏差的能力会让你头疼。
3.3 RLHF:用“人类的偏好”做最终对齐
SFT 能让模型学会“按指令回答”,但“按指令回答”和“回答得好、让人满意”还有很大距离。RLHF(基于人类反馈的强化学习)就是为了弥合这个差距。
RLHF 分两个核心环节。第一步训练一个奖励模型:让人类对同一个问题的多个模型回答打分排序,比如“回答 A 比回答 B 更好”,奖励模型从这个偏好数据里学会“什么样的回答更能被人接受”。第二步是用强化学习优化策略:让 LLM 生成回答,奖励模型给它打分,模型根据分数调整自己的策略,目标是让输出越来越符合人类偏好。
实际效果上,RLHF 让模型更愿意承认自己不知道、更少输出冒犯性内容、回答结构更清晰。但它不是万能的,对齐过度也会让模型变得保守、模板化。多数开源模型只做了 SFT 没有充分 RLHF,所以你会觉得“商用 API 模型好像更聪明、更有礼貌”,这个差异很多时候就来自 RLHF 的投入程度。
4. LLM 的边界:为什么有些任务它很行,有些任务它很笨
4.1 幻觉的根源:“续写”不是“查证”
幻觉是 LLM 落地时最让人头疼的问题:模型一本正经地编造一个不存在的事实,还说得像真的一样。很多人的第一反应是“模型是不是坏掉了”,其实不是故障,而是机制的必然结果。
我在前面强调过,模型做的是“按统计规律续写最合理的下一个词”,而不是“在知识库检索事实”。当它遇到一个训练数据里覆盖不足的问题时,它没有“自知之明”,也不会停下来,而是继续输出一个概率上最自然的回答。这个回答在语法上完美、在语气上可信,唯独在事实上是错的。
所以 RAG(检索增强生成)会成为大模型落地的标配方案:在让模型回答之前,先从外部知识库检索相关文档片段,把片段拼进 prompt,模型基于这些片段做续写。这样答案的“事实来源”不再靠模型记忆,而是靠检索结果,幻觉概率大幅下降。工程上一定要记住:别指望靠换模型或加提示词彻底消除幻觉,检索和校验才是正道。
4.2 上下文窗口的真相:不是“记忆容量”,是“注意力预算”
厂商宣传的“200K 上下文”“1M 上下文”看起来很唬人,但实际体验往往没有宣称的那么神。把一万页文档放进上下文,模型确实“看到”了所有文字,但注意力机制是有预算的:窗口越长,模型对中间部分的关注会被稀释得越厉害。
研究里有个现象叫 “lost in the middle”:当需要的信息位于长文本中间位置时,模型的召回率明显下降;放在开头或结尾则好很多。原因是自注意力会对所有位置做加权,中间部分的 token 同时受前后大量信息干扰,容易被“平均”掉。
工程对策很简单:不要迷信长上下文。要么把关键信息放到 prompt 的开头和结尾,要么对长文档做分段检索,只把相关段落放进上下文。长文本场景下,我倾向于先用一次模型调用做摘要压缩,再基于摘要回答,比硬塞原始全文靠谱得多。
4.3 典型反模式:数据库、计算器、裁决者,都不该让 LLM 当
我在实际评审项目时,经常看到几种错误的用法,这里集中列一下:
| 反模式 | 错误示例 | 正确做法 |
|---|---|---|
| 当数据库 | 问模型“某公司上季度营收是多少” | 用结构化查询取数,模型只负责把数据转成自然语言 |
| 当计算器 | 让模型精确计算 347 乘以 891 | 调用代码解释器按时执行计算,再让模型组织回答文本 |
| 当裁决者 | 让模型判断两条日志的时间先后 | 用程序解析时间戳排序,模型不参与逻辑判断 |
| 当真理来源 | 让模型判断论文观点的真伪 | 检索原始文献,模型只做归纳总结 |
这些反模式的共同点是:把模型擅长的“语言生成”任务,错误地当成了“精确计算/确定性查询”任务。模型可以帮你写 SQL,但不应该替你执行数据库查询;模型可以帮你写计算代码,但不应该直接给出算术答案。给模型的角色永远是“生成”“整理”“改写”,真正要精确的判断交给传统程序和系统。
5. 实际工程中的 LLM:从 API 到本地部署的选型思考
5.1 接云 API 还是跑开源模型
做 LLM 应用的第一步选型往往是:调用商用模型的云 API,还是自己部署开源模型。这个决策要结合四个维度来看:
第一是成本。API 按 token 计费,调用量大了每个月的账单会很可观;自己部署则需要考虑 GPU 服务器成本和运维成本。第二是隐私合规。业务数据如果涉及用户隐私或企业机密,把数据发给第三方 API 会有风险,本地部署反而是合规的选择。第三是延迟。API 受网络影响,一次请求百毫秒到几秒不等;本地部署在小模型上能做到更快,但大模型推理也可能更慢。第四是可控性。自己部署可以微调、可以改采样参数、可以离线运行,但也要自己承担稳定性责任。
我的建议是:快速验证 Idea 用云 API,验证通过后如果数据敏感、调用量大、或者需要深度定制,再评估开源模型本地化方案。现在主流开源模型的水平与商用 API 的差距在缩小,很多场景下完全够用。
5.2 LLM 框架到底解决什么问题:编排、记忆、工具调用
框架(如 LangChain 这类工具链)能火,是因为 LLM 应用天然需要把多个环节串起来:先做检索、再拼 prompt、然后调用模型、再解析输出、可能还要调外部工具。框架把这些流程抽象成“链”“代理”“记忆”等组件,让开发者少写胶水代码。
但框架也有明显的坑。我在实际项目中遇到过的典型报错是llm request failed: provider rejected the request schema or tool payload,这种问题多半出在工具调用的 JSON Schema 定义上。你让模型调用一个工具,框架会把工具的参数结构以 JSON Schema 形式传给模型后端,如果 schema 里缺了必填字段、类型写错、或者嵌套结构不规范,模型端就会拒绝请求。框架只是把这些底层细节隐藏起来了,出错时你反而更难直接排查。
所以我建议初期不要一上来就用大而全的框架。自己写一个不到一百行的代码:拼 prompt、调模型、解析输出,足够跑通大部分场景。等你真的需要复杂的任务编排、多步工具调用时再引入框架,并且要理解框架在底层帮你拼了什么 prompt、以什么格式传参,这样排错时才有入手点。
5.3 本地部署与 GGUF:量化如何让大模型跑进普通设备
本地部署大模型绕不开硬件限制。一个 70B 参数模型,如果用 FP16 精度加载,光权重就要占 140GB 显存,普通服务器都扛不住。所以实际部署几乎必然要模型量化:把权重数值从高位宽降到低位宽。量化后模型体积大幅缩小,推理速度提升,代价是精度略有损失。
这个领域最流行的格式是 GGUF,它是 llama.cpp 生态的模型格式,支持多种量化等级,比如 Q4_K_M、Q5_K_M、Q8_0。名字里的数字表示比特数,Q4 表示每个权重约 4 比特。以 7B 模型为例,Q4 量化后大约 4GB 左右,普通 8GB 内存的电脑就能跑,甚至能压缩到手机这种移动端设备上运行——你看到的“安卓本地运行 GGUF 格式 LLM 软件”就是这么来的:小模型加 Q4 量化,延迟几秒,完全离线使用。
量化后的模型在简单问答、文本摘要、代码补全上的表现普通人感知不到明显差异,只在高难度推理任务上会有退化。所以本地部署的选型思路是:先用 Q8 或更高精度验证效果,如果硬件不允许再降级到 Q4,跑一轮业务指标对比,看损失是否可接受。另外像 LLM Studio 这类图形化工具也可以用来快速加载 GGUF 模型做体验验证,省去繁琐的环境配置。
6. 评估与进阶:怎么判断模型好坏,以及下一步学什么
6.1 LLM as Judge:用一个大模型评估另一个大模型
大模型输出是开放式的,传统评测指标(比如精确匹配、BLEU)只适用于机器翻译或短答案场景,复杂任务根本没法用。于是工程上兴起了一种做法:LLM as Judge,用一个大模型充当裁判,给另一个模型的输出打分。
做法是定义一个评分标准(相关性、完整性、语气偏好等),把待评估的模型输出和标准一起丢给裁判模型,让它给出分数和理由。优势很明显:速度快、成本低、能评估开放题。但偏差同样明显:裁判模型会有位置偏差(更喜欢排在前面的答案)、长度偏差(更喜欢长答案)、自我偏好(更喜欢和自己风格一致的答案)。同一份输出换个 prompt 顺序,分数可能就不一样。
工程上要缓解这些偏差,我会做三件事:一是评估时让裁判模型输出理由再加分数,理由能帮人快速定位问题;二是对同一对比做多次评估并换位顺序,取平均分;三是关键场景保留少量人工抽检,机器打分只能做粗筛,不能完全替代人工。
6.2 基于 LLM 的单元测试:用大模型当测试生成器
这是我很看好的落地场景。传统单元测试要求开发者手工写断言,工作量大、边界条件容易漏。用 LLM 做单元测试,核心思路是让模型生成测试用例,而不是让模型直接判断代码对不对。
具体流程是:把被测函数签名、文档字符串和实现代码喂给模型,让它生成若干测试输入和期望输出,重点覆盖边界条件、异常输入、空值、超大值等。实际落地时最好再配合代码解释器执行测试用例,用实际运行结果来断言,而不是让模型自己判断输出是否正确。因为模型判断自己刚生成的期望输出时,很容易陷入“自说自话”的境地,很多断言错误根本发现不了;用真实执行来验证才是硬标准。
我做过的项目里,把 LLM 生成的测试用例和传统模糊测试结合后,覆盖率有明显的提升,尤其在一些容易遗漏的空指针和边界值场景,比人手工写用例全面得多。需要提醒的是:单测生成要控制期望输出格式,一般让模型输出 JSON,再用程序解析入库,避免文本格式变化导致解析失败。
6.3 进阶路线:从单模型到多智能体,内容还很多
看完这一篇,你已经掌握了 LLM 的核心心智模型。接下来如果想继续深入,我建议按这条路线推进:先补 Tokenization 细节和 BPE 算法,理解分词对成本和效果的影响;再啃 Transformer 数学细节,位置编码、注意力矩阵、KV Cache 的工作机制;然后做一次微调实操,用 LoRA 在领域数据上调一个自己的模型,体会训练和推理的完整链路;接着搭一套完整的 RAG 系统,解决幻觉问题;最后再往上走,研究多智能体系统。
多智能体是当前最有想象力的方向之一,但工程难度也最大。多个 Agent 协作完成任务时,单个 Agent 的错误会在交互中不断放大,产生“错误链式传播”。热点里提到的“LLM 智能体自主容错控制:构建可靠 AI 系统的工程实践”就是这个方向的核心命题:要做检查点、要做回滚、要给每个 Agent 加约束、要有消息超时机制。这类系统不能靠“提示词调用”解决,需要在系统架构层面做可靠性与容错设计。再往远看,把语言模型与空间信息结合的 Spatial LLM,或者多模态统一模型,都会是未来两三年的重要研究方向,建议保持关注。
最后说一点个人体会。我刚开始用 LLM 时犯过的最大的错误,就是把它当成“无所不知的百科全书”,于是做第一个工具就被幻觉坑惨了。后来终于想通:LLM 本质上是一个极其优秀的“续写引擎”,所有工程方案的核心,都是在帮它搭一个“即使带病续写也不至于出大错”的舞台——要么给它检索结果,要么把任务拆成小块,要么用程序校验输出。把这个认知切换过来之后,做项目的成功率一下子就上去了。这个系列后面会继续往下拆,下一篇我打算先聊 token 和分词,因为这是最容易被忽略、却又最影响成本和效果的细节。