现在我们需要微调训练一个模型,可以根据内容的标题,判断出内容的分类。下在我们先准备一下训练数据,在这个地址,你可以找到一个 json 文件,打开这个文件,然后复制一下这个文件里的内容,然后在自己的一个 node.js 项目里面,可以在项目下面新建一个 data 目录,在里面新建一个文件,名字是 posts.json,再把复制的内容粘贴到这里。
这个 json 数据就是我们在训练模型的时候要用的数据,注意你在训练模型的时候,需要准备大量的数据,至少也得 200 条起步,这里我主要是为了演示微调模型的过程,所以只准备的少量的训练数据。
这个数据基本上就是在调用应用接口的时候返回来的数据,每个项目里面都有 title 还有 category 属性。训练模型用的数据,需要提供 prompt 还有 completion 这两个属性,所以我们需要把 title 改成 prompt,把 category 这个属性的名字改成 completion。
另外在 prompt 结尾需要添加一个特殊的分隔符,在 completion 属性值的最开始需要添加一个空格,然后在值的结尾还需要添加一个停止符号。
对这个 json 数据进行改造,可以让ChatGPT 帮我们写一个 node.js 程序。这里我们需要设计一个 prompt ,把需求讲明白,比如:“写一个 node.js 程序,程序是标准的 esm,可以处理一组名为 posts 的 json 数据。在数据里的 title 属性的值的结尾加上字符串'-->',将属性的名字替换成 'prompt'。在数据的 category 属性的值的开头添加一个空格,在属性值的结尾添加一个字符串'$!' ,将属性的名字替换成 'completion'。最后将转换之后的数据生成一个名为 posts_new.json 的文件,放在 data 这个目录里面。”
ChatGPT 会根据需求写一个 Node.js 程序,复制一下程序代码,在项目里面新建一个文件,名字是 converter.mjs,把复制的代码粘贴到这里。然后在终端,先进入到项目所在目录的下面,位置是桌面上的 ninghao-openai。再执行一下node converter.mjs 。
提示了一个错误,大概应该就是在导入 json 文件的位置出了点问题。可以复制一下这个错误,再去交给 ChatGPT 去处理一下。这里给我的建议是要在导入的后面用 asset 断言一下导入的东西的类型是 json ,复制一下这行代码。
替换掉项目里的这行导入 json 文件的代码。在终端,再重新运行一下这个程序。这里又提示了一个问题,大概是跟 __dirname 有关,复制一下这个错误,再把它交给 ChatGPT 检查一下。
这里它重新帮我们改了一下代码,复制一下这行 filePath。用它替换一下项目里的 filePath 这行声明。
在终端,重新运行一下程序,成功以后,在项目的 data 目录里面会生成一个新的 json 文件,打开这个 posts_new.json 观察一下。你会发现数据项目里的,title 变成了 prompt ,结尾还有一个分隔符,category 变成了 completion ,它的值的开头添加了一个空格,并且在结尾还有一个结束符,我用的结束符名字是这个$! ,你可以根自己的喜好去设计这个结束符号。
合并行
然后我们把这个文件的内容转换成一行,可以选中所有内容,然后打开命令面板,搜索“合并行”,执行一下,这样会把选中的文本合并成一行。再保存一下文件,如果你的编辑器安装了 prettier ,保存 json 文件会格式化文件,如果不想格式化,可以按一下 Command + K,然后再按一下 S 保存这个文件。
准备数据
在终端,执行一下 openai tools fine_tunes.prepare_data 这个命令,用一个 -f 选项,指定一下文件所在位置,这里就是当前目录 data 下面的 posts_new.json 这个文件。
工具会做一些分析,它说我的文件包含了 35 个样本数据,推荐我准备更多的数据,比如几百条数据,这样可以提升训练出来的模型的性能。
然后它又说根据数据,判断我想做的是微调一个可以用来分类的模型,建议我基于比较便宜的 ada 这个模型去做微调。最后它说 prompts 的后缀用的是这个 --> 。
问我们想要把训练数据拆分成训练还有验证数据集吗,输入 Y,按下回车。它会把数据拆分成用来训练用的训练数据,还有用来验证用的验证数据。又提示数据会写入新的 JSONL 文件,回车确认。
完成以后,在项目里观察一下,在 data 目录里会生成两个 .jsonl 文件,带 train 字样的是用来训练的数据,带这个 valid 字样的是用来验证用的数据集。因为我们的数据比较少,可以把 valid 文件里的这几条数据,放到 train 这个文件里。
这种 jsonl 格式的数据,每一行都会是一个单独的 json 数据,我们可以使用这种数据训练 GPT 模型。