在本教程中,我们将使用包含狗美容业务客户评价的合成数据集,对 IBM® Granite 模型 进行提示微调。
提示微调是一种高效且低成本的方法,可在无需重新训练整个模型及更新其权重的情况下,将 人工智能 (AI) 基础模型适配到新的下游任务。
基础模型建立在大语言模型 (LLM) 之上,并接收大量训练数据。基础模型的常见用例是聊天机器人和虚拟助理。
有几种方法可以改进基础模型对输入的解释及其响应质量。为了更好地理解这些细微差别,让我们比较一些方法。
硬提示面向用户并需要用户采取行动。硬提示可以被认为是 LLM 生成响应的模板或指令。接下来将介绍一个硬提示的示例。我们建议您查看 IBM 文档页面,以获取关于此类提示类型及其他多种提示类型的更多信息。
使用这种硬提示模板,LLM 可以获得有关首选输出结构和风格的具体指令。通过这种明确的提示,LLM 更有可能产生更高质量的期望响应。
与硬提示不同,软提示不是用自然语言编写的。相反,提示被初始化为 AI 生成的、附加到每个输入嵌入开头的数值向量,这些向量从更大的模型中提炼知识。这种缺乏可解释性也适用于选择针对给定任务优化的提示的 AI。通常,AI 无法解释它为什么选择这些嵌入。与其他提示方法相比,这些虚拟令牌的计算成本比微调更低,因为模型本身保持固定权重。软提示也往往优于人工设计的硬提示。
在本教程中,我们将使用软提示进行提示微调。
您需要一个 IBM® Cloud 帐户才能创建 watsonx.ai项目。
虽然您可以选择多种工具,本教程将引导您如何设置 IBM 帐户以使用 Jupyter Notebook。
使用您的 IBM Cloud 帐户登录 watsonx.ai使用您的 IBM Cloud 帐户。
创建一个 watsonx.ai 项目。
您可以从项目内部获取项目 ID。单击“管理”选项卡。然后,从“常规”页面中的“详细信息”部分复制项目 ID。您需要此 ID 来完成本教程。
创建一个 Jupyter Notebook。
此步骤将打开一个 Notebook 环境,您可以在其中复制本教程的代码,以便自己实现提示微调。或者,您可以将此笔记本下载到本地系统并将其作为资产上传到您的 watsonx.ai 项目。可以在 GitHub 上找到此 Jupyter Notebook 以及使用的数据集。
创建一个 watsonx.ai 运行时服务实例(选择适当的区域并选择精简计划,这是一个免费实例)。
生成 API 密钥。
将 watsonx.ai 运行时服务实例与您在 watsonx.ai 中创建的项目关联。
学习本教程时,您将需要一些库和模块。请确保导入以下内容;如果尚未安装,可以通过快速的 pip 安装来解决。
设置您的凭据。输入您的 API 密钥和项目 ID。
建立环境的第一步是使用您的身份验证详细信息创建 APIClient 实例,并设置 Project_id。
输出:
'SUCCESS'
在本教程中,我们将使用由狗美容业务评论组成的合成数据集。使用相应的 URL,我们可以将数据集连接到 API 客户端。
您可以自由使用您选择的任何数据集。HuggingFace 等平台上有多个开源数据集可用。
输出:
正在创建数据资产...
SUCCESS
输出:
3b1db894-8d9e-428d-8fee-d96f328c7726
为了更好地了解这些客户评论的格式,我们将把数据加载到 Pandas 数据框中,并打印几行展示正面和负面评论的记录。输出“1”表示正面评论,“0”表示负面评论。
输出:
TuneExperiment 类用于创建实验和安排调整。让我们用它来初始化我们的实验,并设置我们的基础模型、训练数据和参数。这次提示调整练习的目标是让 LLM 根据我们从数据集中提取的客户满意度评分来调整其响应。这是一个分类任务,因为评论可以被分类为正面(“1”)或负面(“0”)。
对于本教程,我们建议使用 IBM Granite 模型作为大语言模型来实现类似的结果。
现在我们已经设置好调整实验,需要将其与数据集连接。为此,我们使用 DataConnection 类。这需要使用之前在通过 API 客户端创建数据资产时生成的 asset_id。
您可以自由使用您选择的任何 AI 模型。 此处 可找到通过 watsonx 调整的基础模型,或者运行以下命令。
输出:
{'FLAN_T5_XL': 'google/flan-t5-xl', 'GRANITE_13B_INSTRUCT_V2': 'ibm/granite-13b-instruct-v2', 'LLAMA_2_13B_CHAT': 'meta-llama/llama-2-13b-chat'}
输出:
##############################################
Running '20671f17-ff53-470b-9bfe-04318ecb91d9'
##############################################
pending......
running....................................................................................................................................
completed
Training of '20671f17-ff53-470b-9bfe-04318ecb91d9' finished successfully.
为了确保我们的提示微调已经结束,我们可以检查状态。如果打印的状态不是“completed”,请等待调整完成后再继续。
输出:
已完成
现在我们可以获取提示微调的总结。在此总结中,您将看到一个损失值。对于每次训练,损失函数会衡量预测结果与实际结果之间的差异。因此损失值越低越好。
我们还可以使用 plot_learning_curve() 函数绘制模型调整的学习曲线。一条向下倾斜且接近零的曲线表明模型正在改进其预期输出生成。要了解有关解释损失函数图的更多信息,请参阅相关的 IBM watsonx 文档。
输出:
部署调整后的模型是完成下一步(将调整后的模型性能与调整前的模型进行比较)的关键步骤。
注意:SERVING_NAME 设置为当前日期和时间,因为它必须是唯一值。
输出:
######################################################################################
Synchronous deployment creation for id: '6aa5dd5c-0cc4-44e0-9730-18303e88e14a' started
######################################################################################
initializing.......................
ready
-----------------------------------------------------------------------------------------------
Successfully finished deployment creation, deployment_id='24a97b84-47d0-4490-9f5f-21ed2376fdd6'
-----------------------------------------------------------------------------------------------
现在,让我们测试调整后的模型和原始基础模型的性能,以了解调整过程的影响。首先,让我们加载测试数据集。该数据集应该是调整期间不存在的数据子集。通常,测试集也比训练集小。此外,测试数据集中的每个输入都将提示作为用户评论的前缀。
让我们展示一小部分数据集,以便更好地了解其结构。
输出:
加载测试数据集后,让我们提取输入和输出。
我们还可以打印示例测试输入和输出,以更好地了解我们是如何提取数据集内容的。
输出:
'Extract the satisfaction from the comment. Return simple 1 for satisfied customer or 0 for unsatisfied.\nComment: Long wait times.\nSatisfaction:\n'
在这个例子中,首先引入提示,然后是客户对等待时间长的评论,最后,满意度为 0,表示负面评论。
输出:
0
现在我们有了测试数据集,让我们测试已调整模型的准确性和 F1 分数。F1 分数是模型精确率和召回率的平均值。我们需要 deployment_id 来做到这一点。请注意,concurrency_limit 设置为 2 以避免达到 API 的速率限制。这是将并行发送的请求数。
输出:
accuracy_score: 0.9827586206896551, f1_score: 0.9827586206896551
鉴于我们模型的高准确率和 F1 分数,让我们测试一下未经任何调整的同一 Granite 模型的性能。
输出:
base model accuracy_score: 0.9310344827586207, base model f1_score: 0.9298245614035088
我们的已调整模型优于调整前的基础模型。由于调整后的模型专门用于提取满意度分数,因此它可以用于其他满意度提取任务。做得非常棒!
在本教程中,您使用 watsonx API 对 IBM Granite 模型执行了提示微调。您调整并部署的模型已成功超越基础模型,准确度提高约 5%。