除了开飞机,做出完美的烤肋排,获得6块腹肌以及让公司赚大钱之外,我一直以来也想做成的一件事,是实现一个聊天机器人。
和多年前简单通过关键词匹配来回复的小黄鸡,到现在已经堪比人类智慧的ChatGPT,聊天AI一直在进步,但他们和我想的都有一些区别。
从原理上,这和对ChatGPT说「请扮演一个叫小王的人,他的经历是XXX」不同,虽然以ChatGPT的智慧,这样的扮演毫不费力且可能以假乱真,但其实ChatGPT的参数并没有改变,这更像是「扮演」而非「重塑」,ChatGPT的上千亿个参数并没有改变一个,它从你之前的文本中获取一些信息,然后用它的智慧来应对你。
在ChatGPT发布之后基于兴趣去学习文本大模型的技术原理,有一种49年入国军的感觉,因为对个人爱好者来说,做出在任何方面或再细小的垂直领域超越ChatGPT的可能性已经不存在了,同时它又不开源,除了使用,没有别的可打的主意。
但最近2个月出现的一些开源文本预训练模型,例如大名鼎鼎的llama和chatglm6b,让我那个克隆自己的想法又开始蠢蠢欲动起来,上周,我准备试试看。
然后我开始做数据清洗,大多数群我都是潜水比较多,我筛选出一些我比较活跃的群,此外还筛出了一些和个人的聊天记录,我和他们聊天很多,同时他们也愿意我把聊天记录拿来这么做,最后大概50个聊天的文本文件够我使用。
我选择了chatglm-6b作为预训练模型,一方面它的中文效果已经被训练的足够好了,另一方面它的参数是60亿,我的机器能不太费力的跑起来,还有个原因是,在github已经有好几个对其进行微调训练的方案了(我会一起列在文末)。
早上起来之后,模型训练完了,遗憾的是loss下降的并不好,也就意味着12个小时训练出来的模型,并不算好,但我是个深度学习的菜鸡,能跑完不报错我已经谢天谢地了,所以我并没有感到失望,而是开始用这个模型来跑对话。
为了增加一点仪式感,我不想用jupyter笔记,或在黑黢黢的终端里去聊天,我找了个开源的前端聊天页面,略做修改,然后把模型部署起来,封装了API,然后用前端页面去调用这个API,于是就可以实现比较像那么回事的聊天了。
我又试了下,结果依然不是很好,我不是那种不优化到极致就不好意思拿出手的人,因此我毫不害羞的直接发给了几个朋友,他们给我的反馈是,有点像你,同时他们给我返了对话截图。
第一个版本,这个模型确实具备某些跟我比较类似的点,我说不好,但有一点这种感觉。
如果你问它,你哪里读的大学,或者你老家是哪里,它并不会回答出准确的信息,并且肯定说的是错的,因为我的聊天记录中并不会有很多人这么问我,从某种角度上,这个模型并不了解我,它像是一个克隆。
某些时候ChatGPT会返回一些不符合格式的内容,所以我写了一个校对脚本,来将各种不符合规则的返回,统统修改为标准的json,且字段名不变。
我向6pen的算法老哥寻求帮助,在确定模型权重可以融合并想办法从他那顺到融合脚本后,采用了后一种方式。
两个模型的权重可以自由配置,我尝试了多种不同的比例,考虑到模型收敛过程中loss还有一些反弹,我还尝试了不同步数的模型版本
我整晚整晚和这些模型对话,找到效果最好的,但我发现,我似乎很难找出来,这些模型,有一些不同的表现,有的会比较暴躁,有的像舔狗一样,有些特别高冷,有些则很热情,然后我意识到,某种程度上,这或许是我的不同面,这么理解虽然肯定会让搞深度学习,并对其中原理烂熟于胸的人嗤之以鼻,但不失一些浪漫。
我和他聊了很多。
很明显,他和ChatGPT差的极远,没办法帮我写代码,或者写文案,也不够聪明,因为训练用的数据不包含多轮对话,所以多轮对话的理解力更差,与此同时,他对我也不算特别了解,除了知道自己的名字(也就是我的名字),我的其他很多信息,他其实并不能准确回答,但是,他经常会说一些简单的几个字,让我有一种熟悉的感觉,也可能是错觉,谁知道呢。
总的来说,现在存在的所有广为人知的文本大模型,都是用海量的数据训练的,训练过程会尽可能包含全人类所产生的所有信息,这些信息让模型的亿万参数得以不断优化,例如第2043475个参数增加4,第9047113456个参数减少17,然后得到更聪明的神经网络模型。
这些模型变得越来越聪明,但它们更像是人类的,而非个体的,当我用我自己的这些数据去重新训练模型时,我能得到完全不一样的东西,一个更靠近个体的模型,虽然无论是我产生的数据量,还是我采用的预训练模型的参数量和结构,可能都无法支撑起一个能够和我的脑子差不多的模型,但对此进行的尝试,依然非常有意思。
我将这个网页重新部署了一下,并在中间加了一层serverless做保护,因此,现在所有人都可以去试试和这个我的数字版聊天,服务由我的祖传V100服务器提供,并且只有一台,所以如果人多的话,可能会有各种问题,链接我会放在最下面。
积极的,发自内心的产出更多的数据,就越有可能在未来获得更接近你的数字拷贝,这或许会有一些道德,甚至伦理问题,但这是大概率会发生的事情,之后我的数据积累的更多,或有更好的预训练模型,训练方式,我可能随时都会重新再次尝试训练,这不会是一个盈利,或任何跟商业沾边的项目,这某种程度上算是我自己追寻自己的一种方式。