模型越强,微调越弱:到底什么时候该微调?
手里有些AI岗位;想找工作的同学可联系,急缺高级产品经理
关注公众号,回复1,与我交个朋友吧
书接上文:简单聊一聊微调
代码:https://gitee.com/holyshare/model_fune_tuning
当时因为是创业项目空气小猪(AI+英语)的发布周,我在到处当客服,线上一堆BUG,程序员也不想搭理我,所以整体写得没那么细,学员是懂了一些又没全懂,于是今天补充一篇简单的。
首先依旧必须重复昨天的问题:当前模型如此强大的情况下,提示词可以完成很多工作,所以为什么还要微调?
WHY 微调
当前AI应用开发有个实际的情况:很多微调能做的事情完全可以用提示词搞定,于是这也很容易让我们产生一个幻觉:提示词和微调是一样的,他们都影响了模型的输出预测,非要说哪里不一样,可能微调的特化能力强一些吧。
但其实两者的本质有很大的区别:提示词属于“引导”,而微调是“改造”,其中所谓泛化能力强弱的关键在于,提示词属于输入级别的控制,而微调是参数级别的迁移,会直接影响模型的“脑回路”,最直接的影响是对某些任务变敏感了。
比如以下几个场景都可以直接使用提示词,又总是会在一些情况下需要用到微调:
简单意图识别
任务:把一句管理口语判为以下 5 个意图之一
A 目标不清
B 忙闲不均
C 管理者精力不足
D 员工精力不足
E 沟通迟滞
这个场景用提示词轻松搞定:
用户:A组加班到半夜,B组一堆人闲着刷手机
输出:{"label":"B"}
用户:产品目标周周变,大家都不知道先做哪个
输出:{"label":"A"}
在这种主流的表述中提示词准确率非常高,绝对的95%+,但在遭遇以下场景时可能会打折扣。
一、表述变异过大。当出现大量方言、口语化表达、行业黑话甚至错别字时,就有点麻烦了,比如:俺们组肝到秃头,隔壁组摸鱼划水?那还加锤子班?
二、多重转折。如果一个句式表达了多重意图,模型也可能出错,比如:虽然不像以前那么忙了,但是目标天天变,更累了。
三、边界模糊。还是上述的问题,虽然不是多重转折了,但同时表达多个特征,并且没有倾向性,就像捣蛋一样,这种不同模型的答案会不一样,这会直接影响稳定性,比如:老板口径每天变 vs 岗位职责说不清。
如果是发现产品在这块不稳定,提示词怎么都调不好,那么就需要微调出场了:
{"text": "俺们组肝到秃头,隔壁组摸鱼划水", "label": "B"}
{"text": "虽然不像以前那么忙了,但是目标天天变,更累了", "label": "A"}
{"text": "老板和大伙儿都蔫儿了,干啥都提不起劲", "label": "C"} // 融合了C和D,需根据定义明确标注
槽位抽取/关键词提取
这个是大模型过程中常见的任务,一般用于:判断一句话中是否出现或否定了多个特定概念。
用户:不是大家偷懒,更像任务拆分有问题
输出:{"present":[], "negated":["管理者长期疲惫影响节奏"]}
用户:A线忙疯了,B线一堆人闲着
输出:{"present":["部分人很忙、部分人很闲"], "negated":[]}
当对任务对判断的准确率要求极高,且提示词在复杂否定句上错误频发时,便需要微调登场了:
{
"text": "我觉得不是员工精力不足,而是管理者不会分配任务",
"output": {
"present": [],
"negated": ["管理者精力不足"]
}
}
其实上述场景因为是管理场景还算简单的,因为模型本身对这些问题多少有些熟悉,但如果这里的特定概念是公司的黑话的话,那么复杂度就提升了,是一点都不能依赖模型能力,这里做法只有两点,要么提示词每次带上说明,要么真的只能微调了。
微调是笨办法
从上述案例也可以看出来:微调其实也是很笨的办法,比如当遇到含糊不清/标签定义重叠/用户说法自相矛盾的场景,他也无力...
而且这是个前期ROI很低的事,一定是要面对海量的需求才用微调,比如在万级以上的处理时,1%的错误就是100个客户被错误分类,那么这个时候就值得做,也不好在提示词里面手动搞案例了。
另外,我实际在槽位抽取这里会用到微调的原因也不是什么准不准的问题,完全就是因为我想要更快的响应,并且就是用小模型微调,所以他根本不存在让大模型记住这些黑话的场景,当前来说依旧是提示词更好用。
所以,我们这里就来说说这个复杂、独特或模糊的分类任务,也就是常说的意图识别和槽位抽取(关键词提取)。
意图识别
在进行槽位抽取(关键词提取)一块的内容前,我们特别聊一下意图识别能不能用小模型替换的问题;就我个人的实践来说,答案是悲观的。
如果是简单场景的AI问答,比如常见的知识库,完全可以启用微调小模型,但如果是复杂场景,比如医疗AI中的慢病管理系统、复杂的客服系统这种东西,小模型是吃不消的。
原因是这些场景里面其实对语义理解要求挺高的,因为他其实需要从10多轮聊天中判断自己接下来该干什么,我举个例子:
系统一共有ABCDE五个意图,并且用户可能随便切换,而且从A切到B后,聊几句他又想切回A,并且这是非常正常的操作。
比如用户线抱怨了下产品,马上就问有没有什么优惠条件,接着就去询问新产品,这都是有可能的;
又比如说慢病管理体系,患者先是寻求诊断,中途突然问医保信息,完了又要问某个药品的信息,最后又回归问诊流程,这种行为正常医生可能马上就一巴掌呼过去了,但AI场景下是一定会发生,并且是正常逻辑。
只不过,这不再是简单的单句分类,而是需要模型具备对话状态追踪的能力。它必须理解整个对话的上下文脉络,并据此决定当前的正确行动。
综上,AI多轮问答类项目,还是建议使用大模型,不建议做微调,或者小模型做初筛,置信度低的时候再启用大模型,这是可以的...
最后回归微调大主题,我们来说下关键词抽取。
概念抽取/多标签分类
关键词提取是非常经典并且当前还真的有需要的微调场景,需要将多变、模糊、非结构化的用户口语输入,准确无误地映射到固定、明确、结构化的专业术语体系输出上
这正命中微调的核心任务:教会模型一套新的、特定的语言或分类体系。
首先要明白,提示词在这个场景下其实是有点麻烦的,原因很简单:少量样本学习 (Few-shot)搞不定,确实太多了!
比如:提示词中当然可以将“刻骨铭心的头疼”、“脑壳痛”、“脑袋嗡嗡的”都全部映射到头痛这个标签。
但除了头痛还有胸痛、屁股痛、耳朵痛呢,当前医学上记录到的症状数量非常庞大,按常用本体约在1–3万级,若扩展到“临床发现”层级(含症状/体征等)则达十万量级。
如果这十万量级每个再扩展个10个口语马上就百万级别了,所以这种东西是没办法放到提示词的。
这样说起来比较虚,还是来一个实际案例:
员工调查
在之前我做管理咨询的时候,会有一个行为叫员工调查,他是一种定期、简短的员工反馈机制,旨在持续跟踪员工的满意度。
这类调查经常包含开放式问答,员工可以填写自由文本表达意见和建议。然而,大量非结构化的文本反馈给分析带来巨大挑战:不同员工可能用多种措辞讨论相似主题,导致难以直接量化和比较。
为了解决这个问题,当时是做了一个关键词归一化的任务,通过构建AI模型将员工的自由文本评论归类到预先定义的一组标准化关键词(主题类别)上,这也是典型的小模型微调场景了。
关键词归一化
关键词归一化这个是各种AI项目非常典型的任务,这个场景是指将不同员工在反馈中使用的各种表述,映射到统一的主题关键词上,比如:
不同员工可能用“薪水低”、“工资不满意”、“待遇需要提高”等不同说法来表达关于薪酬福利的诉求,通过关键词归一化,这些不同措辞都归入统一的“薪酬与福利”类别下,方便统计和比较。
类似的,“领导沟通不足”和“经理不听取意见”可以归为“管理沟通”类别。这种归一化的结果是可以极大的简化我某部分提示词的设计。
数据治理
归一化的前提是有关键词,并且整个系统只有一套关键词。以当时一次实际收集情况来说,8000条员工评论,每条评论平均长度约为20~50个字,涵盖了从工作环境、薪资福利到职业发展、管理沟通等各方面内容。
接下来就是微调前期的数据处理工作流:
一、数据清洗
主要工作很简单,首先是脱敏、其次是一些错别字、格式上的优化,这种完全是体力活。
二、重要:归并术语表
这个是最重要的一步,这个术语表后续会形成结构化的知识库,甚至会全系统使用,绝对要保证其对一份!
实际工作就是将穷举后的评语进行分类,比如:加班”与“加点”、“工作与生活平衡”与“劳逸结合”、“领导”与“老板”等。
而后就是各种数据标注开始了,例如要求标注者看到“工资”“薪水”“收入”都统一标记为“薪酬与福利”类。
三、数据集划分
完成清洗和预处理后,我们要对数据进行了数据集划分,用于模型训练和评估,比如:80%作为训练集,10%验证集,10%测试集。
具体分层抽样时,要确保各主要类别在三份数据集中大致按相同比例出现,以避免某些类别只出现在训练集而未在验证/测试集充分覆盖。
四、数据增强
在基本数据集准备好后,就可以用AI“耍点手段”了,要扩大样本量,例如为每条训练样本生成带同义词替换的额外句子,从而扩大训练数据量并改善模型对不同表述的泛化能力。
数据增强具体方法包括:基于同义词词典随机替换部分词语、轻微改变句式,如把陈述句改为“我觉得...”引导的形式等。这些方法均在不改变原始语义的前提下增加了数据多样性,提高模型鲁棒性。
无论是微调还是RAG,数据工程一直是AI项目中最为重要的部分,涉及最终成败,不可不慎。
如果是大型AI项目做数据工程会有严格的质检流程,通常是需要一个后台系统、或者标注工具的,我们这里是简单场景,直接上AI表格就好,最终会形成一个清单:
术语清单
| 薪酬与福利 | ||
| 职业发展 | ||
| 工作与生活平衡 | ||
| 管理支持 | ||
| 团队协作 | ||
| 公司愿景与文化 | ||
| 沟通透明度 | ||
| 工作环境 | ||
| 制度与流程 | ||
| 认可与激励 | ||
| 客户导向 | ||
| 其他 |
上述每个类别都有明确的边界和涵盖范围说明,以指导标注和模型学习。需要注意,有些类别之间可能存在关联,如“管理支持”与“沟通透明度”常有关联,管理不支持往往体现为沟通不畅。
但在标注时我们要求就事论事,按照反馈内容直接提及的主题分类,避免因类别关联而过度延展。
例如:“领导没有及时分享公司战略”主要标记为“沟通透明度”,不标记“管理支持”,尽管这是管理行为的一部分,以保持标签独立性。这种约定在标签定义阶段已就要明确。
并且真实场景会有非常复杂的层级关系,我们这里只是做案例说明便不延展了...
任务定义
数据准备好了,就要进入微调任务设定,这里事实上是一个多标签文本分类任务:输入为一段员工的开放式反馈文本,输出为该文本所属的一个或多个预定义类别(关键词)。
与一般的单标签分类不同,多标签意味着每条反馈可能对应多个主题关键词。例如,一条反馈“薪资不高,加班又多,希望领导合理安排工作”同时涉及“薪酬与福利”、“工作与生活平衡”、“管理支持”三个主题。
经过上述的处理,基本需求和数据也就七七八八了,接下来我们就要进行微调环节了,只不过在此之前,我们要思考下:到底选什么模型?
微调模型选择
如果无脑选择的话,直接上Qwen32B就好,只不过当前场景其实仔细思考,可能他并不是最优解。
近两年基座模型发展迅速,大家听得较多的都是GPT、Claude、DeepSeek、Qwen、智谱等偏文字推理型模型,事实上在关键词提取这种任务上,他们可能赶不上BERT。
关于这个小领域的讨论有很多,我印象比较深刻的是《Are We Really Making Much Progress in Text Classification? A Comparative Review》,这是一篇批判性研究报告,他的核心观点是:
在文本分类领域,许多新提出的、复杂的深度学习模型所声称的“巨大进步”可能被严重高估了。论文通过大规模、系统的对比实验证明,一些简单、经典的基线模型(如线性模型)的性能被长期低估,它们往往能与甚至超越许多新提出的复杂模型,尤其是在标准基准数据集上。
我们这的任务是多标签分类,即一段文本可能同时属于多个类别(如“薪酬”和“加班”)。这需要模型为每个类别输出一个独立的概率。
从模型架构上看,编码器模型(如BERT)是为分类任务而生的,而生成式LLM是在“模拟”分类任务,存在先天架构劣势。
并且论文数据和实践表明,BERT类模型在分类任务上性能顶尖,且训练和推理效率远超LLM,部署成本低数个量级。
最终,我们选择用 RoBERTa-wwm-ext,工大发布的基于BERT的中文模型,其参数量约1.1亿(我们做demo选得小,实际可以选性能好点的)。
具体微调
具体到微调过程中会出现很多专有名词,比如:
全参数微调(Full Fine-tuning); 部分参数微调(Partial Fine-tuning); 参数高效微调(PEFT, Parameter-Efficient Fine-Tuning); 学习率。控制参数更新的步长; batch size。每次迭代训练时输入的样本数量; 训练轮数。完整遍历数据集的次数; 最大序列长度。输入文本截断或填充到的最大 token 数; 学习率调度器; ...
这些专业名词,在各位具体训练时候自然会慢慢理解,我们这里不做介绍,但有个词一定要理解“
拟合
拟合是训练过程中非常核心的概念,尤其是微调本质是去做具体任务,他很类似我们的学生考试:
欠拟合,学生根本没好好复习,只看了几眼目录,考试时,题目(训练数据)和没见过的题(测试数据)他都做不好,他没学会知识本身。
欠拟合的原因往往是模型太蠢,或者训练数据集特征太少,无法有效表征数据,不然就是训练有问题。
过拟合,学生没有理解知识,而是死记硬背下了所有习题和答案,考试时,如果出现原题,他能得满分;但只要题目稍微一变(测试数据),他就完全不会做了,他只记住了题目,没学会解题方法。
过拟合的原因往往是训练数据量不足,模型没学到规律;或者训练数据集里面噪音过多,最终体现出来就是没得泛化能力。
总而言之:效果不行就搞数据。随后便可以进入训练环节。
实际训练
微调模型的关键在于数据,而如何获取高质量的数据始终是一个难题,当前具体方法无非三种:
人工标注:虽然准确性较高,但成本昂贵、效率低下; 大模型生成:能够快速产出大规模数据,但质量参差不齐; 大模型生成 + 人工审核与标注:在效率和质量之间找到平衡,是当前较为常见的方案;
我这里没办法把实际用的数据集拿出来,所以就用AI生成一些大家感受下过程即可。
然后 ConardLi 这个开源项目 可以帮助我们快速从文本、PDF等文件中,自动生成问题、答案:
最后是一些训练数据样例:
{"text": "系统经常卡死,沟通效率低", "labels": ["TOOLING_ISSUE", "COMMUNICATION"]}
{"text": "网络不稳定,压力很大", "labels": ["TOOLING_ISSUE", "WORKLOAD"]}
{"text": "发展渠道不开放,补贴取消了", "labels": ["CAREER_GROWTH", "COMPENSATION"]}
{"text": "系统经常卡死", "labels": ["TOOLING_ISSUE"]}
{"text": "决策不清楚", "labels": ["COMMUNICATION"]}
{"text": "任务排得太满", "labels": ["WORKLOAD"]}
然后是训练样本集:
| 合计 | 1208 |
训练参数:
这里代码数据量过大我就不上传了,后面放git上大家自己去看吧:
训练结果
输入:加班太多了
输出:COMPENSATION: 0.532; CAREER_GROWTH: 0.407; WORKLOAD: 0.392; TOOLING_ISSUE: 0.306; COMMUNICATION: 0.216; MANAGER_SUPPORT: 0.196
输入:加班
输出:COMPENSATION: 0.502; WORKLOAD: 0.447; CAREER_GROWTH: 0.366; TOOLING_ISSUE: 0.331; COMMUNICATION: 0.211; MANAGER_SUPPORT: 0.196
输入:加班像常态
输出:COMPENSATION: 0.461; WORKLOAD: 0.362; CAREER_GROWTH: 0.360; TOOLING_ISSUE: 0.291; COMMUNICATION: 0.221; MANAGER_SUPPORT: 0.190
从上面的数据来看:模型已经学到了一些东西,但是效果很差!主要两点:
类别边界模糊:样本量不足或类别不平衡; 标签分布偏差:“加班” 可能被标注到不同的标签,模型学歪了;
所以,我们增加数据集,调高学习率和训练轮次:
增加训练数据
| 合计 | 6650 |
训练参数:
训练结果如下:
但是从结果来看,泛化能力不足,过拟合了:
事实上这里很多原因就是训练数据集质量差所致
再次训练
为提高泛化能力,换了个模型整理数据放到一起,再次增加数据量:
训练集:8539 条 验证集:1176 条 测试集:1199 条
为减少过拟合并提升训练稳定性,对训练参数进行了调整:
训练轮数:从 3 轮减少到 2 轮 学习率 :从 2e-5 降低到 1e-5 批次大小:从 16 减少到 8 权重衰减:从 0.01 增加到 0.05
还在这个基础上做了正则化增强与早停机制,再次训练:
其结果为:
这个就是全参微调,我们再简单测试下LORA微调:
LORA微调
训练参数:
训练数据集:8539条 验证数据集:1176条 测试数据集:1199条 训练轮数:2轮 学习率:5e-4 批次大小:32 权重衰减:0.01
小结
主要的实验数据汇总:
我们测试一下几个问题:加班太多了、加班、加班是常态、经常加班、加班压力大、天天加班。几个模型输出workload标签的概率:
从前面几个问题的结果来看,LoRA 微调的效果相对最佳,不过,当前的简单测试只能反映模型表现的一部分,特别是这里的数据质量真的很差...
模型评测
最后简单说下模型评测,上述的评测方式显然不行,业内现在已经有较成熟的方法做模型全面的评估,只不过这些效果好不好又得另说了,原因很简单:搞数据很烦,高高质量数据特别烦!
比如,要做模型评测要回答几个核心问题:
评测集怎么来?
人工打标签或者用现成的公开数据集(比如MMLU、CMMLU这些通用知识库,C-Eval中文测评集,GSM8K数学题集)确实可以提供,但一到具体场景全傻眼:想要评估什么能力就准备对应的数据集,那么就要深入相关行业。
如何量化模型能力?
这里有些通用的方法:
分类任务:看正确率和误判容忍度; 文本生成类:用BLEU(像拼图相似度)、ROUGE(重叠率)、ChrF(字符级相似)这些指标; 问答场景:追求一字不差(Exact Match)或者关键信息匹配(Token-level Match); 语言模型:用困惑度(Perplexity)衡量预测能力,数值越低模型越"聪明";
测评要涵盖哪些维度?
基础知识储备(通用知识) 特定任务表现(任务能力) 抗干扰能力(鲁棒性) 处理速度与资源消耗(效率)
评估方式有哪些:
自动化评测:适合快速大规模测试,比如跑完1万道题只需要几分钟 人工评估:虽然费时费力,但能发现模型是否真的"懂"了,比如判断生成的诗歌是否押韵自然 常见组合:先用自动评测筛出候选,再抽样人工复核
常用工具
OpenCompass(清华) HELM(斯坦福) LM Evaluation Harness(EleutherAI) ...
具体这块因为不是今天的重点就不展开了,这里特别推荐OpenCompass就是。
结语
回到最初的问题:模型已很强,为什么还要微调?
因为真实业务要的不是更花哨的回答,而是把模糊口语变成稳定、低延迟、可治理的结构化输出。
在影响模型输出的几个常见名词中,RAG、微调与并不是对立面,而是不同的工具:能用提示词别上微调;需要最新事实用RAG;当词表固定、口语丰富、准确率与成本双高要求时,再考虑微调。
并且无论是RAG还是微调,他们都不是银弹,因为过拟合、数据泄漏、标签边界模糊等,想要解决都不是“招式”上能搞定的,而是要修数据与治理的内功。
最后,希望本文的探讨,能为你勾勒出一幅更清晰的技术选型地图。如果这样都不愿意分享点赞,我也只能说是非人哉了...
点击上方卡片关注叶小钗公众号,查看下方二维码,添加我个人微信: