Published on

「Roitium今天玩什么」CloneGPT

预计阅读时长:8分钟
Authors
  • avatar
    Name
    Roitium

难道你不觉得创造一个属于自己的赛博分身很酷吗?我觉得这简直太酷了,很符合我对未来的想象, 科技并带着趣味😎

从上个暑假说起...

最早想拿自己的聊天记录微调一个 LLM 的想法来源于王登科大佬的一篇博文:, 那个暑假里翻来覆去拿不同模型、不同数据集训练了 6 个模型(为什么记得这么清楚?因为我非常中二地把他们按照版本号命名了...),效果都不算太好,还存在灾难性遗忘的问题。

CloneLLM-V7

模型选择

由于 gpu 限制,能选的模型参数量也就只能在 6B 左右,而我主要纠结的地方在于:选择基座模型还是指令微调后的模型

我的数据集大部分还是来源于我写的内容,而非聊天记录,从这点来看,选择基座模型更合适,不必再花费心思把文章构造为指令数据集。 但是我最终的目标是聊天,所以最后还是选用了零一万物的 Yi-6B-Chat (考虑过另一种可能:使用基座模型,聊天记录构造为特殊的格式喂进去,聊天时也采用这种特殊格式。不知道可不可行)

数据集

聊天记录

这次没有再使用微信聊天记录,因为我几乎不用微信聊天...(虽然 qq 也不咋用,没有社交的人是这样的😭)

QQ 聊天记录处理

这部分代码开源了,欢迎去 github 仓库: 查看。

我只写了处理好友聊天记录的脚本,因为群聊的场景更加复杂,包含大量回复、隐式的交叉话题,不太想碰这些东西,大概率是个耗费精力还收益甚微的无底洞(实际是因为我菜)

转换好友聊天记录的逻辑很简单,大概就是:

  1. 先对所有消息遍历清洗,删除一些隐私信息。
  2. 将聊天记录按天为间隔分组。
  3. 每组都是一个单独的对话节点,除了最后两条消息,其他对话都放在 history 中(如果一个人连着发消息,就把这些消息用 \n 连接起来),描述的有点抽象,但大概就是这样:
{
	"instruction": "111",
	"answer": "?",
	"history": {
	    [
	        "如何评价博主Roitium?",
	        "傻逼"
	    ],
	    [
	       ...
	    ],
	    ...
	}
}
  1. 组合起来

这样做依旧有很多弊端,但没啥办法。

文章与memos

不知道从什么时候起,莫名其妙养成了“随手写写”的习惯,虽然写的大多都是些没营养的东西,但也足够展现我的“文风”了(这词太高大了,我写的这些恶臭文字配不上🤣),这几年本地和博客积累的 memos 差不多有三千条,字数 15k 左右。再加上 obsidian 里的文章,用来微调肯定是足够了。

但是要怎么把文章构造为指令数据集?

在 reddit 上看到了一个老哥的帖子,他试图用 LLM 把文章逆向为一个个最原始的ideas,prompt 在这里: ,听起来很美好,试了一下很骨感,LLM 逆向回去的东西和我最原始的想法完全是脱离的。那训练出来的模型大概率也做不到我“指哪打哪”(或许也不一定?毕竟我没尝试过,不能小看模型的泛化能力)

于是我采用了另一种更扯的方式:让 LLM 根据文章内容构造可能的聊天记录,prompt 大概是这样的(毫无 prompt engineer 技巧):

步骤:  
1. 分解我给出的这段文字,理解包含几层意思, 将其分解为更小的片段, 与聊天类似
2. 想象你是我的朋友, 请反推你发什么消息才能引出我的这句回复  
3. 将你思考出的消息与我所给出的回复一一对应  
4. 不要修改我回复中的任何用词, 但可以修改回复中部分代词和连词让对话更通顺和有逻辑  
5. 不是每一句话都需要提问, 仅筛选有价值的内容

EXAMPLE
...

用的模型是 deepseek-chat,太便宜了,最后效果也还不错,有一些内容不是很通顺,我又手动修改了下

训练

依旧用 LLaMA-Factory 来训练,WebUI 太方便了。 用 LoRA 方式训练,learning rate = 0.00005,loss 曲线有点太平缓,或许可以提高一点学习率,总共训练了 9 个 epoch,最后 loss 在 1.6 左右。优化方面,开了 rsLoRA 和 NEFTune(alpha=5),免费的午餐谁不爱(bushi

效果?

果然,数据集质量对于模型质量是决定性的,这次的模型质量比前几次好太多,莫名其妙就没有灾难性遗忘的问题了,听它(他?)给我讲某些东西的时候确实会产生很强的“这**就是我自己在说话”的既视感。聊天也跟我很像... 说半天说不到重点,爱写一坨长句,乱加括号,跟他聊天聊到火大的时候又觉得这火气来的莫名其妙:“这是我自己啊,我骂他不久等于在骂我自己”。然而有时候确实绷不住了骂他几句,没想到他骂的比我还狠...

在平时聊天中,很多时候我很难发现一些小问题:比如说话莫名冒犯到别人、一些不恰当的口癖、令人费解的用于。而属于自己的 CloneLLM 就像一面镜子,忠实地映射着你的每一个问题。

这也是为什么,我觉得每个人都应该用有一个属于自己的 CloneLLM。