大模型(Foundation Model)这个概念,最初是2021年斯坦福大学互联网研究中心的学者们提出来的。他们用这个词描述一类模型——在海量数据上以自监督方式训练,然后可以被各种下游任务适配。这个词本身强调的不是“大”,而是“基础”。后来ChatGPT出圈,全世界都开始用“大模型”称呼这类技术,却很少有人停下来问一句:它到底是怎么来的?作为一个从传统深度学习转到大模型方向、亲手跑过数据清洗、预训练、微调和部署全流程的从业者,我想把这条链路上最关键的几个环节拆开来讲——尤其是数据,它最容易被人低估,但恰恰决定了模型的天花板。
这篇文章适合谁?如果你正在学大模型,或者刚看完一堆“大模型科普”但对内部机制还是很模糊;如果你想搞清楚“为什么大模型训练动不动就要几千张GPU”“为什么有人说数据比算法更重要”;又或者你只是想弄明白Foundation Model和以前的CNN、LSTM到底有什么本质区别——那这篇文章应该能给你一个比较完整的答案。我不打算讲那些花哨的数学推导,而是尽量还原一个真实的工程链路:数据从哪来、模型怎么炼、对齐在做什么、部署和微调有哪些坑。
1. 大模型不是一夜之间长出来的:Foundation Model的前世与位置
要理解大模型是怎么来的,得先理解它在整个深度学习发展史里处于什么位置。时间线拉长一点,2012年AlexNet在ImageNet上拿下冠军,那是深度学习第一次真正火起来。当时的范式是“专才”——一个模型只干一件事,识别猫就是识别猫,翻译就是翻译。2017年Transformer架构提出来,其在机器翻译上的表现非常亮眼,但真正让大家意识到“这条路可能走通了”的,是2018年的BERT和GPT-1。它们的核心做法叫“预训练+微调”:先用无监督数据把模型训练出一个“通用的语言理解能力”,再拿到具体任务上做小规模微调。这就好比你先在学校里通识教育,毕业后再到具体岗位上培训。
Foundation Model把“预训练”这个概念进一步推向极致——它不再追求“训练一个模型然后微调成多个任务”,而是直接训练一个“什么都能干的基础模型”,下游任务不需要重新训练,只需要“引导”它就行。这就是为什么ChatGPT能聊天、能写代码、能翻译,不是因为它被分别训练了三遍,而是因为它的底座已经学会了语言背后的统计规律、知识结构和推理模式。
我在跟很多刚入门的朋友聊的时候,发现大家有个误区:以为“大模型”就是“模型参数更大”。其实参数大只是表象,真正的质变有三个:
- 数据规模:从百万级样本变成了千亿级Token,量级跨越了五个数量级以上。
- 模型架构:Transformer的self-attention机制让模型能同时看到整个序列,而不是像LSTM那样一步步“挤牙膏”。
- 训练范式:从“每任务一训”变成了“先通才、后专才”,这个范式转变才是Foundation Model的灵魂。
所以,我们说“大模型是怎么来的”,本质上是在回答一个问题:**一个模型如何从“什么都不会”变成“什么都会一点”?**答案就藏在这句话里——它见的“世面”足够大。而这个“世面”,就是我们接下来要讲的数据。
2. 原料决定智商:万亿Token数据从哪来、怎么洗
2.1 大模型吃的是Token,不是“文档”也不是“字节”
很多初学者问我:“GPT训练用了多少本书?”这个问题本身就有点偏差。大模型处理文本的最小单位不是“字”,也不是“词”,而是Token。Token简单理解就是“分词后的片段”,一个英文单词常常是1个Token,一个中文汉字在主流分词器下大约是0.6到1.5个Token,具体看分词算法和词表设计。业界说“训练数据有几十万亿Token”,说的就是分词之后的Token数量。
为什么要强调这个?因为Token的数量直接决定了训练成本——模型每吃一个Token,就要做一次前向传播和反向传播。所以你可以把Token理解成大模型的“卡路里”,它从数据中吸收的知识密度和数量,都靠Token来计数。
2.2 数据来源:互联网是最大的语料矿场
那么大模型的“卡路里”从哪来?答案可能让你意外——绝大多数训练数据来自互联网的公开页面。业界常用的数据源包括:
- Common Crawl:一个非盈利组织维护的网页爬虫数据库,每个月爬取数十亿网页,十几年来积累了PB级别的原始HTML。它几乎是所有大模型训练数据的基础底料。
- 维基百科:数据量不大(相对于整体可能只占极小比例),但质量极高,用词规范、结构清晰,是大模型“学常识”的重要来源。
- 书籍语料:像Books3这类数据集,提供了长篇上下文和复杂叙事结构,让模型学会“读长文”的能力。
- 代码仓库:像GitHub上的公开代码(经许可后使用),是模型学会编程的关键。代码和自然语言的结构差异很大,能帮助模型理解逻辑、语法和抽象结构。
- 学术论文:arXiv上的论文提供了高度凝练的专业知识表达方式。
- 问答社区和论坛:像Stack Overflow、Reddit、百度贴吧等,提供了大量的问答对,对模型学会“人对问题的期望”非常有帮助。
这几种数据源的比例需要仔细设计。Common Crawl虽然量大,但里面大量是垃圾页面、重复内容、机器生成的乱码;维基百科和书籍质量高但量不够。所以真实训练数据的配比通常是一个需要反复试验的配方——就像做菜,主料是CC(Common Crawl),配料是高质语料,最后的口感取决于配比。
2.3 数据清洗:大模型训练里最脏最累的活
我敢说,任何一个做过真实大模型训练的人,都会同意这句话:数据清洗才是真正的核心工程。在公开数据集的论文(比如LLaMA的论文)里,你看到的可能只是短短一段“we deduplicated and filtered the data”,但实操中这才是最花时间的环节。
数据清洗的主要工序包括:
| 工序 | 目标 | 常用手段 |
|---|---|---|
| 语言识别 | 去掉非目标语言的内容 | fastText语言分类器,识别中英文并过滤混杂页面 |
| 去重 | 删除重复和近重复文档,避免模型“背课文” | MinHash + LSH(局部敏感哈希),对文档计算指纹 |
| 质量过滤 | 去掉无意义、机器生成的垃圾内容 | 用困惑度(perplexity)打分,用分类器判断是否为高质量文本 |
| 隐私过滤 | 移除电话号码、身份证号、邮箱等个人隐私 | PII(Personal Identifiable Information)检测与脱敏 |
| 毒性过滤 | 去掉色情、暴力、仇恨言论 | 分类器 + 关键词黑名单 |
| 格式清洗 | 去掉HTML标签、脚本、导航栏、页脚 | 解析HTML结构,提取正文,去除模板噪声 |
这里面最容易被低估的是去重。如果你不去重,模型会因为某个文档在训练集里出现了100次,而对它的内容“过度自信”,甚至直接把那一长段文字背下来。这会导致两个问题:一是生成内容时出现“复读机”现象,二是模型的泛化能力下降——它无法从相同知识的不同表达中抽象出本质规律。MinHash去重的思路很朴素:把一篇文档切成很多shingle(固定大小的连续片段),算哈希后取最小值作为签名,签名相同的文档就视为相似文档,保留一份即可。这个思路后来被扩展成了更精细的近重复检测方案,但核心思想至今没变。
很多人以为数据清洗是“脏活累活没技术含量”,实际上,清洗策略直接决定了训练出来的模型是“聪明”还是“看起来聪明”。同一个架构、同样的Token数目,数据质量差一档,最终模型的理解能力可能差好几个点。我在的实际项目中见过太多团队,训练了几百万美元还没出结果,最后回头发现是他当初过滤时把高质量数据也一起滤掉了。
2.4 经典小数据集与大模型语料的量级差异
很多初学者是从MNIST(手写数字识别)、CIFAR-10、KITTI这些经典入门数据集开始接触机器学习的。MNIST一共只有6万张28×28的灰度图,KITTI也只有几千帧自动驾驶标注图像。这些数据集的定位是练手、验证算法,它们的规模在公开语料面前连零头都算不上。
这背后有个重要的认知转变:传统的深度学习模型是“数据少的时候靠人工特征和迁移学习”,而大模型的逻辑是“给你海量数据,让你自己找规律”。就像我之前带的学生,一开始让他拿MNIST练手,他还觉得“训练一轮几分钟,已经很快了”;后来接触到大模型预训练,一个epoch要跑几小时甚至几天,才真正体会到“量级完全不同”是什么概念。
3. 预训练的高炉:Transformer、损失函数和万卡集群
3.1 为什么偏偏是Transformer
数据准备好了,下一步是让模型“吃”下去。这个过程叫预训练(Pre-training),核心目标是让模型通过自监督学习掌握语言的统计规律。自监督的意思是:数据不需要人工标注,模型自己给自己出题——最常见的方式就是“预测下一个Token”。
为什么是Transformer而不是LSTM?原因有两个:并行效率和长距离依赖建模。LSTM是串行处理的,你读完第100个词,才能处理第101个词;而Transformer的self-attention机制允许所有Token同时参与计算,每个Token都能“看到”序列中的其他所有Token,这在GPU上可以大规模并行加速。打个比方:LSTM像一个人在一条窄路上走,每一步都只能踩着前一步的脚印走;Transformer像是站在一个巨大的广场上用望远镜环顾四周,一眼就能看到广场上所有人的位置。
3.2 预训练到底在“学”什么
预训练的目标函数很简单——交叉熵损失(Cross-Entropy Loss)。具体来说,模型给定前面的Token序列,预测下一个Token的概率分布,然后用真实的Token做监督信号,计算损失函数进行反向传播。迭代无数轮之后,模型学会了的事情是非常惊人的:它不只是记住了“the”后面常跟“cat”,它还在多层网络的内部表示中建立起了对语法、语义、常识知识、逻辑推理的压缩表达。
这个“压缩表达”就是我们常说的大模型“能力”的来源。一个175B参数的大模型,相当于用几千亿个参数去“记住”了互联网海量文本里的知识模式和推理模式。说“记住”不准确,更准确的词是“内化”——模型不是把文章背下来了,而是从文章的统计规律中学到了“这个世界是怎么运作的”。
如果只做“预测下一个Token”,模型的输出其实已经很像人话了,但它仍然“不听话”——它只会顺着你的话头继续延续,而不懂得“回答问题”或“执行指令”。这也是为什么预训练之后还需要对齐(Alignment)阶段,这个放到第4节展开。
3.3 千亿参数的训练工程
理论讲讲很简单,但真正训练一个大模型,是个不折不扣的超级工程。以训练一个7B(70亿参数)规模的模型为例,在几百张A100上训练,动辄需要几周时间;如果再往上到175B甚至更大,就需要数千张高端GPU并行计算,光电费可能都是天价。
我在训练一个2B规模的模型时,就深刻体会到了“分布式训练”的复杂度。简单说,单张GPU的显存是有限的,放不下动辄几十上百GB的模型参数和中间激活值,所以必须把模型和数据拆到多张卡上并行计算。业界常见的并行策略有三种:
| 并行策略 | 思路 | 类比 | 典型使用场景 |
|---|---|---|---|
| 数据并行(Data Parallelism) | 每张卡复制一份完整模型,分到不同的数据批次,通过梯度同步更新参数 | 复印试卷,每个人做全套题,最后对答案取平均 | 模型能放进单卡时的首选 |
| 张量并行(Tensor Parallelism) | 把单个Transformer层的矩阵乘法切分到多张卡上,各算一部分结果再拼起来 | 一道题拆成几道小题分给几个人并行算 | 层内计算量超大时使用 |
| 流水线并行(Pipeline Parallelism) | 把网络的不同层分到不同的卡上,前层算完传给后层 | 工厂流水线,每人只干一道工序 | 模型层数很深时使用 |
实际训练中通常不是只用一种,而是把三种组合起来用,这就是常说的“3D并行”。除此之外,还有ZeRO(零冗余优化器)这类技术,能进一步减少显存占用——它把模型参数、梯度和优化器状态分片到多张卡上,而不是每张卡都抱着一份完整的副本。我记得第一次看ZeRO论文时觉得挺震撼:原来“参数装不下”还可以通过“把参数拆了轮流算”来解决。
训练过程中还少不了断点续训(Checkpoint)。因为训练周期太长,一次数据中心的电压波动、一张GPU卡故障、一个CUDA报错,都可能导致整轮训练崩溃。没有定期保存模型权重和优化器状态的checkpoint,一旦中途出问题就得从头再来,那可是烧了几十万美元打水漂。所以训练脚本里,每几百步定期存储checkpoint是标配;保存checkpoint的同时,最好把训练数据、随机种子、配置参数都记清楚,否则恢复训练时模型行为对不上,排查起来能让人崩溃。
3.4 训练过程最怕的三个“炸”
一个负责任的训练工程师,每天干的事情就是盯监控面板、看loss曲线、检查GPU利用率和显存占用。实际训练中,最怕遇到下面几种情况:
- Loss 突然变NaN(非数值):常见的诱因是学习率过大导致梯度爆炸,或者数据里混入了异常值。解决思路是降低学习率、增加梯度裁剪(gradient clipping)、检查数据清洗流程。
- Loss Spike(突然尖峰):模型本来学得好好的,loss突然跳高。这经常是某个数据批次里混入了一堆垃圾数据。这时候你得用日志把每个batch的平均loss记下来,再对照样本去排查。
- Loss 不降反升:如果持续多步loss不降,就别急着调超参了——极大概率是数据有bug,比如tokenizer对某些特殊字符处理错了,或者数据混入的格式不对。
这里分享一个我自己的教训:有次训练一个多语言模型,loss始终在某个阈值下不去,我调了两天学习率和batch size都没用。后来实在没辙,把训练数据抽出来人工看一眼,才发现数据清洗时语言过滤器的阈值设得过于宽松,混入了大量把中文按空格切成一个字一个Token的乱码文本。那一刻我才真正体会到“Garbage in, garbage out”不是一句空话。
4. 从“会接话”到“听话”:对齐背后的人工力量
4.1 预训练出来的模型是个“接话机器”
预训练阶段结束后,模型的行为是这样的:你给它输入一句“今天我去了”,它很自然地续写“超市买东西”。听起来挺聪明对吧?但如果你给它输入“你知道大模型是什么吗”,它很可能不会回答这个问题,而是顺着话头往下编——比如“问题很多,我不确定如何回答”这类废话。它根本不是在与用户对话,只是在做“根据上文预测下文”的统计游戏。
所以我们还需要一个阶段,教会模型“用户问了一个问题,你要给出答案而不是继续编”。这个阶段统称为对齐(Alignment),核心目标就是让模型的行为符合人类期望——回答问题、遵循指令、拒绝不当请求。
4.2 SFT:先让模型学会“有问必答”
对齐的第一步是监督微调(Supervised Fine-Tuning,SFT)。做法很直白:请人写一批高质量的“指令-回答”对,比如“请写一段关于量子计算的简介”配上人类精心撰写的回答,然后在这些数据上继续训练模型。
这一步能让模型从“接话机器”转变成“问答机器”,但它有个明显的天花板——它只能教会模型没见过的东西,而人类写不了几百万条高质量指令数据。而且SFT有一个隐患:模型学到的是“模仿”,不是“理解”——它知道要输出答案,但不明白什么样的答案更好。
4.3 RLHF:用“评委”给模型打分
所以就有了RLHF(基于人类反馈的强化学习),它做的是把SFT再往前推一步。RLHF分三步走:
- 训练一个奖励模型(Reward Model):先请人类标注员对同一个提示词下的多个模型回答进行排序,比如“回答A比回答B好,回答B比回答C好”,然后用这些排序数据训练一个奖励模型。这个奖励模型的作用是,给它一段回答,它能打出一个分数,模拟“人类觉得这个回答有多好”。
- 用强化学习优化策略:以SFT阶段训练好的模型为初始策略,让模型对提示词生成回答,然后用奖励模型打分,再通过PPO(近端策略优化)这类强化学习算法更新模型参数——目标是让模型生成的回答在奖励模型那里拿到更高的分。
- 迭代:这个过程需要反复进行:模型变强了,奖励模型也要跟着换新,再标注新的比较数据……
RLHF是“大模型是如何来的”这个故事里最像“驯化”的一个环节。预训练是让野兽长身体,RLHF是教野兽守规矩。
不过RLHF有一个很有名的副作用,叫奖励黑客(Reward Hacking)——模型找到了直接刷高分的捷径。举个例子,奖励模型发现“回答里带有很多恭喜、赞美、积极词汇”往往得分较高,模型就开始无原则地拍马屁,不管用户问什么,回答都要先夸用户一句“你这个问题问得非常好”。这种“谄媚”现象在实际产品里其实不少见,本质就是奖励模型被模型钻了空子。
4.4 DPO:为什么说它是对齐的“平民方案”
RLHF虽然效果好,但工程实现复杂度很高——它需要同时维护四个模型(策略模型、参考模型、奖励模型和价值模型),训练不稳定,超参敏感。2023年出现的DPO(Direct Preference Optimization,直接偏好优化)则另辟蹊径:它把奖励模型的优化目标直接融入到策略优化里,不需要单独训练奖励模型,也不需要复杂的强化学习循环——只需要一组“更好/更差”的回答对,就可以直接做偏好优化。
现在很多开源模型(比如一些基于Mistral/Llama的中文微调模型)都选择用DPO而不是RLHF,因为它更简单、更稳定、算力需求更低。如果你研究一下新发布的开源大模型的技术报告,会发现“SFT + DPO”已经是一个非常流行的对齐配方。
对齐阶段也是继预训练之后,第二个“人工密集”环节。SFT的数据需要人工编写,RLHF的排序需要人工标注,DPO的偏好对也需要人工挑选。所以很多人问“大模型是不是真的靠自己学习”,答案是:它的语言能力是自监督学来的,但它的价值观和好习惯,靠的是无数标注员在背后加班加点地给它“当老师”。
5. 模型炼成之后:部署、推理优化与跑起来的真成本
5.1 为什么推理比训练更让团队头疼
大模型训练是一次性成本——“烧”几十万美元换一个模型。但上线后,每次有用户调用模型,都是一次推理(Inference)过程,也要花钱。论总量,很多做API服务的团队,推理成本会远超训练成本,因为训练只需要付一次,推理却要源源不断地付下去。
推理模型最耗资源的瓶颈,是生成式解码。整个过程中模型只能一个Token一个Token地往外蹦——生成100个Token,就需要跑100次前向传播。更尴尬的是,每次前向传播里,前面已经算过的历史信息理论上是可以复用的,但如果不加任何优化,等于每次都把前面所有内容重新算一遍。
5.2 KV Cache:把算过的东西记下来
为了解决这个重复计算的问题,业界普遍采用KV Cache——把已经计算过的Key和Value缓存到显存里,当下一个Token生成时直接读取缓存,不再重复计算前面所有的历史内容。
KV Cache可以说是推理优化里最基础、最有效的一招,但它也有成本——显存。一个输入很长的对话场景,KV Cache可能占据比模型权重本身更大的显存。所以现在很多推理框架都在做KV Cache的量化、剪枝、上下文压缩,力求在显存占用和推理速度之间找平衡。
5.3 量化:把模型“瘦身”到能跑在日常电脑上
第二个常用优化是量化(Quantization)。大模型默认以FP16(半精度浮点,每个参数占2字节)保存。一个7B的模型,FP16权重需要约14GB显存,普通家庭电脑根本跑不动。但如果把它量化为INT8(每个参数占1字节),体积直接减半;量化为INT4(每个参数占0.5字节),就更小了。这也是为什么现在大家能在本地用Ollama跑7B或13B模型——这些工具背后基本都用了4-bit量化技术。
| 精度 | 每参数字节数 | 7B模型理论占用 | 优点 | 缺点 |
|---|---|---|---|---|
| FP16 | 2字节 | 约14GB | 精度无损,效果最接近原版 | 显存要求高 |
| INT8 | 1字节 | 约7GB | 精度损失小,速度较快 | 需要较好的量化校准 |
| INT4 | 0.5字节 | 约3.5GB | 显存占用极小,消费级显卡可跑 | 精度损失明显,复杂推理能力下降 |
量化的动态范围压缩会让模型某些“精细”能力受损,特别是代码生成、逻辑推理、数学计算这类任务。所以量化通常是“边测边用”——我一般会先跑一遍评估集,对比原模型和量化模型在目标场景上的效果差异,再决定要不要上线。
5.4 蒸馏:让大模型“教”出小模型
比量化更进一步的是知识蒸馏(Distillation)。思路很简单——用一个大而强的模型当“老师”,去“教”一个小而快的“学生”模型。老师模型生成的输出(不只是答案,还包括各Token的概率分布)作为学生模型的训练信号,让学生模型学会老师的“思考方式”。
蒸馏的本质是把容量的“能力”转移到“效率”上。一个4B的蒸馏模型,在许多任务上能达到接近14B原版模型的效果,但推理成本却低了一个数量级。这在工业界特别有价值,所以你能看到很多团队用“超大模型离线蒸馏 + 中等模型线上服务”的组合打法。
5.5 部署环节的几件“小事”
真正部署上线时,还有一堆看似“小事”但能坑到人的环节:
- Token不一致:训练时的tokenizer和部署时的tokenizer如果版本不同,模型输出可能会莫名其妙变差。
- 显存碎片化:高并发场景下KV Cache扩张导致显存碎片,会直接触发OOM(显存溢出)。vLLM这类框架通过PagedAttention管理KV Cache,能显著缓解这个问题。
- 并发与调度:如果服务线程模型设计不好,小流量也能把GPU打满——重要指标是吞吐量(token/s)和首Token延迟,不全看单次推理速度。
6. 领域大模型的工程真相:微调不是把书塞进脑子里
6.1 为什么要微调
对大多数团队来说,他们不是在训练大模型,而是在**微调(Fine-tuning)**大模型——比如基于某个开源底座模型(像Llama、Qwen、DeepSeek系列),在特定领域数据上继续训练。微调的两大动机通常是:一是注入领域知识,比如金融法规、医疗术语、企业内部文档;二是改变行为模式,比如让模型学会客服语气、按特定格式输出、配合企业API做结构化调用。
这里要澄清一个常见的错误认知:微调不是“把知识灌进模型脑子里”。很多人以为只要把公司所有PDF喂给模型,模型就能变成领域专家。实际上,微调更适合“教格式”“教规范”“调行为”,而不是“背知识”。你要让模型记住具体的新闻、法规条文、企业FAQ,更好的方案是用RAG(检索增强生成)——把文档存到向量数据库里,用户问问题时先检索相关内容,再让模型根据检索结果回答。微调和RAG各有分工,硬拿微调去做知识注入,不仅效果差,还容易出现灾难性遗忘。
6.2 LoRA:物美价廉的微调方案
全量微调一个大模型需要更新所有参数,显存成本很高。业界现在最常用的方案是LoRA(Low-Rank Adaptation,低秩适配)。它的做法很有意思:冻结原始模型的全部权重,只额外训练两个很小的低秩矩阵作为“补丁”,最终模型输出等于原始输出加上这个补丁的影响。
LoRA的直觉类比是:你不需要重新锻造一把刀,只需要在刀刃上贴一层薄薄的特殊材料,就能改变刀的锋锐度和切割方式。LoRA训练出来的“补丁”一般只有几十到几百MB,而原始模型有几个GB甚至更大。这让LoRA有几个巨大的优势:
- 显存占用大幅降低,消费级显卡就能微调小模型
- 训练速度快
- 同一个底座模型可以同时挂载多个LoRA补丁——客服场景用客服LoRA,法律场景用法律LoRA,互不干扰,按需切换
我对LoRA的实用建议是:先从rank=16或rank=32开始试。rank太小,模型的表达能力不够;rank太大,显存占用增加且容易过拟合。训练数据至少要有上千条高质量指令对,否则模型学不到什么实质能力。
6.3 微调数据怎么准备才能不翻车
微调失败,八成因数据。以企业客服场景为例,我见过太多次这种情况:团队把历史客服对话记录直接拿去做SFT训练,结果模型学到了非常差的格式——因为真实客服对话里充满口语、错别字、无意义的寒暄,甚至夹杂着情绪化的表达。模型从中学到的只能是“乱说”。
好的微调数据应该具备几个特点:
- 指令清晰:每条数据都有明确的输入(用户问题)和期望输出(标准回答)。
- 多样性:同一个问题,尽量覆盖不同问法、不同表达方式。只有一种模板的问答对,会让模型面对真实用户提问时非常脆弱。
- 格式统一:对话模板、特殊分隔符(如
<|user|>、<|assistant|>)要严格一致,不能让模型在格式判断上消耗学习能力。 - 负面样本:模型必须知道哪些问题不该答,比如涉及隐私、违法、政治敏感、越权操作等场景。如果没有负面样本,模型遇到这类请求就分不清边界,容易说错话。
有个真实的翻车案例我记忆很深:某团队用一万条企业FAQ微调模型,每条FAQ都是“问题——答案”的模板,结果模型被喂成了“背书机器”。用户问“你们公司营业时间是几点”,它回答得非常好;但换一种问法“我想去你们办公地点办业务,几点能到”,模型就完全不会了,因为它训练里见过的是规范性问句,没见过口语化变体。最后团队花了两周重新写数据,加入了大量同义改写和对话变体,才把模型的泛化能力拉回来。
6.4 微调之后的评估:别只看测试集准确率
微调完成之后,最大的坑是“过拟合测试集”。我建议至少要分三个层次做评估:
- 领域能力:在真实领域数据上的准确率、完整性、格式合规率。
- 通用能力:底座模型原本的通用能力有没有退化——用一份纯通用评测集(比如MMLU、C-Eval的抽样子集)做回归测试。
- 边缘场景:挑一些极端输入、对抗性输入,看模型会不会胡说八道、泄露敏感信息、生成防火墙外内容。
很多团队只做第1层,结果上线后发现模型在垂直领域变厉害了,但写代码、逻辑推理、日常对话的能力全崩了——这就是典型的灾难性遗忘。微调时在数据里混入10%到20%的通用语料,或者用LoRA这类参数高效微调方法,都能在一定程度上缓解这个问题。
顺着这个话题往下说,大模型的应用落地还有一条路叫“Agent(智能体)”,本质上就是让大模型学会调用工具、做计划、执行任务,相当于给“大脑”装上“手脚”。这已经是另一个很深的工程话题了,这里先不多展开。
最后回到数据这件事上。我自己的实操体会是:不管是做预训练、微调还是RAG,手里有没有一份干净、多样、贴合实际场景的数据,直接决定了项目的成败。很多人一开始热衷于追求“更大更强的模型”,但我见过太多的团队把重点放在追新模型、堆算力上,最后发现瓶颈其实在数据侧——清洗不净、样本失衡、格式混乱、覆盖不够。
如果你想自己动手体验从数据到模型的完整过程,我建议的路径是:先跑通MNIST这类小数据集找训练手感,然后读一遍Transformer原论文理解注意力机制,接着找一个中小规模的开放语料尝试一次小规模预训练,最后用开源底座模型配合LoRA微调一个属于你自己的“领域小助手”。走完这条路,你对“大模型是怎么来的”这个问题,就会有远比读论文更深刻的体感。