使用你的 QQ 聊天记录构造对话数据集,基于 P-Tune v2 微调 ChatGLM-6B 模型,创造你的克隆数字生命!
- 使用简单,一键操作。只需从 PC 端导出 QQ 聊天记录,然后调用本仓库相应脚本。接着你就可以去喝杯咖啡,静静等待另一个“你”诞生!
- 训练成本低。P-Tuning v2 将需要微调的参数量减少到原来的 0.1%,再通过模型量化、Gradient Checkpoint 等方法,最低只需要 7GB 显存即可训练。
git clone https://github.com/kcxain/CloneLLM.git
项目下的process_data.py
用于处理数据,构造对话数据集。需接收 3 个命令行参数:
-f
:QQ 聊天记录文本文件的路径-qq_id
:你自己的 QQ 号或 QQ 昵称(用于标识聊天记录中哪句话是你发出的)-max_history
:构造对话数据集时选择的上文个数,默认值为 5
例如,导出聊天记录路径为./data/classmates.txt
,QQ 号为:123456789,则用如下命令构造对话数据集:
python ./process_data.py -f ./data/classmates.txt -qq_id 123456789
构造的对话数据集路径为:./data/classmates.txt.json
数据集示例:
{
"prompt": "是状态图的九个公式 吧 不是九个状态图吧",
"response": "能手写吗",
"history": [
["问一下子", "哪来的九张状态转移图啊 就那一张 后面的都是结果"],
["哎呀给我看看嘛 你什么时候穿正装", "你再把PPT发给我"],
["我猜的还是很接近滴嘛", "刚剪完头"],
["23 激情猜价", "猪肘是另外现切的 9块 剩下的10.5"],
["左上角是什么", "猪脚 猜猜这总共多少钱"],
["你说嘞", "我咋知道捏"]
]
}
{
"prompt": "下周三之前",
"response": "论文的这个公式错了 你去群里说一下 说这个论文中这个公式打错了 应该是",
"history": [
["是状态图的九个公式 吧 不是九个状态图吧", "能手写吗"],
["问一下子", "哪来的九张状态转移图啊 就那一张 后面的都是结果"],
["哎呀给我看看嘛 你什么时候穿正装", "你再把PPT发给我"],
["我猜的还是很接近滴嘛", "刚剪完头"],
["23 激情猜价", "猪肘是另外现切的 9块 剩下的10.5"],
["左上角是什么", "猪脚 猜猜这总共多少钱"]
]
}
项目下的main.py
和train_chat.sh
用于微调模型,本部分代码参考开源项目 ChatGLM-6B/ptuning。
-
安装如下依赖:
pip install rouge_chinese nltk jieba datasets
-
将
train_chat.sh
中的CHAT_TRAIN_DATA
改为上一步处理后生成的对话数据集路径。 -
根据你的对话数据量大小,适当修改学习率
learning_rate
和最大训练步数max_steps
。 -
CHECKPOINT_NAME
为模型保存的文件夹路径。 -
使用如下命令训练:
bash train_chat.sh
训练时间参考:本人将 batch size 设置为 8,使用 NVIDIA A100-80GB 训练 2000 个 step,耗时 3 小时。
项目下的cli_demo.py
和run_cli.sh
用于模型部署。
-
将
run_cli.sh
的ptuning_checkpoint
参数设置为上一步训练保存的 checkpoint 路径。 -
使用如下命令运行:
bash run_cli.sh
-
接着,就可以与你的克隆数字生命对话了,它的语言是否有你的影子呢?是否能唤起你一些尘封的记忆呢?
-
如下是本人训的模型,感觉效果还不错,哈哈~
- 预处理数据:使用 QQ 聊天时,用户倾向于将将一整段语义完整性的消息分成多条发出。为解决这个问题,该阶段会把同一用户连续发出的所有消息合并为一条。
- 构造对话数据集:对于你发出的每条消息,将这条消息设置为多轮对话的最后一条 response,该消息之前的消息作为 promt,无论是私聊还是群聊都取前若干轮作为对话历史(TODO:群聊是否有更好的处理方式?)
论文链接:P-Tuning v2: Prompt Tuning Can Be Comparable to Finetuning Universally Across Scales and Tasks
简单来说,就是在模型所有层添加可训练的 Prompts 作为 Prefix,训练时冻结原始预训练模型参数,只训练 Prefix 部分。
- 加入全参数微调选项
- 加入 LoRA 微调选项
- 试试模型融合或微调参数集成,见 UniPELT: A Unified Framework for Parameter-Efficient Language Model Tuning
- 优化群聊消息对话数据构建策略
如果你有兴趣完成上述工作或有更好的想法,欢迎给此项目提 issue 或 pull request!