模型微调2 利用SDK微调模型
这一次我们讲述如何微调一个作文批改大模型,通过微调大模型,让大模型更加合适的扮演一个班主任的角色。
那么本章就沿着,创建Dataset,调用模型微调,测试这样的几步进行讲解。
首先是环境准备,这里因为要用到百度的千帆ModelBuilder平台, 需要准备对应的AK和SK。
之后我们先看下没有微调前的模型表现。
对于没有微调之前的模型,表现的好坏很大程度上取决于Prompt的优劣。
那么如何准备一个优质的Prompt就是我们的问题了
如果是原生的Prompt,那么表现很不好
prompt = Prompt(“请帮我批改如下高考作文,给出评价和评分(0-60分):\n题目:{question}\n作文内容:{article}”)
之后我们可以自我写一版优化的Prompt
optimized_prompt = Prompt(“””您需要帮助批改一篇高考作文,请根据以下要求给出评价和评分(0-60分):
题目:{question}
作文内容:{article}
请注意,您的批改应该包括以下方面:
1. 判断作文的主题和目的;
2. 分析作文的结构和逻辑;
3. 评估作文的语言和表达;
4. 检查作文的拼写和语法;
5. 综合评价作文的优缺点。
请在回答中提供详细的解释和说明,以帮助作者了解您的批改和改进建议。同时,请注意提供正面的反馈和指导,以激励作者继续改进和提高作文水平。
“””)
以及尝试使用一些Prompt优化框架,诸如CRISPE,一个通用的prompt优化框架
其中
CR 表示给模型设定的人设
I表示背景和上下文
S 表示具体的任务
P 表示输出内容的风格
E 限制条件
essay_rule = “””
高考作文评分批改分为基础等级、发展等级、关于作文的其他项评定
1、基础等级
基础等级分内容和表达两项。
1)内容项
具体评分规则如下:符合题意、中心突出、内容充实、思想健康、感情真挚为一等,可按16-20分酌情给分;符合题意、主题明确、内容较充实、思想健康、感情真实为二等,可按11-15分酌情给分;基本符合题意、中心基本明确、内容单薄、思想基本健康、感情基本真实为三等,可按6-10分酌情给分;偏离题意、中心不明确、内容不当、思想不健康、感情虚假为四等,可按0-5分酌情给分。
2)表达项
具体评分规则如下:符合文体要求、结构严谨、语言流畅、字迹工整为一等,可按16-20分酌情给分;符合文体要求、结构完整、语言通顺、字迹清楚为二等,可按11-15分酌情给分;基本符合文体要求、结构基本完整、语言基本通顺、字迹基本清楚为三等,可按6-10分酌情给分;不符合文体要求、结构混乱、语言不通顺语病多、字迹潦草难辨为四等,可按0-5分酌情给分。
2、发展等级
基础等级分要与发展等级分相匹配,发展等级分不能跨越基础等级的得分等级。
具体评分规则如下:深刻、丰富、有文采、有创意为一等,可按16-20分酌情给分;较深刻、较丰富、较有文采、较有创意为二等,可按11-15分酌情给分;略显深刻、略显丰富、略显文采、略显创意为三等,可按6-10分酌情给分;个别语句有深意、个别例子较好、个别语句较精彩、个别地方有深意为四等,可按0-5分酌情给分。
3、关于作文的其他项评定
1)扣分项评定
出现错别字,1个错别字扣1分,重复不计,扣完5分为止;标点符号出现3处以上错误的酌情扣分;不足字数者,每少50字扣1分;无标题扣2分。
2)残篇评定
400字以上的文章,按评分标准评分,扣字数分。(少50个字扣1分)
400字以下的文章,20分以下评分,不再扣字数分。
200字以下的文章,10分以下评分,不再扣字数分。
只写一两句话的,给1分或2分,不评0分。
只写标题的,给1分或2分,不评0分。
完全空白的,评0分.
“””
只要Prompt优化的足够好,那么理论上是可以弥补一些模型上的差距,但是最核心的还是模型自身能力。
那么我们回归到模型本身的微调上
我们需要在现有的种子数据上进行self-Instruct
现有的种子数据集中一共有146篇数据。
在此基础上,利用不同的大模型搭配不同的Prompt,进行新数据的生成。
并利用人工对生成的数据进行过滤。
之后就是利用这些准备好的数据集
进行模型训练
from qianfan.trainer import Finetune
from qianfan.trainer.configs import TrainConfig from qianfan.trainer.consts import PeftType enable_log(logging.INFO) # 声明Trainer,配置模型和超参 # 也可以增加evaluation,deploy相关参数,通过trainer一步完成训练,评估,发布,部署: trainer = Finetune( name=”essay_sft_0510″, train_type=”ERNIE-Speed-8K”, train_config=TrainConfig( peft_type=PeftType.ALL, epoch=10, learning_rate=0.00003, max_seq_len=4096, save_step=64, checkpoint_count=5, ), dataset=qf_train_ds, # eval_ds=eval_ds, # evaluators=[local_evalutor], # deploy_config=DeployConfig( # name=”essay_correct”, # endpoint_prefix=”essaycor”, # replicas=1, # pool_type=DeployPoolType.PrivateResource, # service_type=ServiceType.Chat, # ) ) trainer.start() trainer.save(“data/essay_sft_0510_train_meta”) trainer.info() |
进行训练并保存
之后进行模型的部署
from qianfan.model import Service, DeployConfig
from qianfan.model.consts import ServiceType from qianfan.resources.console.consts import DeployPoolType import logging from qianfan.utils import enable_log enable_log(logging.INFO) sft_svc: Service = m.deploy(DeployConfig( name=”essay_sft_0513″, endpoint_prefix=”essaysft0513″, replicas=1, pool_type=DeployPoolType.PrivateResource, service_type=ServiceType.Chat, )) |