先说结论:无经验转行大模型这条路,真正卡人的不是算法基础,而是手上有没有一个能讲完整的行业落地项目。我自己就是从非算法岗位转过来的,代码水平撑死算“能跑通”,没有名校背景、没有论文、没有竞赛奖牌,靠的就是某一个精选的行业场景项目,正面硬刚了 QLoRA 微调 + vLLM 部署这条链路,最后在同一个招聘季里拿到 3 个 offer。这篇文章不绕弯子,直接把项目怎么选、数据怎么搞、模型怎么调、服务怎么上、面试怎么讲,一层层掰开给你看。适合那些打算转行大模型、但还没找到破局点的朋友,照着这套思路走,至少能少走我踩过的大半坑。
1. 为什么“1个行业落地项目”比“一堆课程证书”更管用
1.1 面试官在转行者身上到底找什么
我在重新投简历之前,也跟大多数人一样,先囤了一堆网课,Transformer 原理、注意力机制、LangChain 用法、Prompt 工程,刷得头头是道。但真正进入面试环节才发现,面试官对“你学过什么”几乎不感兴趣,他们反复追问的是三件事:
第一,你有没有自己动手跑通过一个完整的模型训练流程,而不是只跑过开源 notebook;第二,你在数据层面有没有真实的理解,模型效果不好时能不能定位到是数据问题还是训练问题;第三,你训练出来的模型能不能变成线上服务,吞吐、延迟、显存这些工程指标心里有没有数。
说白了,现在大模型岗位缺的不是会背结构的人,而是能把模型用起来、能落地、能调优的人。对转行者来说,与其拿十份课程证书证明“我学过”,不如拿一个项目证明“我能做”。一个从数据到微调再到部署的项目,天然覆盖了面试官最关心的能力项,这也是我后来面试屡屡被追问细节、却反而越聊越有底的原因。
1.2 项目选题的取舍逻辑:不要做通用Demo,要做垂直场景
当初我给自己定项目的时候,列过好几个候选:通用对话机器人、RAG 知识库问答、文本分类、行业文档抽取。最后我淘汰了前两个,选了某个垂直行业的售后客服场景。为什么?
通用对话机器人的问题在于同质化太严重,十个转行者八个在做这个,面试官一听开头就知道后面是什么,很难在短时间内感受到你的差异点。RAG 知识库问答虽然热门,但它更多考验的是检索链路和 Prompt 设计,模型训练的部分偏弱,撑不起“微调 + 部署”这个完整故事。
而我最终选的场景是一个电商平台的售后工单分类与政策问答混合任务:用户发来一段售后诉求,模型要判断工单属于哪一类(退款、换货、维修、物流投诉等),如果是政策类问题,还要基于平台给定的售后政策给出明确答复。这个场景的好处有三个:
- 数据相对容易构造,可以基于公开的售后政策文本手工造一批典型问答;
- 任务本身是垂直行业的真实需求,访谈时有明确的业务价值可讲;
- 它同时包含“分类”和“生成”两类任务,能体现代微调对模型能力的整体调整,而不是单一刷一个指标。
这里有个重要经验:项目不怕小,怕的是没有业务闭环。面试官真正想看的是你从业务问题出发,拆解成技术方案,再落地的完整思考过程。哪怕只是“把某个售后场景的答复准确率从 70% 提到 90%”,也比一个泛泛的“智能客服 Demo”更有说服力。
1.3 技术栈选型:为什么是 QLoRA + vLLM
选定场景后,下一个问题就是技术路线。我当时给自己设了两条硬约束:第一,本地只有一张 24GB 显存的卡,预算有限,不可能走全参微调;第二,项目最终要能上线演示,不能只在 notebook 里出个 loss 曲线,必须有实际可调用的服务接口。
这两条约束直接把方案逼出来了:用 QLoRA 做参数高效微调,用 vLLM 做高性能推理部署。QLoRA 把底座模型的显存占用压到极低,让我能在消费级显卡上微调 7B 甚至 13B 量级的模型;vLLM 则解决了推理阶段的吞吐瓶颈,用 PagedAttention 那一套机制把并发能力拉起来。
这个组合在当时的转行圈里已经不算冷门,但真正把它完整跑通、并且能讲清楚每个参数为什么这么设的人并不多。而“细节拆解”恰恰是面试中拉开差距的地方。
2. QLoRA 微调:用 24G 显存把底座模型调出行业手感
2.1 QLoRA 为什么能省显存:4bit 量化与 LoRA 的组合逻辑
先说结论:QLoRA 不是在 LoRA 前面加了个字母,它解决的是“微调底座模型时显存放不下”的问题。
常规 LoRA 只训练低秩适配器,冻结原模型权重,但冻结的权重仍然以 16bit 甚至 32bit 精度放在显存里。一个 7B 模型用 FP16 加载就需要约 14GB 显存,加上梯度、优化器状态和激活值,24GB 卡跑起来已经很紧张,13B 模型基本无望。
QLoRA 的核心思路是先把底座模型量化到 4bit,也就是用 4bit 精度表示权重,7B 模型权重直接降到约 3.5GB 到 4GB,这才给训练留下了充足空间。训练时只更新 LoRA 侧的参数,4bit 的底座权重只参与前向计算。反向传播时,LoRA 部分有独立的梯度,底层量化权重则不更新,因此整体的显存增长被限制住了。
为了弥补 4bit 量化带来的精度损失,QLoRA 有几个设计细节:一是 4bit NormalFloat 量化,按权重分布做分位数量化,奇数位数据分布下比普通整数量化更稳;二是 Double Quantization,对量化常数再做一次量化,进一步省显存;三是 Paged Optimizer,利用内存分页机制管理优化器状态,减少显存峰值。你不需要把它们背得滚瓜烂熟,但面试时能说出这些机制,说明你真读过论文,而不只是调过包。
注意:QLoRA 的“省显存”是拿训练速度换来的。4bit 量化权重在 forward 时需要进行反量化计算,比直接加载 FP16 更慢。所以如果你显存足够,没必要所有任务都无脑上 QLoRA,这也是面试官常挖的一个点。
2.2 构建行业数据集:决定效果上限的关键一步
模型效果的天花板往往不取决于训练脚本,而取决于数据集质量。我在这上面栽过跟头,必须单独说。
最初我图省事,从售后政策文档里抽了几百条原文,简单拼凑成问答对,格式也不统一,有的带角色前缀,有的纯文本。第一次微调跑完,效果惨不忍睹:模型不仅能答错政策,连“退款”和“退货”这种清楚定义的概念都会混淆。后来我花了两周时间重做数据,才把效果拉起来。
我的数据集最终长这样:总量约 8000 条,分三部分。
第一部分是工单分类数据,约 3000 条。每条包含一个用户问题、一个类别标签,类目覆盖退款、换货、维修、物流、售后时效等 8 类。构造方式不是凭空硬编,而是先整理出每一类的典型关键词和句式,再用这些句式组合出不同变体。这里有个关键动作:正负样本比例要控制。比如“退款”类样本不能一边倒,否则模型会把所有含“钱”字的问题都归给退款。
第二部分是政策问答数据,约 4000 条。基于平台的售后政策原文,手工改写出问题变体,比如“七天无理由退换货的具体条件是什么”,改成“我昨天刚收到货,不想要了,能不能退”这种口语化表达。这一部分最耗时间,但也是面试时最能讲出故事的部分——你如何把一个静态政策文档变成模型能学会的对话知识。
第三部分是通用对话数据,约 1000 条,用来缓解灾难性遗忘。当时我用底座模型自带的通用对话样本做了采样,保底模型的闲聊和常识能力。这也是一个容易被忽略的点:很多转行者只塞领域数据,训完发现模型变“傻”了,什么通用问题都回答得僵硬,这就是没有混入通用语料导致的。
数据格式上,我统一成 ChatML 风格的对话模板,没有用简单的“问题\n答案”。原因在于底座模型在指令微调时已经学习了特定模板,你训练时越贴近它原本的格式,迁移效果越好。模板大致长这样:
<|system|> 你是一个电商售后客服助手,请根据售后政策回答用户问题。</|system|> <|user|> 我昨天收到货,不想要了,可以退吗?</|user|> <|assistant|> 如果您购买的商品满足七天无理由退换货条件,可以在签收后7天内申请退款,具体以商品详情页标注为准。</|assistant|>清洗数据时有两个容易踩的坑:一是重复样本不要直接删,要看看是否是高频真实场景,高频问题反而是训练重点;二是没有“标准答案”的文档型材料不要硬塞进问答对,模型会学到“照着念一段政策”的坏习惯,而不是真正理解问题。
2.3 关键训练参数详解与显存计算
数据准备好了,接下来是训练参数。我用的是 Hugging Face 生态的 Transformers + PEFT + bitsandbytes 这条组合。微调的目标模型选择的是某个 7B 量级的开源底座模型,主要原因是它中文能力在线、显存友好、社区资料多。
核心训练参数我整理成了一张表,方便直接抄作业:
| 参数 | 我的取值 | 设置逻辑 |
|---|---|---|
| lora_r | 16 | 秩越大可学习容量越大,但太小学不住、太大浪费。7B 模型 8~16 都是常见区间 |
| lora_alpha | 32 | 缩放系数,一般取 lora_r 的 2 倍,让权重更新幅度适当放大 |
| lora_dropout | 0.05 | 防止适配器过拟合,领域数据量不大时 dropout 不要设 0 |
| target_modules | q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj | 全部线性层都加 LoRA,比默认只改注意力层效果更稳 |
| learning_rate | 2e-4 | LoRA 微调常用区间是 1e-4 到 3e-4,太大容易 NaN,太小收敛慢 |
| per_device_train_batch_size | 2 | 24G 显存跑 7B QLoRA,batch_size 2 加梯度累积 8,等效 16 |
| gradient_accumulation_steps | 8 | 用小 batch 模拟大 batch,稳定梯度更新 |
| num_epochs | 3 | 数据量 8000 条,epochs 3 足够,再多会过拟合 |
| max_seq_length | 1024 | 售后问答一般不会超过这个长度,控制显存和训练速度 |
| learning_rate_scheduler | cosine | loss 下降更平滑,后期不容易震荡 |
关于显存,我实际观察到的占用情况比很多人想象中低。7B 模型 4bit 加载后基础权重约 4GB,LoRA 适配器参数不到 100MB,激活值和优化器状态取决于 batch size 和序列长度,batch_size 2、max_seq_length 1024 的情况下,峰值显存大约在 12GB 到 15GB 之间。也就是说,一张 24GB 的卡不但能跑 7B,甚至可以尝试 13B 模型。换到 13B 模型,4bit 权重约 7GB,显存峰值大概 20GB 上下,刚好卡在 24GB 卡的边缘,代价是 batch size 必须降到 1。我当时为了求稳,还是留在 7B,把节省下来的显存用来加了更多通用数据。
训练过程中还有一个容易忽视的细节:量化模型加载时要用双卡兼容模式去避免 bitsandbytes 在 CPU offload 时的隐性 bug。具体来说就是加载模型时设置device_map="auto",但load_in_4bit的配置里不要手动指定device_map="cuda:0",否则在后续保存 LoRA adapter 时可能出现权重错位。这个问题我在第一次实验时遇到过,最后是重新加载模型才解决。
2.4 训练中的 loss 观察与调优
训练不是把脚本跑完就结束,观察 loss 曲线是判断模型是否学到位的关键手段。
我当时的训练日志大致是:起步 loss 在 1.8 左右,前 200 步快速降到 1.2,随后慢慢降到 0.9 附近,最终收敛在 0.85 左右。这个下降趋势比较健康。如果你看到 loss 在某个点突然跳高,先检查学习率是不是太大;如果 loss 下降很慢,先怀疑数据格式是否统一,而不是急着加训练轮次。
比较隐蔽的问题是 eval loss 和 train loss 的背离。训练集 loss 降到 0.7,但验证集 loss 不降反升,这是过拟合的典型信号。我第一版只塞领域数据时就是这个状态,模型把训练样本的措辞背下来了,换个说法就不会了。解决办法就是加入通用数据、增加 dropout、提前停止。
还有一个很多人会忽略的判断维度:微调后模型在领域外的表现有没有垮掉。我专门准备了一组“不相关但通用”的测试用例,比如“写一首关于夏天的短诗”“解释什么是光合作用”,用来检测灾难性遗忘。如果领域能力提升了、通用能力崩了,那这个项目在面试里会被追问得很惨,因为你没有证明自己理解“模型能力平衡”这件事。
实操中我建议每跑完一个 epoch 做一次中间评估,不一定要用复杂指标,直接把几个典型问题输进去看回答质量。这样你不仅能判断训练状态,事后整理面试材料时也有现成的中间结果可讲。
3. vLLM 部署:把微调模型变成能抗并发的高效服务
3.1 为什么选 vLLM:PagedAttention 解决的是显存碎片问题
模型训完只是第一步,项目要“落地”,必须有一个能对外提供服务的接口。当时我第一个想法是直接用 Transformers 的generate方法包一个 Flask 服务,简单是简单,但测下来并发一高延迟就失控,而且显存利用率很低。
问题出在传统推理框架的 KV Cache 管理上。推理时每生成一个 token,都要把历史 token 的 Key 和 Value 缓存下来,这段缓存是动态增长的,不同请求的缓存长度不同。传统框架会给每个请求预留一整块连续显存,预留太大浪费、太小放不下,显存碎片化严重。
vLLM 的核心贡献是 PagedAttention,它把 KV Cache 切成固定大小的块,按需分配,不要求连续存储。这有点像操作系统里的分页内存管理——不追求物理连续,只保证逻辑连续,显存利用率直线上升。配合 Continuous Batching 机制,vLLM 可以在一个 batch 里动态塞入新请求和踢出已完成请求,吞吐量相比传统方案能提升一个数量级。
表格对比更直观:
| 对比维度 | Transformers + Flask | vLLM |
|---|---|---|
| KV Cache 管理 | 预分配连续显存 | 分页按需分配 |
| 请求批处理 | 无或静态批处理 | 连续批处理 |
| 并发吞吐 | 低,几个请求即拥塞 | 高,可稳定支撑几十路并发 |
| API 兼容性 | 需自己封装 | 原生兼容 OpenAI API 格式 |
我当时选择 vLLM 还有一个很现实的原因:它直接提供了 OpenAI 兼容接口,对接业务系统的成本几乎为零,后面的项目演示、接口测试都非常省事。
3.2 权重合并与模型加载:QLoRA 训练完不能直接部署
QLoRA 训练完后,保存下来的只是 LoRA adapter 权重,而不是完整模型。vLLM 本身虽然现在也支持直接加载 adapter,但当时最稳的做法是先做权重合并,再部署完整模型。
权重合并的路径很简单:训练时用peft库的save_pretrained保存 adapter,然后用merge_and_unload()方法把 LoRA 权重合并回底座模型,再save_pretrained保存成一个完整模型目录。关键坑在这里:合并时要以 FP16 精度加载底座模型,不要继续以 4bit 加载。否则合并出来的权重精度不对,推理结果可能越来越飘。
我当时的伪代码大致是这样的:
from transformers import AutoModelForCausalLM, AutoTokenizer from peft import PeftModel # 以 FP16 加载原底座模型 base_model = AutoModelForCausalLM.from_pretrained( "your_base_model_path", torch_dtype=torch.float16, device_map="auto" ) # 加载 LoRA adapter 并合并 model = PeftModel.from_pretrained(base_model, "your_lora_adapter_path") merged_model = model.merge_and_unload() # 保存合并后的完整模型 merged_model.save_pretrained("./merged_model") tokenizer.save_pretrained("./merged_model")合并后要检查一下模型目录里是否存在adapter_config.json,如果有建议删掉或移走,避免后续 vLLM 启动时误判加载不到 LoRA 而报错。我在这上面耽误过一下午,症状是 vLLM 启动后模型加载成功,但生成结果跟训练时完全对不上,追了半天发现是它自动把 adapter 也挂上去了。
模型张量并行方面,我只有一张卡,所以tensor_parallel_size设的是 1。这里提醒一点,vLLM 对多卡支持很成熟,但如果你想让项目表现得更工程化,可以在面试材料里说明你理解张量并行的原理,不必真的部署多卡。
3.3 vLLM 关键参数与性能调优
vLLM 启动命令里参数不多,但每个都直接影响服务的性能和稳定性。我实际用的启动命令大致是:
python -m vllm.entrypoints.openai.api_server \ --model ./merged_model \ --tokenizer ./merged_model \ --tensor-parallel-size 1 \ --gpu-memory-utilization 0.90 \ --max-model-len 2048 \ --max-num-seqs 16 \ --enforce-eagergpu-memory-utilization是我调得最多的参数。它控制 vLLM 预留多少比例的显存作为 KV Cache。设太高,比如 0.98,在请求长度波动大的时候容易 OOM;设太低,吞吐上不去。对 24GB 单卡、模型权重 FP16 约 14GB 的场景,我最终稳定在 0.90,留出约 8GB 给 KV Cache。
max-model-len决定了允许的最大序列长度,包括输入和输出。我做的是售后场景,业务上很少出现超长上下文,所以设置为 2048,这样能让 KV Cache 容纳更多请求。如果你做的是文档长文本问答,这里就要相应放大,但要接受并发量下降。
max-num-seqs控制一个 batch 里最多同时处理的序列数。16 是单卡比较中庸的数值。调大它会提高吞吐,但也会增加单次推理的延迟,适合离线批量任务;在线服务需要平衡响应时间,我见过有人为了压 P99 延迟把它调到 8 甚至 4,这个要根据实际压测结果来。
启动完成后,我用vllm自带的客户端脚本做了并发测试,也用 Python 请求库直接打接口验了一下延迟。简单压测结果:并发 20 路时,平均首 token 延迟约 400ms,总吞吐大约 30 到 40 请求每秒,对比之前 Flask 方案的个位数 QPS,提升非常明显。面试时能报出这几个数字,比任何形容词都有力。
3.4 上线后的稳定性经验:预热、超时、降级
项目能跑通和能稳定演示是两回事。我在实际演示前吃过一次亏:服务刚启动,第一个请求就超时,原因是模型权重刚加载到显存,还没完成预热,多个请求同时进来时会触发底层初始化开销。后来的做法是先发几个请求“加热”服务,再开始正式压测或演示。
另一个经验是超时设置。vLLM 接口默认的生成速度与输入长度有关,如果业务侧没有设置合理的超时时间,可能出现前端等不到响应就报错,而服务端其实还在生成。我当时的做法是把业务接口超时设置为 30 秒,同时在 Prompt 设计层面限制输出长度,防止模型生成冗长文本拖垮响应。
降级方案也很重要。这虽然不是面试必需,但提一嘴会显得你有生产环境思维。我当时在接口外面做了一个简单的缓存层:相同问题的回答,在缓存有效期内直接返回,不给 vLLM 增加压力。这个方案让演示时的高频问题几乎秒回,还顺带降低了显存占用峰值的出现概率。
4. 面试复盘:项目是敲门砖,讲法才是分水岭
4.1 30 秒讲清楚你的项目:结构化描述
面试时第一关永远是自我介绍和项目概述。我准备了一个 30 秒版本,结构是“业务背景 + 技术方案 + 核心结果 + 我的角色”。
当时的大致话术是:
我做的是一个电商售后场景的智能客服项目。业务上需要把用户售后诉求自动分类,并基于平台政策生成答复。我用 QLoRA 在 7B 开源底座上做了领域微调,自建了约 8000 条数据,覆盖工单分类和政策问答两个任务。微调后模型在分类 F1 上比基线提升了约 15 个百分点,政策答复的相关性也有明显改善。之后用 vLLM 把模型部署成 OpenAI 兼容接口,单卡并发 20 路时吞吐稳定在 30 请求每秒左右。整个项目从数据处理、模型微调、效果评估到服务部署都是我独立完成。
这段话没有一句废话,每个数字都是真实可查的。更重要的是,它把面试官可能感兴趣的每一个点都主动暴露出来:数据怎么构造、QLoRA 怎么调、为什么部署用 vLLM、量化指标是什么。面试官顺着任何一个点深挖,你都有内容可讲,这就掌握了面试节奏。
4.2 高频追问与回应思路
面试中我被反复追问的问题,我把它们归纳成三类,并附上我认为最有效的回应思路。
第一类是原理确认型,比如“QLoRA 和全参微调的本质区别是什么”。不要只答“QLoRA 省显存”,要说到位:全参微调更新所有原始权重,显存和算力需求随模型规模线性增长;QLoRA 把原始权重冻结在 4bit 精度,只通过低秩矩阵模拟权重更新,显存瓶颈被打破,代价是精度和训练速度的折中。你还可以补一句:“领域数据量不大时,低秩适配器完全够用;数据量极大时,可以尝试先 QLoRA 再全参增量训练,这算是混合方案。”
第二类是工程判断型,比如“为什么用 vLLM,用 FastAPI 包一层不是一样吗”。这时候把 PagedAttention 和 Continuous Batching 讲清楚,然后补上压测数据,说明传统方案在并发场景下的瓶颈是显存碎片和批处理能力不够,不是简单的代码封装问题。这类问题的核心是考察你是否有生产环境意识。
第三类是开放设计型,比如“如果给你一张 A100,你会怎么改进这个项目”。我当时的回答是:先用同样的数据把底座模型换成 13B 或更大规模,验证参数量带来的收益;然后把 QLoRA 换成全参微调或更大幅度的增量训练,对比效果;最后用更大的max-model-len处理更长的政策文档,并加入长文本检索环节,让模型在多个政策条文之间做交叉引用。这个答案向面试官传递的信息是:你不只会跑通一条管线,还知道资源升级后每一步该怎么选择。
4.3 3 个 offer 的对比与最终选择
拿到 3 个 offer 的过程不展开了,直接说结论。类型上有明显的差异:A 是偏算法研究的岗位,主要任务是在开源模型上做各种微调实验,方向更前沿但对论文阅读能力要求高;B 是大模型应用方向,核心是把模型接入具体业务流程,做接口、做 Agent、做效果优化;C 偏 AI 平台工程,重点是搭建推理底座,让模型服务高可用、高并发。
我最终选了 B,原因有三:第一,我的优势在于“应用闭环”而非论文推导,B 类岗位能最大化这个优势;第二,B 类岗位离业务数据更近,能持续积累行业理解,这恰恰是纯算法岗很难快速获得的东西;第三,从职业发展看,大模型应用层的人才缺口比平台层更亲民,转行者可以在应用中慢慢补算法短板。
有一点值得说:3 个 offer 里,A 给的钱略高,但技术栈偏“实验室”,我综合判断后还是选了 B。转行的第一份工作,平台和成长性比初始薪资重要,这个选择后来被验证是对的。
5. 转行实操中的独家经验:准备、打磨、包装
5.1 把项目过程变成一份“可浏览的作品集”
很多转行者做完项目就停了,这是最大的浪费。我建议把项目过程整理成一份图文文档,包含三部分:一是数据样例截图,展示清洗前后的对比,体现数据敏感度;二是训练曲线和评测结果,我直接把 TensorBoard 的 loss 曲线截图、分类 F1 对比表格放进去;三是接口压测记录,包括并发测试脚本输出和响应时间截图。
这份文档不需要是正式论文,更像是你在 GitHub 仓库里放的 README Plus。面试时如果允许,直接屏幕共享翻给面试官看,比空口说“我做了个项目”有冲击力得多。我面试时有好几次,面试官看到训练损失曲线和并发压测结果后,追问的方向明显从“怀疑你的能力”变成了“跟你讨论技术细节”。
5.2 踩坑记录是最有价值的面试弹药
面试官特别喜欢问“你遇到的困难是什么”。大部分候选人只会说“数据不够、效果不好”这种场面话。我把实际踩过的坑整理成了一个小清单,每个坑都讲了现象、排查过程和最终解法。比如:
- 训练中期 loss 出现 NaN,排查半天是学习率设到了 1e-3,QLoRA 的 4bit 参数对大幅度更新非常敏感,降到 2e-4 后恢复稳定;
- 保存 LoRA adapter 后 vLLM 加载生成结果不对,原因是合并权重时没有用 FP16 加载底座,而是沿用了训练时的 4bit 加载;
- 并发压测时第一个请求总是超时,后来确认是模型预热问题,启动后先发几条探活请求即可。
这些坑看起来小,但在面试里每一个都能证明你是“亲手做过”而不是“看教程做过”。真实的失败经历和修复过程,比完美的项目陈述更打动人。
5.3 零基础入门的时间分配建议
如果让我重来一次,我会把时间按这个比例分配:选题和业务理解占两成,数据构建占三成,训练调试占两成,部署压测占两成,面试材料整理占一成。很多人把八成时间耗在学理论知识上,数据只花两天拼凑,结果训出来的模型效果平平,面试时也没素材可讲。
按照我实际的项目节奏,从零开始到完全跑通,全职投入大约五周:第一周定场景和搭环境,第二周到第三周做数据和第一个版本训练,第四周调优和部署,第五周压测、整理文档、准备面试讲法。如果是在职准备,时间线翻倍到两到三个月也很正常,核心是不要拖,每月必须有一个可见的产出节点。
最后再分享一个小技巧:在项目完成后,把你训练出的模型生成一个“效果前后对比”的视频或录屏,比如同一个问题,用底座模型回答一遍,再用微调模型回答一遍,有条件的加一组并发请求的实时监控画面。这份材料在面试里是一个记忆点极强的加分项。很多时候,面试官一天见很多人,能让他记住你的,不是一份漂亮的简历,而是一段让他觉得“这人是真干过”的现场演示。