我在AI落地行业做了两年多,微调这事儿踩过大坑。说结论:90%的情况下不是模型不行,是你的 prompt 写得太烂。剩下10%,你也没必要微调,换个模型就行了。
我们做了五六个项目,从知识库问答到工单分析到智能报表查询,每个项目都被需求方逼到过“模型效果不好要微调”的死角。关键是每次评估完发现根本不需要。一次都没微调过。不是懒,是真的不划算。
说说怎么判断的。
一个降级测试就够了
效果不好先别急着归因,做一个测试就行:
把你的 prompt 喂给三个模型——便宜的、中等的、旗舰的,同 prompt 跑同批数据。
三个都不行——prompt 的问题,别怀疑。
便宜的不行,中档和旗舰行——模型能力不够,升模型。
三个都差不多但都差一点——prompt 结构有问题,不是措辞的事。
这个测试我们每个项目都做。最后一次是工单分类,拿小参数版、中等参数版和超大参数版三个模型跑同一批数据,同代模型纯看尺寸。小模型准确率61%,中等模型直接78%,大模型到82%。本来需求方说要微调小模型,结果发现直接上中等模型就完了。显存多占一张卡,但省了标注+训练+评估那一整套。
后来又拿新一代的中等尺寸模型跑了一次,同样这批数据,准确率直接84%。
新一代中等模型比旧一代大模型参数少了十几倍,效果反而好。等于用中端车的钱跑出了豪车的效果——就是新一代架构和训练数据碾压。有时候你以为该微调了,其实换个新模型就完事了。
一张高性能显卡市场价不便宜,微调一次标注+训练+评估至少两个礼拜。你自己算。
prompt 的坑,一个一个说
坑一:把 prompt 当命令用
大部分人写 prompt 就像给人下命令:“请根据以下信息判断问题的类别”。然后模型输出一堆正确的废话。
prompt 不是命令,是约束。关键是你得告诉模型边界在哪,而不是让它自己判断方向。
我们做客服问答的时候,prompt 从“请根据检索到的知识库内容回答用户问题”改成“只使用知识库中明确提到的信息回答。如果知识库中没有相关内容,直接说未找到相关信息,不要自行推断”。就这一个改动,幻觉率从23%降到8%。
没换模型,没微调,就改了一行 prompt。
道理说白了就是:大模型的生成空间太大了,你不划边界它就到处跑。告诉它“不要编”比告诉它“要准确”管用得多。后来我们所有项目都改成了这个风格——先写“只能做什么”,再写“遇到边界怎么办”,最后才是格式。反正就是先堵死退路再让它干活。
坑二:few-shot 塞太多
Few-shot 是个好东西,但用多了是毒药。
我们做自然语言转查询的时候,prompt 里塞了40个示例,覆盖各种查询类型。当时感觉挺全的,结果模型遇到新查询反而更差了——被那40个示例框死了,遇到没见过的模式就直接套最近的那个,驴唇不对马嘴。
砍到8个示例,只留最典型的几种,准确率从63%直接到71%。后面又调了两个月才到85%,但关键的提升就是砍示例那一次。
后来跟同行聊发现大家都踩过。示例超过一定数量,模型不是学得更好了,是被分布偏见带偏了。小模型六七个就是极限,你塞30个,它连本来会做的都不会了。
还有一个更坑的:40个示例里只要有3个写得不够精确,模型就会拿这3个当样板。等于你去考试,复习资料里有三道错题,背得越认真考得越惨。
后来学乖了,示例只放人工验证过的、互相不重叠的。宁可少放,不滥放。
坑三:什么都往一个 prompt 里塞
这个坑最深,也是踩了最久才想通的。
工单分析系统,用户输入一段工单描述,模型要做三件事:理解工单内容、判断问题类别、推荐解决方案。一开始三件事塞一个 prompt 里,输出的方案总是张冠李戴——理解对了,分类对了,但推荐的操作是另一个问题的。
怎么调都不对,快心态崩了。
后来拆成三步:第一步只做信息提取,第二步只做分类,第三步才做推荐。三步之间用代码串,每步的 prompt 都很短很精确。
准确率从72%直接到89%。还是同一个模型,没换。
关键就是大模型注意力有限,一个 prompt 塞三个任务,每个都做不精。拆开之后每步 prompt 短了、边界清了,模型每次只做一件事,自然就上来了。
后来所有项目都这么干了。知识库问答拆成“检索+判断+生成”,报表查询拆成“意图识别+查询生成+结果校验”。反正就是一步一脚印,别让模型一心二用。
别忘了还有个 RAG 可以加
很多人一上来就想着微调,其实中间还隔着好几步呢。prompt 改不动了,先试试加个 RAG。
我们做知识库问答就碰到这个情况。prompt 改到极限,幻觉率降到8%卡住了。后来加了个检索层——先从知识库里召回相关段落,再喂给模型。幻觉率直接2%。
等于是之前让模型闭卷考试,现在开卷了。效果能一样吗。
那什么时候真的需要微调
说实话我们评估过微调方案,有两次差点上了。
第一次是特定领域的术语识别。通用识别模型识别不出某些专有组合概念,总拆成零散的词。prompt 怎么写都不行,因为这不是理解问题,是模型分词器和预训练数据里就没见过足够的该领域文本。
最后没微调大模型,加了个小型的领域专用识别模型做前置处理。成本更低效果更好。
第二次是业务规则的优先级判断。两条规则矛盾该听哪条,这个逻辑没法用 prompt 描述——优先级规则本身就是模糊的、上下文相关的。最后用规则引擎解决的,压根不是模型该干的活。
所以真正需要微调的场景其实很窄:模型领域知识不足,且 prompt 和外挂知识库都解决不了。这种场景我就碰到过一次,最后还是绕过去了。
省流:同 prompt 跑三个档位模型定位问题 → prompt 问题就改约束、砍示例、拆步骤 → 不够就加 RAG → 模型问题就升模型,优先换新一代 → 还不行就上规则引擎。微调是最后的手段,不是第一步。