AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


微调HR模型-增强面试评价能力
发布日期:2024-04-29 19:12:24 浏览次数: 1898


本文约5000字,阅读时间20分钟

本文是保姆式的教程,想自己微调HR大模型可耐心看完。

先看效果

微调前:

微调后:

微调模型有什么用?

微调大模型可以让大模型适应特定的任务和场景,在此场景下表现能力更强。

比如GPT 3.5的相当于大学生,微调后相当于读了个HR的硕士,他在HR场景下能力更强,懂得更多,回答得更专业。

那我要学微调吗?

不建议。?

除非你是技术大牛,未来想加入OpenAI这种公司。真正需要会模型训练(含微调)的人,全球仅需要几百位(最顶尖的科学家)。

个人观点,未来的大模型一定是AGI即通用类大模型,在方方面面都很强。我们微调出什么HR大模型,财务大模型,花个上千万RMB去进行模型训练不说,整体效果还不如花个几分钱直接调用OpenAI的GPT4。(数据合规问题另说,都有解决办法)

在没有足够财力和时间情况下,个人/小公司微调模型意义不大。


以上为心声,下方为对外说辞

微调好啊!?

  • 作为工程师,学会微调让我掌握大模型环境搭建、模型训练、效果评估技术,可以帮助公司本地部署垂直领域的大模型,升职加薪不是梦!

  • 作为产品经理,学会微调的数据处理步骤,包括数据采集、数据标注、数据清洗,还有模型效果评估,公司的大模型一定会大卖!要知道好的模型70%都要归功于好数据,升职加薪不是梦!

  • 作为公司负责人,公司前进方向的掌舵人,我看到因合规问题,很多企业只能用本地大模型;或者开源大模型如文心、千问满足不了我客户的需求。我们公司自己微调个垂直大模型,不就起飞?商机来了,我要飞黄腾达了!





好吧,既然你要学模型微调,那开始吧!

(做好心理准备吧,每一步都要搞你1天)

01

什么是模型微调?

抽象地说,你可以理解模型微调相当于调节灯光的亮度,根据你想要的亮度,在开关旋钮那里滑动(0~100%亮度),直到你想要的结果。

实现方法其实很简单,就是调整模型的参数(开关旋钮)。模型训练的本质就是求解最优化参数的过程

有几个词需要澄清下,容易混淆

  • 模型训练:模型预训练、微调、轻量化微调的统称,是个泛化的表述。

  • 模型预训练:拿成千上万亿的超大训练数据,训练成通识类大模型。比如GPT4, Claude3,文心4。

  • 模型微调:拿几百万条的中等量训练数据,训练成垂直领域的大模型。比如用友的的YonGPT, 金蝶的苍穹云GPT财务大模型。

  • 轻量化微调(大家说的/本文说的微调指这个)拿成百上千条数据,训练成特殊场景增强的大模型。比如拥有对话能力、简历解析能力等。

根据训练方式,分为无监督学习、监督学习和强化学习(基于人类的反馈学习RLHF,俗称点赞和差评)给模型进行训练。

根据训练样本量,分为零样本ZST、单样本OST、小样本FST、多样本MTL学习。


02

需求分析

这是我做这个模型微调尝试的初心,我希望能有一个HR场景:

  • 数据集比较好做(要让GPT帮我生成,手写1000条数据会让我自闭的)。

  • 场景易于理解也实用,观众看了秒懂,会喜欢。

  • 现有的开源模型没有特别好的效果,但是调教一下效果就很明显。

  • 使用的模型不能太大,不然训练一次好几天,钱包和时间都吃不消。


经过2天的思考和研究,得出场景:

智谱公司的ChatGLM3 - 6b中文大模型,已经很不错了,但是我希望他在评估压力面试问题时,能更专业,所以希望微调出更强的能力。

产品目标:能正确评价压力面试答案的好坏,并结构化给出评价理由。

03

环境搭建

在模型微调前,需要准备好系统环境,主要包括:

  • 租显卡:租RTX 4090 - 24G内存。模型训练1000条数据才20分钟,超快;价格约2元/小时。
  • 创建环境:miniconda - Python 3.10。版本比较新,不容易出BUG。
  • 下载大模型:选用智谱的ChatGLM3 - 6b。中文效果好,攻略多,部署容易。
  • 微调工具包:ChatGLM3官方出品。在《5.微调准备》章节详细说明


以上内容具体怎么操作,可参考我的另一篇文章,里面有保姆式教程:

教你三步部署本地大模型


04 -1

准备数据

(HR产品经理发光发热的步骤)

我如何准备训练数据呢?需要先思考以下几个问题:

  • 数据格式怎么样?

毕竟要喂给模型的,格式错了就训练不了。

  • 数据内容有什么要求?

如果数据内容质量差,训练出来的也是垃圾,就不能增强模型评估压力面试问题的能力。最好和真实的面试记录一样。

  • 数据该怎么生成?

手写?用GPT帮我生成?上网下载资料?找公司帮我做数据?

  1. 数据格式

ChatGLM3训练的数据格式是这样的(JSON格式):

{"conversations": [

{"role": "user", "content": "请评价以下压力面试的回答\n问题:你为何在上一个工作中仅待了六个月?\n回答: 在我上一个职位中,我确实只工作了六个月,但在此期间,我迅速适应了新环境并对团队做出了显著贡献。我提升了部门的工作效率通过引入新的项目管理工具,并帮助团队按时完成重要项目。我离职是因为我寻找更大的成长和学习机会。"},

{"role": "assistant", "content": "这个回答很好,主要有三个方面的原因:\n1.回答展示了应聘者积极面对挑战,快速适应变化的能力。\n2.通过举例说明在前职位中的成就,明确展示了自己的贡献和能力。\n3.说明离职原因时,强调寻求更大成长机会,体现了应聘者的职业发展导向和积极态度。"}

]}

2. 数据内容

要保证训练效果,最好对同一个面试问题,有一个好的回答和一个不好的回答。

{好的答案}

  • User: 压力面试的问题A、候选人好答案,约100字。

  • Assistant:好答案的面试评价,约100字,分3点来写。


{不好的答案}

  • User: 压力面试的问题A、候选人不好的答案,约100字。

  • Assistant:不好的答案的面试评价,约100字,分3点来写。


最后,我希望这些压力面试的问题和答案不能随便造,都是按照实际情况产生,比如:

  • 压力面试题特点
    • 打断。目的:以测试候选人的耐压性和反应能力;例子:打断一下,你说了这么多,我没听到重点。

    • 质疑/表现批判性/冷漠(抬杠)。目的:以观察候选人在缺乏积极反馈或面对挑战时的表现;例子:你每段工作经历都很短;你工作了5年,为什么这么基础的问题都不会?

    • 提出难题(超纲或看起来无解的问题)。目的:目的是观察候选人如何应对没遇过的困难的思路和情形;例子:提出超出候选人能力范围的题目。
  • 好的回答
    • 注意力集中在问题本身,不要受到情绪影响

    • 表现自信和适应性

    • 用实例来应答

    • 对于模糊的问题,请求澄清

    • 保持逻辑性和条理性

    • 对于超纲问题,能创造性思考
  • 不好的回答
    • 情绪失控,如使用不当的语言,例如诅咒、挑衅、攻击性言论

    • 防御性太强,不愿意接受任何形式的批评或建议,避免讨论自己的弱点和失败

    • 缺乏逻辑和条理

    • 缺乏准备,回答过于简单或者笼统

    • 逃避问题,避重就轻

    • 缺乏自信
  1. 数据生成

一般数据准备要分4步:

  • 数据采集
    • 自然来源(如业务日志):真实数据
    • Web 抓取:近似数据
    • 人造
  • 数据标注
    • 专业标注公司
    • 众包
    • 主动学习:通过模型选择重要样本,由专家标注,再训练模型
    • 设计产品形态,在用户自然交互中产生标注数据(例如点赞、收藏)
  • 数据清洗
    • 去除不相关数据
    • 去除冗余数据(例如重复的样本)
    • 去除误导性数据(业务相关)
    • 按格式拼接数据
  • 考虑样本均衡性
    • 尽量保证每个标签(场景/子问题)都有足够多的训练样本
    • 每个标签对应的数据量尽量相当

基于上述数据准备的策略,我们要怎么搞出这样的数据呢:

  • 数据采集、标注:找GPT帮我造面试记录1000条,然后评价(标注),以下为Prompt
帮我生成一系列压力面试问答及评价。每组包括一个问题,一个好回答及其评价,一个不好的回答及其评价。请依照以下简化要求:问题简短,约20字,可涵盖打断、质疑或提出难题。好回答约80字,展示候选人的应对策略、逻辑性、自信、创造力等。好回答评价约100字,聚焦于问题解决策略、适应性、条理性、举例子、自信、创造性等。不好的回答约80字,可能表现为情绪失控、逃避问题、防御性太强、缺乏逻辑和条理、缺乏准备,回答过于简单或者笼统等。不好的回答评价约100字,指出回答中的情绪失控、逃避问题、防御性太强、缺乏逻辑和条理、缺乏准备,回答过于简单或者笼统等。格式要求:{"QA":"请评价以下压力面试的回答\n问题:...\n回答: ...","Eval":"这个回答很好,主要有三个方面的原因:\n1....\n2....\n3...."}{"QA":"请评价以下压力面试的回答\n问题:...\n回答: ...","Eval":"这个回答不好,主要有三个方面的原因:\n1....\n2....\n3...."}
  • 数据清洗:让GPT帮我写清洗代码,帮我去掉GPT生成的错误数据(GPT状态不好就给我生成不符合要求的数据)

  • 我做好的数据长这样(太美了,好规整),有1000条,其中训练集:验证集:测试集=8:1:1。

04 -2

数据生成过程踩的坑

  • GPT4一次性只能造7-14条面试数据(还得看他心情)

原因:因为GPT生成文本有数量限制和响应时间限制。但是我要造1000条数据怎么样?

解决方法:我让GPT帮我写了一段脚本,向GPT请求100次,把造的数据写到我本地的txt文档里。相当酷炫,我去健身回来,就搞好了!全自动!

  • GPT4生成的数据格式有时不正确(还是得看他心情)

原因:GPT受temperture的原因,结果有随机性。但我不能设置temperature=0, 因为我希望他生成多种多样的面试记录。

解决方法:我让GPT写了一段代码清洗不符合格式的数据。大概占10%。


05

微调准备

  1. 检查并下载微调的工具包

命令行指令:pip install -r requirements.txt

*注意要在ChatGLM3/finetune_demo这个目录下进行下载依赖工具包,不然就下错啦~ 不然可能下到其他工具的依赖包了。

  1. 切分数据集

我请GPT生成了1000条数据,根据经验法则,进行以下切分,训练效果最好:

  • 训练集(train):80%,800条。用于训练模型。

  • 验证集(eval):10%,100条。用于在训练过程中,验证loss(损失率),调整参数。

  • 测试集(test):10%,100条。用于训练后,最终预测模型训练效果。


  1. 设置数据集路径

记得改名和改路径!

4. 修改模型超参

啥叫超参?

就是一些超级开关,对模型训练影响很大的参数,要根据你硬件和数据集的情况调整这些开关,可以提高模型训练的效率和效果。

具体我设置的超参情况(我用Lora去微调):

(详细设置请阅读原文)

06

开始微调

常用的模型微调方式有2种:

  • P-tuning, 清华团队出品,往Embedding层加参数。适合ChatGLM这种中文模型。

  • LoRa,微软提出的,往6层神经网络加(Nx=6)加参数。应用最广泛、效果最好的微调方法。


我们采用Lora的方式进行微调。一行代码即可启动微调:

!python finetune_hf.py  data/  /root/autodl-tmp/ZhipuAI/chatglm3-6b  configs/lora.yaml


大约等待20分钟,就训练好了!

输出了10个模型节点,以及日志:

07

观测效果

我们采用TensorBorad去观察模型训练效果。(详细步骤请看原文)

1. 打开AutoPanel

2. 切换到TensorBorad

3. 我们一般观察几个超参:
    • LOSS:损失函数,可以理解为损失率、失真率,就是训练结果数据和期望数据(验证集)之间的差值。一般随着训练,loss会越来越小。根据train/loss 可以发现,在1000这个节点,损失率最小,大约1.2%,也就是说你问大模型压力面试问题,他98.8%的情况都会回答得和你训练数据一样好。
    • 学习率:模型训练速度。学习率越高,速度越快,但是波动大;学习率越低,速度越慢,但是波动小。一般有个策略叫warm-up,通过逐渐增加学习率,可以使模型在训练过程中更加稳定,并提高最终的模型性能。相关:梯度下降策略。


结论:在1000这个点,损失率最低,效果最好,把这个点的模型,作为我们训练好的模型!


08

成果展示

我们采用Streamlit工具展示模型效果,具体怎么搞出来的可以参考我的另一篇文章的《5. 漂亮测试:Streamlit工具》章节。

教你三步部署本地大模型

微调前

微调后

09

踩坑心得

作为一名编程小白,整个环境搭建、微调花了大概5天时间。其中在环境搭建时,遇到的BUG不计其数,很抓狂。现在再让我从0开始搭建环境到微调完,可能也就2个小时。

  1. 显存不足/内存不足,跑不了大模型,怎么办?

  • 清除已占用显存
import torchimport gctorch.cuda.empty_cache()# 在加载新模型前,尝试删除旧的模型实例if 'model' in locals():del modeltorch.cuda.empty_cache()gc.collect()

  • 清除缓存文件(命令行运行)
rm -rf ~/.cache #删除缓存文件

2. 要先按项目requirement安装依赖包

在安装ChatGLM3、下载安装大模型、微调前,都要先按要求安装依赖包,不然很容易搞到一半就报错。


3. 经常报错,说明依赖包出问题了,不如重头开始重新搞

Python环境很复杂,有很多包,每个包又有很多版本。有时你明明已经按要求安装很多包,结果不行,老是报错,然后就疯狂换数据源,升级降级包,换环境,搞得整个系统混乱不堪。

我就遇到这个问题,有个报错搞了1天都解决不了,后来我就索性从头开始搭建环境,一个个包按要求、按顺序安装,结果微调模型就一切都很顺利,2个小时就搞定了。


10

微调总结

作为HR产品经理,微调的整个过程让我很煎熬,让我有很多思想斗争。

1. 项目开始前

  • 学会微调对我产品经理工作来说有多大意义吗?但是不去做,怎么知道意义大不大?
  • 微调的技术难度很高,会不会我永远都搞不成功?浪费这么多时间。
  • 我该哪个模型去微调?现在有成千上万的开源模型。
  • 我做这样一个项目,基于哪个HR场景?哪个有意义,容易出效果?HR场景有成千上万个。

2. 微调过程中

  • BUG多到怀疑人生,我作为产品经理要学这么多环境搭建的知识吗?
  • 大模型还挺像人的,会闹脾气,不同心情下生产的回答不一样,挺有趣!
  • 我让GPT4一次性生成500条面试数据,他不干了,只给我生成2条瞅瞅;但我让它尽量生成15条数据,他给我生成14条。真的很像人啊!
  • 做数据真是一个很有趣,但是也很有挑战(很复杂)的过程!
  • 神经网络训练挺有趣的,模型训练,感觉就像在一座千沟万壑的大山里滑雪,你要滑到谷底(Loss最小),需要考虑滑行速度和方向(学习率)、每一段滑行的距离(步长,Batch Size),选择大山的坡度(梯度),是要直着滑还是走曲线(激活函数)。这个过程就是梯度下降算法。
  • 大模型有个参数叫随机种子,seed=42,大概就是对于同一个问题的回复编号,只要你设置为一个固定的值,那对同样的问题他每次都有一样的回复。42是《银河漫游指南》里的宇宙终极数字,是个玄学数字。不得不说程序员都是二次元科幻迷!

3. 微调后总结

  • 微调成功了,用可视化的TensorBoard展示训练效果,用Steamlit展示对话窗口,真的很酷!很有成就感!
  • 学大模型环境搭建,对于HR产品经理来说,没用。对工程师有用。
  • 学微调如何造数据、标记数据、清洗数据,对HR产品经理来说有用
  • 特别是用GPT造数据,如何用Prompt引导GPT写出高质量的语料,这是需要深厚的业务理解,这是工程师绝对做不到的。
  • 微调需要大量的财力、人力和时间,适用性很窄,整体模型效果比起闭源的如OpenAI的GPT4差了十万百千里,而且人家调用一次才几毛钱,微调模型性价比很低。




53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询