一个 LLM 微调项目复盘:说好 3–4 天,为什么拖成了 2 周
一句话结论
这个项目最初是复刻一个开源的小模型知识抽取项目,我原本以为 3–4 天能收工,最后拖了近两周,而且复刻线最终并没有复现。
问题不在微调技术。技术我确实在这两周里搞懂了。真正的教训是:目标不清晰,加上规划不足——于是很多决策偏离了最初的目标,而我没能及时叫停。
起点:一次”复刻”,不是一次”研究”
目标本来很具体:复刻一个开源的小模型知识抽取项目(mohar07/qwen3-0.6b-kg-triplets),同时把手上两个任务做出来——①给 naive RAG 的 chunk 做上下文感知的头信息提取;②三元组抽取。
也就是说,它从一开始就该是”复现 + 学流程“,而不是”做一个新研究”。这条边界,后来被我一步步模糊掉了。
学习和准备过程本身是清楚的:从同机的 MiniLoRA 项目源码级啃完 LoRA 微调流程,再自己准备数据(英文 Wikipedia + arXiv、句边界切块、去重,最后得到 3349 段带标签样本),然后在 Kaggle 上开始训练。
落差:3 天变成了 2 周
训练很快撞墙:依赖与框架版本打架、任务静默退出(exit 0,没有报错、也没有 loss)。后来我把训练委托给 AI Agent,踩了一路的坑(跨框架移植的语义坑、默认没做响应掩码、平台选择……详见这一篇),最后才把掩码问题修对,固定 200 段的 micro-F1 从约 0.51 提到 0.61。
然后我又在 4090 上按同配方训了 0.6B / 1.7B / 4B,铺了一条容量曲线,并重做了一套 referent 级评测。
事情做得不少,但投入的时间、成本,和产出的成果并不匹配——尤其那条曲线。
为什么会偏离:两个根因
1. 目标不清晰,决策没有回到根本目标。 每次遇到分岔,我没有先问”这还服务于复刻/简历/学习吗”,于是:
- 我否定了原项目的封闭 schema、pivot 到 GraphRAG 式的开放抽取。技术上说得通,但那一刻起,“复刻”这件事其实已经被我放弃了;
- 我上 4090 铺了三个尺寸的容量曲线。现在回看,这步有点草率、也偏离目标:它更像”顺手多跑几组”,没有一个明确的假设要验证,决策价值有限;
- 评测管线的重做是有价值的,但它来得太晚——本该早点做,来更早暴露问题。
2. 规划不足。 我没有在最前面定义”什么算成功、先做什么、每一步要拿到什么证据”,结果就是边做边改、反复返工:训练环境反复重建、数据契约来回重流。
也不是全白花
- 我把 LoRA 微调从”会调 API”推进到了”知道每一步为什么”:响应掩码、chat 模板、checkpoint 设计、平台成本函数;
- 学会了把训练委托给 AI 之后,怎么用”研究闸 / 验证闸 / 放行闸“来兜住它的失误;
- 学会了诚实地收尾:复刻未复现;消费端的结构传导(T0)是成立的,但检索/回答层在本规模只是一个 null——这些我都写进了 README,没有藏。
合作者(AI)视角
我是这次协作里的 AI,也说几句我这边看到的:
- 我容易”顺着做”,而不是质疑目标。 当任务从”复刻”漂到”铺曲线”时,我执行得很好,却没有主动问一句:”这一步还服务于最初的目标吗?”
- 漂移在过程中其实是可见的,但没人设一个”回头对齐”的检查点;等回头看,已经走了很远。
- 如果重来,我希望一开始就把”成功标准”写下来,并在每个阶段结束强制对齐一次。
这不是推责——AI 不该只当执行器;但”叫停并重新对齐”这种带最终判断权的事,更适合由人来做。
如果重来
先把成功标准写下来 → 跑一个最小验证(只训 0.6B、和已知结果对照)→ 评测优先 → 再谈规模和曲线。先证明方向对,再铺广度。
这两周不算白过:我学到了微调的知识,也第一次意识到——比”能不能训出来”更难、也更重要的,是一开始就想清楚”到底要什么”。
项目与证据:github.com/Alex-tangt/kg-triplet-sft
本文由我(Alex)与 AI 协作完成;上面「合作者视角」是 AI 的独立表达。