#Datawhale#ai夏令营
数据集清洗
基于原先的baseline,对数据集进行了清洗。
我们现在手头有的是原来给的129条数据,但是里面有很多都是链接之类的没有用的东西,这一部分的主要目的就是先把没用的扔掉,提升训练效率,然后合并发言的对象,合并数据,最后改写格式,形成新的数据。
导包
把数据导进来
清洗数据
首先我们发现数据集中有许多[图片]和超链接,这些对数据提取作用不大,我们可以将其去掉
我们发现数据中chat_text中有许多是重复多编的,我们需要把重复的也给去除掉,这样处理后的数据就会大大减小,使用暴力匹配去除
对于一个人连续的对话我们可以哦将其合并成一个对话
构造训练集
我们需要查看讯飞官方微调需要的训练集格式,这里我选择使用JSONL格式,并且其每一行是一个JSON字符串,格式为
{"input":"", "target":""}
训练时我选用了讯飞的spark pro进行训练,其要求训练数据不少于1500条,每一个input+target长度不能大于8000
def process(x):
# 提示词,我们交代清楚大模型的角色、目标、注意事项,然后提供背景信息,输出格式就可以了
prompt = f"""Instruction:
你是一个信息要素提取工作人员,你需要从给定的`ChatText`中提取出**客户**的`Infos`中相关信息,将提取的信息填到`Infos`中,
注意事项:
1. 没有的信息无需填写
2. 保持`Infos`的JSON格式不变,没有的信息项也要保留!!!
4. 姓名可以是聊天昵称
5. 注意是客户的信息,不是客服的信息
6. 可以有多个客户信息
ChatText:
{x["chat_text"]}
"""
# 要求的输出格式
infos = """"
Infos:
infos": [{
"基本信息-姓名": "",
"基本信息-手机号码": "",
"基本信息-邮箱": "",
"基本信息-地区": "",
"基本信息-详细地址": "",
"基本信息-性别": "",
"基本信息-年龄": "",
"基本信息-生日": "",
"咨询类型": [],
"意向产品": [],
"购买异议点": [],
"客户预算-预算是否充足": "",
"客户预算-总体预算金额": "",
"客户预算-预算明细": "",
"竞品信息": "",
"客户是否有意向": "",
"客户是否有卡点": "",
"客户购买阶段": "",
"下一步跟进计划-参与人": [],
"下一步跟进计划-时间点": "",
"下一步跟进计划-具体事项": ""
}]
"""
# prompt+infos是文件中的input,answer是文件中的target
answer = f"""{x["infos"]}""" #target
total= len(prompt + infos + answer)
if total > 8000:
prompt = prompt[:8000-len(infos + answer)]
return pd.Series([prompt, answer], index=["input", "target"])
data = train_data.apply(process, axis=1)
# 测试集中的target并没有用可以忽略
data = test_data.apply(process, axis=1)
#保存数据
with open(os.path.join(data_dir, "my_train.jsonl"), "w", encoding="utf-8") as f:
f.write("\n".join([json.dumps(i, ensure_ascii=False) for i in list(data.transpose().to_dict().values())]))
f.close()
with open(os.path.join(data_dir, "my_test.jsonl"), "w", encoding="utf-8") as f:
f.write("\n".join([json.dumps(i, ensure_ascii=False) for i in list(data.transpose().to_dict().values())]))
f.close()
运行后即可得到清理好的,格式正确的代码,但是我们注意到spark pro需要1500+数据,我是选择直接复制粘贴了。
传上去大概长这样
我现在还在用零代码微调,结果回头再更新吧