logo

第二期“贺岁灵感模型”比赛解题思路分享

大家好,我是第二期比赛获奖选手房俍,很高兴和大家分享我的解题思路。
一、项目背景与目标
本项目旨在通过文心千帆MobileBuilder平台的ERNIE-Speed模型进行微调,以优化其在特定任务春节贺词方面的性能。目标是通过精细化的数据增强、质量控制和训练策略,提升模型在字数控制、内容创作及任务适应性等方面的能力。
二、数据增强与质量控制
(1)初始数据集
初始数据集为官方提供的56条新春贺词数据集。这些数据集仔细看就会发现,质量是有问题的,比如第一个:
[{"prompt": "假如你是企业CEO,请以正式鼓励的风格为全公司员工撰写50字的春节祝福语。", "response": [["亲爱的团队成员们,值此新春佳节之际,向你们致以诚挚的祝福和感谢。过去一年,我们共同努力,取得了骄人的成绩。愿新的一年里,家庭幸福、事业成功,我们携手迎接更加辉煌的明天。祝大家春节快乐,万事如意!"]]}]
这个prompt的要求是写50字,但是response的字数是97字,官方对50字的要求是可以上下浮动5个字,也就是对字数的上限要求是55字,这里超过了42字了。后面在做完数据增强后,会统一进行处理。
(2)数据增强
通过langchain结合文心千帆的ernie-bot4.0模型,对这56条数据进行循环遍历,为了在增强过程中注重保持数据的多样性和任务的相关性,通过提示词模板技术,在每次遍历的官方提供的新春贺词数据集的prompt的基础上,仿写类似的prompt,并将新产生的prompt作为提示词,再次和ernie-bot4.0模型进行交互,并记录下来产生的response,将56条数据扩充到了605条,当然,已经对这数据集中相似的prompt进行了剔除,以保证数据集的初步质量。
举例如下:官方给到参赛选手的数据集的1条数据的prompt是假如你是企业CEO,请以正式鼓励的风格为全公司员工撰写50字的春节祝福语,通过大语言模型的数据增强的prompt示例为:(a)假设你是学校校长,请用亲切关怀的语气写一段50字以内的春节寄语给学生们。(b)假设你是一位导游,请为春节期间的旅游团队撰写一段欢迎词,不超过40字。
(3)数据集中字数的精确控制
将数据集整理至Excel表格,设置prompt、response、response字数及反馈结果等列,prompt、response列和数据增强后的prompt和response对照,考虑到模型在计算字数中存在计算不准确的情况,因此在response字数列中使用了python自带的len()函数来统计字数,以保证字数计算的精确性,然后通过langchain编写提示词模板,通过pandas循环检查615条数据的字数是否满足prompt的要求,在允许5个字数浮动误差的基础上,符合要求的返回ok,不符合要求的返回字数的偏离数,并重新通过ernie-bot模型重新得到一个response,当然得重新通过excel的LEN函数去看下字数是否符合要求,如果仍然没有符合要求则会再去通过ernie-bot模型重新得到一个response。
代码示例如下:
  
  
  
  
  
  
import os
from langchain import LLMChain
from langchain_community.llms import QianfanLLMEndpoint
from langchain_core.language_models.chat_models import HumanMessage
from langchain import PromptTemplate
from langchain.prompts.chat import (
ChatPromptTemplate,
SystemMessagePromptTemplate,
HumanMessagePromptTemplate,
MessagesPlaceholder,
)
# 以上代码导入langchain需要的依赖
os.environ["QIANFAN_AK"] = "千帆ak"
os.environ["QIANFAN_SK"] = "千帆sk"
llm = QianfanLLMEndpoint(
streaming=True,
model="ERNIE-Bot-4",
)
human_template="祝福的要求是:{prompt},春节的贺词是{response},春节贺词的字数是:{count},用户会给你一个祝福的要求,然后给你一个春节贺词,然后给你一个贺词的字数,你要对比下要求的数字和贺词字数之间数字偏差有多少,请注意允许存在正负{count2}个字以内的偏差,如果超过{count2}个字偏差,请直接重新按照祝福的要求和字数的要求写一段春节贺词,注意标点符合也算1个字符,如果未超过{count2}个字的偏差,请直接回复ok即可"
human_message_prompt=HumanMessagePromptTemplate.from_template(human_template)
system_template="你是一个数学高手,精通字数计算和统计"
system_message_prompt=SystemMessagePromptTemplate.from_template(system_template)
chat_prompt=ChatPromptTemplate.from_messages([
system_message_prompt,
human_message_prompt
])
chain=LLMChain(llm=llm,prompt=chat_prompt)
# 以上代码定义了使用的大模型和提示词模板
import pandas as pd
df = pd.read_excel('excel.xlsx')
for index, row in df.iterrows():
isok=chain.run(
prompt=row['prompt'],
response=row['response'],
count=len(row['response']),
count2=5
)
df.loc[index, 'isok'] = isok
print(isok)
df.to_excel('excel.xlsx')
#以上代码对excel文件进行操作,循环遍历每一行并且根据变量内容填充提示词模#板,并且和大语言模型交互,最后的结果如果字数符合要求返回ok,不符合要求会#重新写一段新的response。
实际在程序运行的时候,{ prompt }变量为每次遍历一行excel表格数据时的prompt列,{response}变量为response列,{count}为response的字数统计列,{count2}变量为5。
(4)特殊处理
对于字数要求与实际创作需求相悖的prompt(如10字以内的七言律诗,1个字以内的春节祝福对联等情形),设置response为“因字数原因无法完成创作”。
(5)上传数据集
对于整理好的数据集,我们上传至文心千帆MobileBuilder平台,主要的的操作步骤如下图所示:
三、模型训练设置
(1)训练平台
模型训练的平台的选择上使用的是文心千帆ModelBuilder,微调的模型是ERNIE-Speed大语言模型。
(2)训练模式
在模型模式的选择上使用上,考虑到本次是春节贺词的场景,并且需要对模型进行微调,因此使用的是平台内置的sft训练模式,即有监督微调。
(3)训练方式
在模型的训练方式上采用LoRA(Low-Rank Adaptation)进行微调。
打开后基础信息部分输入训练任务的名称,类型和模型,模型我们这里选择的是ERNIE-Speed模型。
(4)数据配置
训练集为数据增强与质量控制完成后的605条数据,测试集为训练集的10%,即随机选择10%的训练集作为测试集,没有和通过数据集去做配比。
(5)参数设置
迭代轮次:3次;
学习率:0.00003;
保存日志间隔:1;
LoRA设置:所有线性层启用;
秩为8,序列长度为4096;
预热比例:0.1;
正则化系数:0.01。
四、模型评估及优化
(1)评估数据集
在评估数据集的选择上,使用与605条训练集完全独立的52条数据集作为评分数据集,用于验证模型。
(2)评估方法
采用自动评估方法,在创建评估任务时选择自动规则打分和自动裁判员,裁判员模型选用ernie-bot4.0,打分prompt基于裁判员模型打分模板,在steps的地方作了修改,尽可能做到和比赛的相关规则对齐,如字数判断、扣分标准、创作需求的适应性等。
(3)评估指标
主要参考平均得分来判断模型训练效果。
(4)模型优化测量
根据评估结果调整训练参数,如学习率、迭代轮次等并通过自动评估的方法,通过评估指标判断模型的效果,下图为模型评估详情截图:
五、展望与总结
通过本微调方案,感受到ERNIE-Speed模型的强大,能够在特定任务春节贺词的生成上展现出优越的性能。当然与本次的冠军相比存在不小的差距,主要原因是我增强的数据集不够多,仅为605条,本次冠军张辉使用了近3000条的数据集。通过这次比赛,学习和体验了微调的全过程,并且也实践了如何通过写代码进行数据增强和数据质量控制,收获满满,也感谢千帆平台提供的这次学习的机会。
评论
用户头像