大模型工作的完整流程,说简单点就是“喂数据、做训练、调表现、上服务”四个环节,但这四个环节里面嵌着的坑和细节,比大多数人想象的要深得多。我接触大模型相关项目这几年,踩过不少坑,也总结出一套比较顺的工作路径。这篇内容就是把这些经验梳理成一套可参考的流程,适合刚接触大模型的开发者,也适合已经做了几个项目但总觉得流程不顺畅的团队。
很多人拿到一个开源模型就直接开始微调,结果调出来的模型要么不稳定,要么效果不如预期,最后又回头补数据、调代码,效率极低。实际上,大模型工作的每一步都有它的前置条件和后置依赖,顺序搞错了,后面全在给自己挖坑。我之前带过一个小团队,当时大家急着在一个垂直领域里出成果,跳过数据清洗直接微调,结果模型在测试集上表现不错,一上真实业务就崩得不成样子。后来花了两倍的时间回头重做数据,才算真正跑通。
所以我这篇文章,核心就是讲清楚大模型从数据到部署的完整工作流程,把每一步的要点、原理、常见问题都拆开聊一聊。不管你是做对话系统、内容生成工具,还是做领域知识问答,这套流程的思路都适用。
1. 大模型工作的整体框架:先有全局观再动手
一开始就扎进代码细节里,是大模型项目最常见的失败原因。我的习惯是先花一天时间把整个流程画清楚,哪怕只是白板上画几根箭头,都能避免后面很多混乱。
1.1 大模型工作流的五个阶段
一个成熟的大模型工作流,大致可以拆成五个阶段:数据准备、模型训练、模型优化(对齐与微调)、评估验证、部署与持续迭代。
这五个阶段听起来像线性的,实际上每一阶段都可能需要返工。比如评估阶段发现模型在某个领域的知识严重缺失,就要回到数据阶段补充语料,再重新训练或继续训练。所以真正跑项目的时候,这是一条反复迭代的环形流程。
我习惯把这个环形流程的核心逻辑理解为“一个模型的质量,在数据阶段就已经决定了60%”。后边的训练和调参,本质上是把这个数据里蕴含的信息尽可能无损地提取出来。数据不行,后边再努力也有限。
1.2 和传统软件开发本质不同的地方
大模型工作的底层逻辑和传统软件工程差别非常大。传统软件开发是“写逻辑”,代码逻辑确定后表现就基本稳定。大模型开发是“炼参数”,你没有一个显式的规则可以精确控制模型在每个输入上的表现,只能通过数据分布和训练目标来间接引导。
这种差异也带来一个非常实际的后果:你必须接受“概率性工作”的存在。同一个参数配置,换一个数据顺序,训练出来的模型都可能表现不一样。所以你的工作方式要适应这种不确定性,比如建立完整的实验记录体系,每次实验跑完,配置文件、随机种子、数据版本都得固定保存。
我之前有一次犯过这样的错误——没有记录数据版本,后来发现实验结果复现不了,排查了整整三天,最后才知道是数据侧跑批脚本被人改过,导致语料顺序和首批实验不同。教训就是,大模型不能靠记忆来工作,必须靠记录。
2. 数据工程:被大多数人低估的第一道关口
数据工程是大模型项目里最不性感、但最出效果的环节。很多人嫌数据清洗麻烦,总想着拿原始数据直接训练。我可以直接说,如果你做的是垂直领域的大模型,花在数据上的时间至少要和训练时间持平,甚至更多。
2.1 数据采集与过滤的实操细节
数据采集不是只从公开数据集下载就完事了。真正要落地到业务,你还得准备两部分数据:通用知识数据和领域业务数据。
通用知识数据能保证模型“有常识”,领域业务数据保证模型“懂行话”。两者比例很重要。我孵化的一个法律领域项目,一开始通用数据配比太高,模型聊天没问题,但一问到具体法条就漏洞百出。后来把领域数据占比提到60%以上,效果才明显改善。
数据过滤的时候,除了大家熟知的去重、去低质文本(乱码、太短、纯广告、纯HTML标签),还要特别留意“重复模式污染”。比如某类业务文本模板大量重复,模型会学到“偷懒”的生成方式,输出千篇一律。所以我在脏数据清洗时,不仅看单个数据质量,还会采样看整体多样性,重复度高的语料做降采样。
2.2 数据配比与token分布的底层逻辑
数据配比为什么要讲究?因为模型的学习是“看多少遍”的问题。数据分布不均匀,模型就会偏科。最典型的表现是,训练语料里某种风格的数据占比极大,模型就默认所有输出都采用那种风格。
我的一个实操经验是,把数据按来源类型打标签,例如百科类、论坛类、业务文档类、人工撰写类。然后分组统计token量,再做配比。你不需要一开始就追求完美的比例,但一定要有一个可解释、可调整的配比逻辑。比如通用知识40%、领域文档35%、人工对话数据15%、代码/结构化数据10%,这个比例跑出来比较稳。
数据质量评估上,也不要只相信直观感受。我常用一个便宜又有效的方法:用一个小规模基础模型在候选数据上做“困惑度采样”。困惑度异常高的数据往往包含噪音或格式问题,人工去排查一下,效率比肉眼刷一遍快得多。
3. 模型训练:从零预训练不是你的默认选项
大模型项目的技术路线选择,会直接影响后面所有环节的难度。每次有人问我“要不要从零预训练”,我第一反应都是反问:你真的需要吗?
3.1 从零预训练、增量预训练还是直接微调
从零预训练需要至少几百亿token的语料和动辄几十上百张高端显卡,绝大多数团队不具备这个条件。而且从零开始,训练稳定性的坑特别多,这一块更适合有充足算力储备的团队去探索。
大多数项目团队的实际选择是两条路:一是拿现成的开源底座模型做增量预训练,用领域语料让模型“再读一批书”;二是直接做微调或对齐,让模型学会特定任务或风格。增量预训练和微调的区别在于,增量预训练是提升知识储备,微调是提升任务表现。在实际项目里,这两个经常结合着用。
拿我的一个项目经验来说,做一个问诊辅助系统,我们先是拿开源底座模型做了10亿token的医疗语料增量预训练,让模型熟悉术语和知识体系,之后再做指令微调,让模型学会问诊的对话结构。两步分开做,每一步的调整目标都更清晰。
3.2 训练稳定性和关键超参数的经验值
训练稳定是大模型项目最折磨人的问题。Loss突然飙升、NaN出现、显存溢出,这些都是常客。
我一般重点关注这几个超参数:学习率、批大小、序列长度。学习率选太大,Loss容易震荡;选太小,收敛慢且容易被陷入局部最优。以一个小规模增量预训练为例,我通常把峰值学习率设定在1e-5到2e-5之间,配一个带warmup的调度器。批大小受显存限制,能调到多大就多大,但注意随着批大小变化,学习率也要相应调整。一个很粗糙的经验:批大小翻倍,学习率也近似翻倍。
序列长度上,过长会带来显存和算力开销,过短则可能让模型学不到长距离依赖。如果预训练语料里长文本不少,建议至少用1024或2048的序列长度。不要一开始就用什么4096,先把管线跑通再说,后续再按需扩展。
训练稳定性的另外一个容易被忽视的点是“数据顺序”。同一份数据,如果训练时频繁在脏数据和高质量数据之间切换,模型的Loss会很飘。我的做法是把数据预先混洗好,保持局部区域数据分布相对均匀,同时在训练脚本里设置固定随机种子,方便复现。
4. 微调与对齐:真正拉开项目效果差距的地方
很多人以为训练阶段结束了,模型就做好了。实际上,底座模型只是一个“什么都懂一点但不太听指挥”的形态。微调和对齐,才是让模型真正符合业务需要的环节。
4.1 SFT与LoRA:哪些场景适合全参,哪些适合轻量
指令微调(SFT)时,你给模型看一批“指令-正确回答”的样本,让模型学会按指令模式回答。
选择全参数微调还是LoRA这类参数高效微调,我一般看两个条件:一个是业务任务和新领域知识的偏离度,另一个是训练资源和数据量。
LoRA的优势是训练成本低、显存占用小,能给同一个底座模型快速尝试多种“人格”或风格。比如你在一个客服场景里想试验两种不同的应答风格,用LoRA分别训练两个适配器,切换推理就行,非常方便。缺点是它对模型知识更新的深度有限,如果任务改动特别大,或者需要大量新知识,LoRA可能不够。
全参数微调能力强,但训练成本高,而且对数据质量和参数设置的要求更严格,搞不好容易让模型的通用能力退化。一个折中做法是,先用LoRA跑通流程,评估效果,再决定要不要全参数微调。这个方法在实际项目里帮我们省了很多试错成本。
4.2 RLHF与DPO阶段的实际操作心得
对齐阶段(让模型的回答更符合人类偏好)是大模型项目里另一个“拿效果”的环节。经典的RLHF流程要走奖励模型和PPO,训练复杂度高、不稳定因素多,我之前折腾了很久,发现很多项目其实用不上这么重的方案。
DPO(Direct Preference Optimization)是我现在更常采用的对齐方案。它不需要单独训练奖励模型,也不需要强化学习环境,只需要一组偏好数据(同一问题的好回答和差回答),就能直接优化策略。数据准备上,代价小很多。
不过我提醒一下,DPO也有它的坑。偏好数据本身的质量要求非常高,如果你的“好回答”和“差回答”区分度不够,模型学不到什么东西。我们团队临时招了一些外包来写偏好数据,结果质量的稳定性很差,后来定了严格的标准,每条对比样本必须给出理由,再抽检,才算把数据管住。
在对齐阶段,别忘了随时保留一个“微调前版本”的模型。我每次训练都会把不同阶段的模型保存下来,对齐前和对齐后比一比效果,万一发现对齐把模型能力带偏了,还能回退。
5. 模型评估:用数据衡量,而不是靠感觉
评估环节,在很多团队里是存在感最弱的。大家一上来就试用模型,觉得“还行”就上。等你上线接真实流量,问题就全暴露了。我的建议是,评估体系一开始就搭好,宁可粗糙,不能没有。
5.1 评估集的设计思路与构成
一个评估集应该至少覆盖三个层面:通用能力、领域能力、安全性。
通用能力可以用公开基准数据集来看模型的基础水平有没有跑偏。领域能力要你自己构建,从业务语料中抽取一批问题,配合标准答案或评判标准。安全性则要准备“诱导类”和“边界类”样本,例如让模型输出不合适的建议,或者对不确定的领域乱下结论,安全样本至少要有几十上百条。
在构造业务评估集时,我建议不是只做问答题,加一点对抗性的改写。例如把真实业务里的输入稍微改几个字,看模型会不会发生剧烈错误。我见过太多模型在工整的测试集上表现优秀,遇到真实用户的口水话就崩溃。评估集一定要加入真实场景里的噪音和口语表达。
5.2 自动化评估与人工评估的配合
自动化评估可以帮你节省大量时间。最常用的是指标包括:BLEU、ROUGE之类的生成质量指标,面向问答的精确匹配率、检索命中率。但要注意,这些指标并不能真的代表质量。比如ROUGE只能反映字面上的重合度,如果模型换了一种更精炼的表达方式,分数反而低,但你肉眼看着是更好的回答。
所以最终质量判断还是得回归人工评估。我们的流程是:先用自动化指标做粗筛,把明显有问题的样本筛掉;然后对剩余样本人工打分。人工打分要给定评分标准,例如准确性、完整性、格式规范度、安全合规性四个方面,每项1到5分。两个评测人员独立打分再取平均值,比一个人拍脑袋靠谱得多。
还有一个在线评估的视角,就是灰度上线后的真实用户反馈。我在一个内容生成项目的阶段评估里,采取了“AB测试+用户反馈标签”的方式,小流量放出去,观察用户点踩/点赞比例和业务指标变化,这个数据比你自己拉一堆专家评测更有说服力。
6. 部署与推理优化:从模型到服务的最后一公里
部署环节直接决定成本和用户体验。一个“跑不起来”或“贵到用不起”的模型,哪怕效果再好,也没有实际价值。
6.1 显存与算力的提前估算方法
部署前,先算算显存,心里有数。基础模型推理时,加载模型权重本身占一大块显存。以7B模型为例,FP16精度的话,模型权重约14GB。推理过程中还有KV Cache(每一步记录的上下文状态)占用显存,序列越长、并发越大,这部分越大。
实操估算公式我一般这样用:模型权重显存 = 参数量 × 精度字节数;KV Cache显存 ≈ 2(K和V两组) × 层数 × 头维度 × 序列长度 × 并发数 × 精度字节数。把这些加起来,再留出20%-30%的余量,就是单卡需求。
如果是多路并发或长对话场景,KV Cache的占用会迅速膨胀。量化、GQA(分组查询注意力)、PagedAttention(分页管理KV Cache的推理技术)都是为了压这块的开销。
6.2 量化选型与推理框架的实践对比
量化是把模型权重从FP16压缩到INT8甚至INT4,从而降低显存需求,提升推理速度。我试过的主流量化方案里,GPTQ和AWQ在训练后量化里相对稳定,尤其AWQ对精度损失控制更好一些。GGUF量化格式在本地部署和移动设备场景也比较常见,而且它支持分层量化,不同模块用不同精度,比较灵活。
选量化方案时,不能只看显存省了多少,要花时间验证效果。我习惯的做法是拿评估集里的500条样本,分别跑FP16、INT8、INT4三种版本,对比生成质量和关键指标是否有明显差异。我见过一个项目为了极致省显存,直接上INT4量化,结果生成质量肉眼可见变差,用户反馈接踵而至,最后又改回INT8。这个度,一定得用你自己的业务数据来测,不能拍脑袋。
推理框架方面,如果要在高并发场景部署,我优先推荐vLLM,它自带的Continuous Batching(连续批处理)和PagedAttention能明显提升吞吐。想要轻量部署做私有化交付的话,llama.cpp这类方案就很轻便,一个可执行文件加一个模型文件,在普通CPU上也能跑起来。
6.3 服务化架构与并发控制方案
模型推理服务的架构并不复杂,但有几个点必须注意。第一是请求队列的背压机制。高峰来临时,不能让请求无限堆积,否则延迟会整体飙升。我的做法是给服务设置一个硬并发上限,超过就直接返回排队或错误,同时配合消息队列削峰填谷。
第二是多模型版本管理。大模型项目迭代很快,一个服务里可能同时有多个模型版本在用,方便你做AB对比和灰度回滚。我们内部的做法是每个模型部署一个独立服务实例,中间通过网关路由到不同版本,这样某一版本出问题时,切换路由即可,不需要重新部署。
第三是响应流式输出。断词一个词一个词吐出来,能给用户更好的体验,而且能在首个token到达时间上做优化。实现上就是接住流式接口,一条条往客户端推,注意处理好断句边界和网络中断的括号拼接问题。
7. 常见问题与排查技巧实录
大模型项目推进中,有一些问题出现频率极高,我整理一个排查速查表,很多场景可以直接照着检查。
| 问题现象 | 可能原因 | 排查方向 |
|---|---|---|
| 训练Loss不降 | 学习率太小或数据噪音大 | 看数据清洗是否彻底,试调大学习率 |
| Loss先降后涨 | 学习率过大或出现过拟合 | 降低学习率,加早停机制 |
| 生成内容重复单调 | 数据多样性不足或温度参数过低 | 检查数据降采样,调高生成温度 |
| 模型回答与业务无关 | 领域数据配比不足 | 增加领域语料,做增量预训练 |
| 微调后通用能力下降 | 学习率过大或数据太单一 | 调低学习率,混入通用数据 |
| 推理显存不足 | 模型未量化或KV Cache太大 | 尝试8bit量化,限制最大序列长度 |
| 服务端延迟高 | 并发挤占或未开流式输出 | 检查队列堆积,优化批处理机制 |
有一个高频问题我特别想单独拎出来说:数据泄漏。我在一个项目中发现模型在训练集上效果奇好,但在验证集上飘忽不定,最后追根溯源,发现是因为训练流程里的去重环节没做干净,部分验证集样本和训练集样本是同一批原始数据的近似变体。这个现象在具备大量网络搜集语料时很常见。所以,数据切分之前一定要做哈希去重和模糊去重,千万别偷懒。
排查时我还有一个习惯:把一次性失败转成批处理回归。凡是修复过的问题,都会把对应的样本加进回归集里,保证下次训练不会再犯同一个错误。这个做法看起来麻烦,但坚持下来,模型质量的下限会提高很多。
写在最后的一点个人体会
大模型项目,绝对不是一个靠“跑通代码”就能搞定的工作。它更像是在数据、训练、评估、部署之间反复调试的一门手艺活。
我个人在实际操作中最大的体会是,流程感和记录习惯,比某个技巧更重要。数据版本、超参数、评估结果、每次调了什么、效果变化如何,这些信息一定要及时记录下来。不然等你训练到第三轮,就不知道自己上一步是怎么得出当前结论的。
不过也要提醒一句话:不要太迷信网上现成的最佳实践。同一个流程,换一个业务场景,可能就需要调整。比如你在聊天机器人上适用的数据配比,放到金融风控报告生成场景里,可能就跑不通。多跑实验、多记录、多复盘,这套流程真正内化成自己的东西之后,你面对任何新的大模型需求都不会慌。
下一个项目,不妨就按照这套流程从数据开始重新梳理一遍。你会发现,大模型的“玄学”其实没有那么可怕,大多数不稳定因素,背后都有可以解释和可以控制的原因。