NSDT工具推荐Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割

在之前的文章中,我概述了通过创建虚拟心理健康助手来集成 GPT-3 和 Dialogflow 所需的步骤。 在这一篇中,我们将通过学习如何微调(Fine-Tuning)我们的 GPT-3 模型来完善我们创建的心理健康聊天机器人。

1、什么是微调?

微调是训练大型语言模型 (LLM) 以识别特定输入和输出模式的过程,该模式可应用于任何自定义 NLP 任务。 🥥 简而言之,微调允许我们将自定义数据集拟合到 LLM 上,以便模型可以将其输出泛化到我们的特定任务。

2、为什么要微调?

取自官方文档,微调可让您通过提供以下内容从 GPT-3 模型中获得更多收益:

  • 比即时设计更高质量的结果
  • 能够训练比提示中更多的例子
  • 由于更短的提示而节省了代币
  • 更低的延迟请求

在高层次上,微调涉及以下步骤:

1、准备训练数据

GPT-3 期望你的微调数据集采用特定的 JSONL 文件格式,如下所示:

{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}

这很简单——每行由一个“提示”和一个“完成”组成,这是为特定提示生成的理想文本。

在准备和上传数据进行微调之前,第一步是收集我们的数据集。对于我们的心理健康助手,我在Kaggle上找到了这个非常方便的数据集 - 聊天机器人专用抑郁数据。根据作者的说法,这些数据可用于训练机器人以帮助患有抑郁症的人,这正是我们的用例!

数据是一个YAML文件,其中包含大约50个关于抑郁症的对话。看起来带有双破折号 (- -) 的第一行是用户的问题,以下行是机器人对用户的回答。让我们在 Colab 笔记本中进一步探索它。

探索性笔记可以在这里找到。

从 Kaggle 下载数据集并将其复制到你的 Google 云端硬盘文件夹。导入 yaml 包以读取我们的 .yml 文件,并使用 yaml.safe_load()将其转换为 JSON 对象。

import yaml

with open('/content/gdrive/MyDrive/depression-data/depression.yml', 'r') as file:
    data = yaml.safe_load(file)

接下来,让我们以所需的格式准备我们的数据集。

convos = data['conversations']

for convo in convos:
  completion = ''
  for i, dialog in enumerate(convo):
    if i == 0:
      prompt = dialog
      prompt = prompt.replace("\xa0", " ")
      # print('prompt:',prompt)
    else:
      completion += " " + dialog
      completion = completion.replace("\xa0", " ")
  completion = completion.strip()
  line = {'prompt': prompt, 'completion': completion}
  # print(line)
  output.append(line)
    
print(output)

上面的代码首先遍历我们的抑郁症数据,将第一行拆分为提示,并加入其余行作为完成。 它还从提示和完成中删除不需要的特殊字符。 这导致我们可以使用正确的数据格式来微调 GPT-3。

{'prompt': 'What Is Depression?', 'completion': 'Depression is a common and serious medical illness that negatively affects how you feel, the way you think and how you act. Fortunately,it is also treatable. Depression causes feelings of sadness and/or a loss of interest in activities you once enjoyed. It can lead to a variety of emotional and physical problems and can decrease your ability to function at work and at home.'},
{'prompt': 'I feel i have let my parents down', 'completion': 'No matter what,your parents will always be proud of you and will love you. You will feel much better if you share your feelings with them.'}

看其中的几行,我们可以看到补全根据用户的查询提供了一些有用的响应,这正是我们需要我们的模型来获取的,以便为有需要的用户提供实际的答复。

最后,让我们将数据下载为 JSONL 文件并将其移动到我们的 Colab notebook 项目目录。

from google.colab import files

with open('depression.jsonl', 'w') as outfile:
    for i in output:
        json.dump(i, outfile)
        outfile.write('\n')

files.download('depression.jsonl')    

现在我们有了微调数据集,让我们准备文件,以便可以上传它来微调模型。注意 — OpenAI 提供了一个有用的 CLI(命令行界面)工具来准备我们的数据。它可以轻松地将CSV,TSV,XLSX和JSON转换为正确的JSONL格式。

要开始使用,在笔记本单元格或从项目终端中,只需使用以下命令安装 Open AI python 依赖项 -

!pip install openai

接下来,要准备微调数据,请运行命令 -

!openai tools fine_tunes.prepare_data -f '/content/gdrive/MyDrive/depression-data/depression.jsonl'

确保在“-f”之后替换你的特定文件路径。 在添加一些建议的更改后,此命令将准备最终微调数据集。 现在,可以接受所有推荐的操作“是”,因为这将有助于提高模型性能——

注意——对第一个推荐操作接受“是”需要你在推理期间在提示后添加分隔符“->”,否则模型将简单地继续提示而不是预测完成。

下载的最终文件将以“prepared”为后缀,然后可以上传并用于微调模型。

请注意,我们的微调任务只有 51 个样本。 为了获得更好的准确性,Open AI 建议至少有 150-200 个微调示例,因为模型准确性会随着训练样本的数量线性增加。

2、训练一个新的微调模型

现在我们已经准备好数据,是时候微调 GPT-3 了! ⚙️ 我们可以通过 3 种主要方式对模型进行微调 —

  • 手动使用 OpenAI CLI
  • 以编程方式使用 OpenAI 包,以及
  • 通过 finetune API 端点。

对于本教程,我将使用 OpenAI CLI,因为它最容易上手。 要微调模型,请运行以下命令,其中“-m”后的值将用于训练特定的 GPT-3 模型。 因为我想训练最有能力的模型,所以我选择了也是使用成本最高的“davinci”。

!openai api fine_tunes.create -t "/content/gdrive/MyDrive/depression-data/depression_prepared.jsonl" -m davinci

如果尝试运行它,可能会收到类似“未提供 API 密钥”的错误。 那是因为我们还没有链接我们的 API 密钥。 为此,只需在 CLI 中将环境变量设置为你的 API 密钥,方法是运行 -

!set OPENAI_API_KEY=<YOUR-API-KEY>

或者通过在笔记本中运行以下单元 -

os.environ['OPENAI_API_KEY'] = "<YOUR-API-KEY>"

现在再次运行之前的 finetune 命令,瞧! — 你的 GPT-3 微调作业现已成功创建。

CLI 还将向你显示相关的微调成本、队列位置和训练时期。 完成后,你自己的微调 GPT-3 模型现在可以进行推理了!

3、使用你的微调模型

要使用新创建的微调模型,我们可以先在 Open AI Playground 中对其进行测试。 前往游乐场并选择你的微调模型。

从这里,我们可以测试一些提示,看看我们微调模型的表现如何。

3、提示

在我之前的帖子中,我们向模型给出了以下提示,它本身表现得很好——

The following is a conversation with an AI assistant that can have meaningful conversations with users. The assistant is helpful, empathic, and friendly. Its objective is to make the user feel better by feeling heard. With each response, the AI assisstant prompts the user to continue the conversation in a natural way

它运行良好,但我决定在一些额外的提示工程之后添加更多信息。 首先,我给了我的 AI 治疗助手一个角色——JOY。 (很贴切,嗯?😏)

然后我给 JOY 添加了一些个性特征,最后指定了 JOY 的核心目标功能——通过被倾听来帮助用户感觉更好。 我最终使用的最终提示是——

The following is a conversation with a therapist and a user. The therapist is JOY, who uses compassionate listening to have helpful and meaningful conversations with users. JOY is empathic and friendly. JOY's objective is to help the user feel better by feeling heard. With each response, JOY offers follow-up questions to encourage openness and continues the conversation in a natural way.

结果如下:

如你所见,结果是成功的。 JOY能够运用人性化的特质,如富有同情心的倾听和同理心,也能够正确地为用户的问题提供有用的解决方案!

注意 —— JOY 仍然无法在长时间的对话中进行对话,需要在与用户的长时间对话中进行微调,以获得更好的上下文和结果。

一旦你对输出感到满意,我们就可以将其部署到我们的应用程序中。 需要更改的只是模型的名称,它将被我们新训练的模型替换。 我们现在可以在我们的应用程序中以编程方式使用微调模型。 只需在 OpenAI Playground 中点击“显示代码”即可复制代码。

4、整合在一起

现在我们的微调模型可以使用了,让我们将它与我们的 Dialogflow 代理集成。 为此,我们需要更新之前的 webhook 实现代码并进行部署。

上次,我们使用 Node.js 和 Repl.it 作为我们的 Web 服务器,但为了混合使用,这次让我们使用 Python Flask 服务器 🐍。 更新后,我们的 webhook 端点应如下所示。 现在,开始部署我们的 webhook 实现服务器。

在我们继续之前,让我们为 Heroku 的免费层的死亡默哀片刻💀。 Heroku 是一个简单易用的平台,可用于部署你的任何 Web 应用程序。 现在它不再提供免费计划,我们需要一个替代方案来免费快速部署我们的应用程序——进入 Railway.App!

Railway 是一个云平台,你可以在其中轻松托管和部署任何应用程序。 他们提供了一个慷慨的免费层,并拥有超快的部署速度。 确保先将你的本地存储库推送到 Github,以便可以部署它。 登录到你的Railway帐户,进入仪表板后,去添加一个新项目。 然后选择从 Github 上传并选择你的 git 仓库,就是这样! 你的应用现已上线。 (确保更新 Dialogflow 代理中的 Webhook URL)。

输出结果如下:

可以在此处测试经过微调的心理健康助手

5、结束语

微调 GPT-3 和其他 LLM,被证明是特定领域任务的完美解决方案,通常可以将性能提高很多倍。 该模型在提取训练数据中指定的模式方面非常有效,即使在训练数据最少的情况下也能表现良好。

随着 LLM 变得更大、更易于访问和开源,正如我们目前所见,在不久的将来,我们预期微调将在自然语言处理中变得无处不在,因为它有可能解决任何 NLP 任务 。


原文链接:Fine-tuning GPT-3 Using Python to Create a Virtual Mental Health Assistant Bot

BimAnt翻译整理,转载请标明出处