关于我如何Fine tune「微调」ChatGPT,教他写诗这件事

图片[1]-关于我如何Fine tune「微调」ChatGPT,教他写诗这件事-JieYingAI捷鹰AI

写在前面(其实是最后写的)

关于验证「大模型+微调」可行性的想法

目前随着ChatGPT的大热,通用大模型也逐渐被更多人关注,但其实现在很多人都有疑问和困惑,这个通用大模型在自己的业务领域到底要怎么用?「通用大模型为底座」 + 「专业领域知识微调」的模式究竟在实际的业务中要如何落地?

出于对这个问题的探索,所以我本周末进行了文中这个实验。我的初衷是,找一个ChatGPT没有学习相关知识的领域,把对应的专业数据投喂给他,看他是否能从中学习到其中的隐性知识。这样做一是为了积累微调过程中的工程化经验,二是希望能够验证这种「大模型+微调」的方式究竟能不能在实际业务中落地。

按照之前的计划,这周是要继续读论文《Training language models to follow instructions with human feedback》,读完这系列论文再开始验证这件事情。这一点要感谢 @吴年京(Rickey) 同学的提醒和建议,让我我意识到完成上面这个验证,是更加重要且紧急的事情。所以读论文系列可能要暂时延后,但是不会停的。

从理论到具体场景的落地,这中间也是需要有人去蹚出一条路的,也是工程师更应该去做的事情,这个过程并不会很顺利,会有很多坑和很多雷,所以可能每篇文章并不会并不会像以前一样,能达到八到九成的干货输出,更多的是我踩坑的经验以及在这个过程中的牢骚和反思,或许你会问,这能有什么意义呢,嗯......我的想法是,至少有教育意义呀,就像是B站还有UP主专门讲别人是怎么破产的视频,我每次也看得特别下饭。

尽管这次实验从结果上来讲没有达到预期,也就是我无法通过本次实验来证明:「大模型+微调」方案的落地是可行的,而且目前我也不能确认原因是GPT本身中文训练语料不足的先天缺陷带来的问题,还是我挑选场景和微调方式的问题。但是在过程中积累的一些工程化的经验、以及对OpenAI官方文档的进一步熟悉,还是积攒了一些经验的。

关于挑选场景的来龙去脉

【浓缩版本】本小节目的是找一个我确认ChatGPT此前没有掌握的领域知识,验证是否能够通过Fine-tuning让他学会该领域知识,同时又不能是工作内容相关的内容。经过分析我认为ChatGPT不懂古诗词中的格律规则,同时这些又属于蕴藏在诗句中的隐性知识,且规则基本是固定的,所以我认为这是一个不错的实验场景。

这节的内容是在实验之前写了的,主要是我的分析过程,废话较多,看完浓缩其实就够了,当时是天真的以为我能一把梭哈成功的,所以整个不知天高地厚。当被毒打了之后,我学会做人了,所以本文的风格也会略显割裂,前后我已经处于不同的心态了~~

一连写了几篇关于ChatGPT论文和思考的文章,但我毕竟还是个服务端程序员(简称服务员),总不能一直不能光说不练。想做个应用呢,能想到的吧,别人都做了;想不到的吧,也就还没想到~~

不过发现近来很多人都在讨论,如何能让这个大模型适配在自己的业务上、到底能不能微调、怎么微调,于是我就用这个周末来实验一下,看看到底有多少坑~~

首先得找个场景。这个要注意一点是,目前有明确要求不能把任何相关业务数据投喂给ChatGPT,这点大家要切记,不要触碰红线。那就只能先找个业务无关的场景了。

作为一个古诗文重度爱好者,其实在我最初使用ChatGPT的时候,就尝试过让他写诗,但得到的往往是这样的结果:

图片[2]-关于我如何Fine tune「微调」ChatGPT,教他写诗这件事-JieYingAI捷鹰AI

先暂且不说这写的有没有诗的意蕴吧,就单说说这个平仄和对仗问题,

我就怕他乱写,所以明确要求了写一首七言律诗,而律诗的格式要求其实是很固定的,首先颔联和颈联要求对仗,我就丝毫看不出来。

再看押韵,如果按照平水韵要求来看,首句的“原”和尾句的“烟”是出韵的,但是按照中华新韵和中华通韵来说,又是押韵的,反正现在一般都用中华新韵了,就算他押韵是合格了吧。

再看平仄,既然押韵都按照中华新韵标准了,平仄肯定也按中华新韵来吧,首联“荒原”和“满山”分别是“平平”和“仄平”,那就是个平平脚了,首句就应该是“X平X仄仄平平”,“吹”字错了。剩下的就不详细分析了,总之平仄错了的字包括“硝烟”、“戍”、“扬”、“蹄”、“辣”、“勇”。

又想了一下,如果我强调一下用中华新韵并且要求他遵守七律的平仄规则,他能不能懂呢,于是我又试了一下,结果真是“老奶奶讲脱口秀——给爷逗乐了”。我这是算他是一首呢,还是算他是两首呢。先看前一半吧,上来第一句就给我出韵,还在下面注释给我保证用的中华新韵,我信他个鬼,后面的错误太多,就不挨个分析了。

图片[3]-关于我如何Fine tune「微调」ChatGPT,教他写诗这件事-JieYingAI捷鹰AI

写词就更是一言难尽了,他甚至不懂词牌代表什么意思。

图片[4]-关于我如何Fine tune「微调」ChatGPT,教他写诗这件事-JieYingAI捷鹰AI

所以由上面这些分析可知,ChatGPT是不懂诗词格律规则的(包括平仄、对仗),押韵似乎是懂的,那这不就是一个极好的实验场景吗?

如果我把唐诗三百首和宋词三百首投喂给ChatGPT做Fine-Tuning,他能不能从中学会这些规则呢?

准备工作

2.1 知识准备

主要是针对OpenAI官方文档的学习,目前想打开官方文档是需要梯子的,公司的网络加速打不开,需要科学上网。

这里我整理了一份《OpenAI - Fine-tuning官方文档整理&解读》,内容有点多,都堆在这个章节就太乱了,所以给了份链接,需要的同学可自取。

2.2 数据准备

由于我之前收集过所有古诗词的数据,都是json格式,只是格式和目前要求的格式不太一致,格式如下:

图片[5]-关于我如何Fine tune「微调」ChatGPT,教他写诗这件事-JieYingAI捷鹰AI

需要一个格式转换,需要我自己写吗?不会的,那有点麻烦了,交给ChatGPT来写吧,于是我给了他一个要求:

写一段Python代码,输入和输出都是json格式的文件

将这样格式的输入:

"author": "駱賓王",

"paragraphs": [

"西陸蟬聲唱,南冠客思侵。",

"那堪玄鬢影,來對白頭吟。",

"露重飛難進,風多響易沈。",

"無人信高潔,誰爲表予心。"

],

"tags": [

"唐诗三百首",

"咏物",

"咏物诗",

"五言律诗"

],

"title": "在嶽詠蟬",

"id": "c65539db-4e2b-4ce4-a22b-563b6ef3f4f1"

},

"author": "陳子昂",

"paragraphs": [

"前不見古人,後不見來者。",

"念天地之悠悠,獨愴然而涕下。"

],

"tags": [

"唐诗三百首",

"隋・唐・五代",

"八年级下册(课外)",

"伤怀",

"初中古诗",

"七言古诗"

],

"title": "登幽州臺歌",

"id": "c244a5b4-0ed0-48fe-8694-95309acac184"

},

"author": "明皇帝",

"paragraphs": [

"夫子何爲者?栖栖一代中。",

"地猶鄹氏邑,宅即魯王宮。",

"歎鳳嗟身否,傷麟怨道窮。",

"今看兩楹奠,當與夢時同。"

],

"tags": [

"唐诗三百首",

"伤怀",

"写人",

"五言律诗"

],

"title": "經鄒魯祭孔子而歎之",

"id": "a1824eb8-4e2e-4d53-9a33-e1dcfe7d1c73"

转化成这样格式的输出:

{"prompt": "唐诗三百首,咏物,咏物诗,五言律诗", "completion": "西陸蟬聲唱,南冠客思侵。那堪玄鬢影,來對白頭吟。露重飛難進,風多響易沈。無人信高潔,誰爲表予心。"}

{"prompt": "唐诗三百首,隋・唐・五代,伤怀,初中古诗,七言古诗", "completion": "前不見古人,後不見來者。念天地之悠悠,獨愴然而涕下。"}

{"prompt": "唐诗三百首,伤怀,写人,五言律诗", "completion": "夫子何爲者?栖栖一代中。地猶鄹氏邑,宅即魯王宮。歎鳳嗟身否,傷麟怨道窮。今看兩楹奠,當與夢時同。"}

并且要求只留下tags里面包含"七言律诗"的数据,同时把繁体字转化为简体字

给他这样一段要求,它就写出了我想要的程序,放到jupyter里它就产出了我想要的格式,这里就简单说一下需要的格式,要求就是需要两个字段,prompt和completion,但具体放置什么内容你可以自行设计,官方给出来了几个场景的例子,比如问答类的数据格式,就是prompt是问题,completion是答案;分类任务的格式数据,prompt是待分类的场景,completion是分类结果。

针对我这个场景,我的设计方案是prompt是诗词标签,completion是具体诗词内容,这样后续的问题输入就是以标签为要求让他生成诗词内容,具体如下:

图片[6]-关于我如何Fine tune「微调」ChatGPT,教他写诗这件事-JieYingAI捷鹰AI

用Python API踩得那些坑

官方给了Python API、Nodejs API、Http API三种方式,最初秉着能省事就省事的原则,我首先选择了Python API,开启了我这坎坷的一路,可能是我对Python不熟,使用的姿势不对。如果有Python API调通了的大佬,跪求指点。

我这里也记录一下踩坑步骤,跪求各位大佬指点,我真的很好奇是不是只有我一个人踩了这些坑~~

第一步 ,安装openai,安全

pip install --upgrade openai

第二步,import openai;跪了、报错了,网上有大佬说python 3.8不行,要换成python 3.6。咱也不太懂,咱也不敢问,就跟着换3.6了,好,过了。

图片[7]-关于我如何Fine tune「微调」ChatGPT,教他写诗这件事-JieYingAI捷鹰AI

第三步,处理数据,其实在【二】中讲的如何准备数据之前,我还干了一件比较愚蠢的事情,官方文档里说他们提供了一个工具,可以转换数据格式,我就好奇,真能把我的原始数据转成他们需要的那种格式?于是我就试试,然后就逝逝

图片[8]-关于我如何Fine tune「微调」ChatGPT,教他写诗这件事-JieYingAI捷鹰AI

然后我去搜了一下,,这个大佬说3.6低了,要用3.7.1+,我......,3.8高了,3.6低了,我人已经麻了,还好我装了Anaconda,因为这次教训,还在jupyter上装了一个能随时切环境的插件(感觉这个还是很需要的,下面附了教程和截图),要不然不得被折磨死~~~

插件安装教程:

图片[9]-关于我如何Fine tune「微调」ChatGPT,教他写诗这件事-JieYingAI捷鹰AI

好,版本换了,现在可以执行了,结果......,最后不满足要求的数据不会处理转换,而是直接报错,那我不如直接自己去代码转换,果然这个世界没有白画的饼~~

图片[10]-关于我如何Fine tune「微调」ChatGPT,教他写诗这件事-JieYingAI捷鹰AI

第四步,调用API。

这里就出现了比较奇怪的问题,调用Python API,就会报403的错误(有梯子也不行),但是在同样的环境下,用curl的方式就是通的,这一点我没有想明白原因。但是这就意味着目前只能是封装HTTP 请求了,既然是封装HTTP,那干脆用Java它不香嘛~

回到Java怀抱

回到Java就算是我的地盘了,要从头开始封装Http吗,不,我没那么勤劳,github上找了一个star最多的二方包,先引进来用着。能搭个后端应用,做一层包装,透出相关的Http接口,而不是直接在源代码的单测里面直接运行,已经算是我目前做的最深的技术预埋了。整个Java的搭建和开发都相对顺利,唯一需要注意的是运行的时候需要梯子,否则调不通OpenAI的接口。报下面这个错误的,一般就是没连梯子了。

图片[11]-关于我如何Fine tune「微调」ChatGPT,教他写诗这件事-JieYingAI捷鹰AI

整体流程就是首先调用上传文件的接口,将训练数据进行上传,然后调用创建微调的接口。创建成功之后稍等几分钟,就可以用你微调后的模型进行测试了。

这里有一点要注意的是GPT 3.5之后的对话是新给了一个接口出来的,是`POST `,而3.5之前用的接口是`POST`, 你微调之后的模型,要调3.5之前这个接口,这里我踩坑了(长得太像了),调了好半天调不通,后来发现接口选错了。

还有一个坑就是,假设你的账号加入了多个小组,就要在这个页面的“Default organization”看好,这里设置的是哪个小组,你现在的模型就创建在哪个小组,你在代码里调用API的时候就是调到这个组,扣费也是扣在这个小组。我第一次就没搞清楚弄错了,在把模型创建到了错误的小组之后,又把“Default organization”给改了,以至于接口就一直报找不到这个微调任务,我还以为是OpenAI服务出问题了,耽误了很久才发现是这个原因。

微调模型创建好之后,既可以通过封装的本地服务,通过postman来模拟接口测试,也可以直接在官方提供的测试平台进行测试:

实验结果以及分析

我一共进行了3次实验,第一次是把唐诗三百首的数据全部放进去,第二次是只放了七言律诗的52首,第三次是优化了prompt之后的七言律诗的52首。三次的实验效果都没有达到预期效果,微调后的结果甚至不如未经过微调的3.5版本,以至于我甚至看3.5版本产出的结果,竟然有那么一丢丢顺眼了

其中也尝试了各种调整参数,但是都没有得到预期的效果,这里就贴一个例子吧

图片[12]-关于我如何Fine tune「微调」ChatGPT,教他写诗这件事-JieYingAI捷鹰AI

目前我对此的一些分析如下

目前官方只支持GPT 3.0的的fine tune,GPT 3.5并不支持,就我目前的实验来说,经过我微调的3.0,效果还不如官方的3.5,微调有风险,上手需谨慎。

目前对于GPT是否能够做到通过微调方式学习某个陌生领域的隐性知识这件事,既不能证实也不能证伪,还无法分析出本次实验不及预期的原因究竟是来自我选择的场景和微调方式不对,还是由于模型本身中文语料不足的先天缺陷导致。

后续会加大数据量再进行一次实验,至少要达到共性数据在几百条左右,看是否有进步。

古诗文的场景可能不适合用来做这个微调实验,可能是其中的隐性知识较为复杂,并且今音古音存在差异,同时古诗的符号不满足同一律,符号的表意发生了偏移,所以模型学习起来的确存在难度。后续会再寻找一个更适合的场景再进行验证

【完全跑题的碎碎念】

关于用AI来作诗这件事,之前就有人在做的,清华大学几年前就推出了一个叫“九歌”的产品,并且也开源了这个模型,但和目前通用大模型还是有一定差异的。其实我对于AI作诗这件事,本身是抗拒的,本次只是觉得这个场景恰好能用来验证大模型是否能学习陌生领域的隐性知识,才拿来这做个实验。

无论是刘慈欣的《诗云》写的用所有字进行排列组合的方式暴力写诗,还是今天让人工智能仅仅学习语法规则来写诗,都是想通过技术来完成艺术的创造。但文学和艺术,究竟是否应该通过技术来完成。文字、绘画、音乐这些艺术形式,都是基于人类的特有的感知系统,生理结构产生的,对于其他物种来说,其实是感知不到的。所以如果从更宏观的宇宙文明视角来看,这些对于整体进步来讲是没有意义的。但他们的意义在于,他们是人类独有的一块自留地,是一块最后的栖息之所。就像是我当年明明文科比理科好很多,但还是毫不犹豫的选了理科,是因为这是我内心深处最后一块可以驻足的地方,如果用它来谋生,我会变得不知道自己是谁了。所以到今天,我依旧不认为技术应该去染指文学和艺术领域。但是我也知道,大的趋势到来时,是不以人的意志力为转移的,终究会朝着利益最大化的方向前进的。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
Like a child, always believe in hope, I believe the dream.
像孩子一样,永远相信希望,相信梦想