关于人工智能:使用GPT3训练一个垃圾短信分类器

4次阅读

共计 8789 个字符,预计需要花费 22 分钟才能阅读完成。

平时咱们都会收到很多短信,因为微信等即时通讯工具的遍及,短信曾经成为了一个验证码接收器,然而偶然也有不少垃圾短信,所以对短信进行分类和屏蔽是一个很简略又很重要的需要。

目前在 AppStroe 上有很多实现短信分类的 App,比方《熊猫吃短信》,有须要能够自行下载体验一下。解决这样的一个简略的需要的 App,就能够让 App 的开发者赚不少钱,咱们能够学习一下这种需要用 GPT- 3 如何实现。

明天这个教程,咱们能够应用 GPT- 3 模型来实现一个垃圾短信分类器,能够做为一个 GPT3 模型二次开发训练的简略的入门练手我的项目

因为应用老本的起因(训练实现调用接口依然须要付费,而且更贵),此形式不适宜用于正式的生产环境,仅作为学习体验应用,期待当前会有老本更低更适合的形式。

如果您没有开发根底也能够理解学习训练过程,再找到有根底的程序员代为训练

训练数据

心愿训练什么,就要筹备什么数据,如果想要做一个通用的短信辨认那就须要尽可能的宽泛而多的短信样本,这个案例咱们只取一个人的短信来训练,须要的样本数量能够很少,训练进去的模型也会很实用于这个人。

咱们从某位同学手机上间接导出了一万条短信(好几年没删),而后随机取了 500 条短信作为样本进行标注,将短信分成四个简略的类型:告诉短信、垃圾短信、公益短信、失常短信,而后将文件保留为.csv 格局的文件,放到我的项目文件夹

分类 短信内容
告诉短信 【码上购】【网上营业厅】您的订单正在做批改证件操作,验证码:522348,非自己批准请勿向别人提供验证码信息
告诉短信 尊敬的客户:您好!您所反映的问题(工单号:TS00000000000000)已处理完毕,我司将跟进满意度考察,如您收到提醒短信,请对咱们的服务给予 10 分的称心评估。感谢您的了解和反对!< 湖南联通 10010>
垃圾短信 交费、充值更多人选联通手机营业厅,平安快捷,固定面值本机交费享受 9.95 折,快来体验吧!http://u.10010.cn/khddf2
公益短信 公益短信:4 月 15 日是全民国家平安教育日。国家平安,人人有责!发现危害国家平安的状况,请拨打举报电话 12339,一经查实将予处分。【湖南省国家安全厅】
失常短信 今天上午能够装置吗老板

注意事项

  • 样本数量起码 200 条,倡议 500 条以上,数据越多准确率越高

  • 做分类训练,每个类型至多有 100 个样本,否则会影响准确率

  • 确保训练的样本与理论应用的状况是十分类似的,否则影响准确率

  • 如果样本外面蕴含敏感信息,能够用 * 号或者某某来进行脱敏解决,不会影响训练成果

  • 每条样本增加一个结束符,比方“###”或者“->”,如果没有增加,转换工具会问是否须要帮你增加

     
    

这里须要留神,咱们将短信分为四种,并且用中文示意,是不便咱们教程测试,理论应用中,应用数字代替中文分类,咱们将分类换成:

失常短信 =1,告诉短信 =2,公益短信 =3,垃圾短信 =4

因为模型接口是按 token 免费的,能够了解为按字数免费,用数字就能够节俭一些老本

另外,训练的模型有四种可选,davinci、curie、babbage、ada

其中 ada 价格最便宜,性能最好,像这种分类的简略需要,应用 ada 模型就能够了。

 

四种模型的价格如下:

模型 训练价格 训练实现调用价格
Ada &dollar;0.0004 / 1K tokens &dollar;0.0016 / 1K tokens
Babbage &dollar;0.0006 / 1K tokens &dollar;0.0024 / 1K tokens
Curie &dollar;0.0030 / 1K tokens &dollar;0.0120 / 1K tokens
Davinci &dollar;0.0300 / 1K tokens &dollar;0.1200 / 1K tokens

每 1 千 token,token 大略相当于字数,一个中文字约为 2 个 token,一条短信大概为 140 个 token,如果咱们以 ada 模型作为训练模型,换算下来,辨认 1 千条短信大略老本为 1.568 人民币。

价格不算便宜,然而人类历史上所有有需要但价格昂贵的货色,最终都会被市场打下来的。

 

训练过程

首先装置最新的 openai 库

pip install --upgrade openai

而后导入 open 的密钥,能够应用环境变量导入的形式

export OPENAI_API_KEY="< 填你的 openai 密钥 >" // linux 零碎 
set OPENAI_API_KEY="< 填你的 openai 密钥 >" // windows 零碎

GPT- 3 训练须要将样本数据转换为他们要求的 JSONL 格局


{"prompt": "输出的提醒", "completion": "输入的后果"}
...

{"prompt":"sms: 今天上午能够装置吗老板 ->", "completion":"失常短信"}
……

咱们能够应用 openai 提供的转换工具,来换为符合要求的格局

openai tools fine_tunes.prepare_data -f < 样本文件地址 >
openai tools fine_tunes.prepare_data -f sms_classifier/sms_sample_500_converted.csv

首先将咱们 csv 文件的表头,改成 prompt 和 completion,代表输出和输入的内容,而后在信息后面加一个标记(sms:),用于区别失常的内容

completion prompt
告诉短信 sms:【码上购】【网上营业厅】您的订单正在做批改证件操作,验证码:522348,非自己批准请勿向别人提供验证码信息!

解决好 csv 文件之后,执行命令进行转换

openai tools fine_tunes.prepare_data -f sms_classifier/sms_sample_500_converted.csv

其中提醒咱们一些注意事项,一路点选 Y 就能够了


(venv) D:\dev2023\openai-tutorial>openai tools fine_tunes.prepare_data -f sms_classifier/sms_sample_500_converted.csv
Analyzing...

- Based on your file extension, your file is formatted as a CSV file
- Your file contains 441 prompt-completion pairs
- Based on your data it seems like you're trying to fine-tune a model for classification
- For classification, we recommend you try one of the faster and cheaper models, such as `ada`
- For classification, you can estimate the expected model performance by keeping a held out dataset, which is not used for training
- All prompts end with suffix ` ##`
- All prompts start with prefix `sms: `
- The completion should start with a whitespace character (` `). This tends to produce better results due to the tokenization we use. See https://beta.openai.com/docs/guides/fine-tuning/preparing-your-dataset for 
more details

Based on the analysis we will perform the following actions:
- [Necessary] Your format `CSV` will be converted to `JSONL`
- [Recommended] Add a whitespace character to the beginning of the completion [Y/n]: y
- [Recommended] Would you like to split into training and validation set? [Y/n]: y


Your data will be written to a new JSONL file. Proceed [Y/n]: y

Wrote modified files to `sms_classifier/sms_sample_500_converted_prepared_train.jsonl` and `sms_classifier/sms_sample_500_converted_prepared_valid.jsonl`
Feel free to take a look!

Now use that file when fine-tuning:
> openai api fine_tunes.create -t "sms_classifier/sms_sample_500_converted_prepared_train.jsonl" -v "sms_classifier/sms_sample_500_converted_prepared_valid.jsonl" --compute_classification_metrics --classification_n_classes 4

After you’ve fine-tuned a model, remember that your prompt has to end with the indicator string ` ##` for the model to start generating completions, rather than continuing with the prompt.
Once your model starts training, it'll approximately take 12.92 minutes to train a `curie` model, and less for `ada` and `babbage`. Queue will approximately take half an hour per job ahead of you.

其中工具会帮咱们将样本分成训练集和测试集,以便训练实现之后测试训练的成果

同时也揭示咱们:

  • 训练实现后,失常的调用也须要放弃与样本雷同的申请格局

  • 如果抉择 curie 模型,大略须要 12.92 分钟,如果抉择 ada 或者 babbage 模型则更短一些

 

开始训练

这里咱们指定模型为 ada:-m ada

指定训练的名称为:–suffix sms_classifier

(venv) D:\dev2023\openai-tutorial>openai api fine_tunes.create -m ada --suffix "sms_classifier" -t "sms_classifier/sms_sample_500_converted_prepared_train.jsonl" -v "sms_classifier/sms_sample_500_converted_prepared_valid.jsonl" --compute_classification_metrics --classification_n_classes 4
Upload progress: 100%|██████████████████████████████████████████| 97.6k/97.6k [00:00<00:00, 95.8Mit/s]
Uploaded file from sms_classifier/sms_sample_500_converted_prepared_train.jsonl: file-HQgXiRZBxwn7In0sUax1WVdj
Upload progress: 100%|██████████████████████████████████████████| 24.3k/24.3k [00:00<?, ?it/s]
Uploaded file from sms_classifier/sms_sample_500_converted_prepared_valid.jsonl: file-gtmsXSjMpmdFowRQ8Hn0FxbX
Created fine-tune: ft-tEt9Oo95zgJ42KJvP4nS8nee
Streaming events until fine-tuning is complete...

(Ctrl-C will interrupt the stream, but not cancel the fine-tune)
[2023-02-14 11:56:00] Created fine-tune: ft-tEt9Oo95zgJ42KJvP4nS8nee

这里提醒曾经创立了一个训练任务,返回了一个工作 ID:ft-zYQQqF1bBvOgiFllSR8R9jvZ

前面咱们能够通过这个工作 ID 来查问具体的状况

按 Ctrl+ C 能够中断输入工作训练状况,但不会中断工作

如果产生中断,能够应用命令持续查看记录

openai api fine_tunes.follow -i < 工作 ID>

期待一会后能够看到曾经实现了训练


(venv) D:\dev2023\openai-tutorial>openai api fine_tunes.follow -i ft-wHXGw263e8ujLaDHNQGqYB6K
[2023-02-14 13:36:56] Created fine-tune: ft-wHXGw263e8ujLaDHNQGqYB6K
[2023-02-14 13:44:57] Fine-tune costs $0.10
[2023-02-14 13:44:58] Fine-tune enqueued. Queue number: 1
[2023-02-14 13:44:58] Fine-tune is in the queue. Queue number: 0
[2023-02-14 13:45:01] Fine-tune started
[2023-02-14 13:46:10] Completed epoch 1/4
[2023-02-14 13:47:07] Completed epoch 2/4
[2023-02-14 13:48:03] Completed epoch 3/4
[2023-02-14 13:48:59] Completed epoch 4/4
[2023-02-14 13:49:24] Uploaded model: ada:ft-personal:sms-classifier-2023-02-14-05-49-24
[2023-02-14 13:49:25] Uploaded result file: file-SaX4z4avlLH8KXDFM3UyNFoU
[2023-02-14 13:49:25] Fine-tune succeeded

Job complete! Status: succeeded 🎉
Try out your fine-tuned model:

openai api completions.create -m ada:ft-personal:sms-classifier-2023-02-14-05-49-24 -p <YOUR_PROMPT>

能够看到工作是耗费了 $0.10,模型名称为:ada:ft-personal:sms-classifier-2023-02-14-05-05-31

咱们能够输出一条短信来测试一下后果,留神格局必须与样本的格局雷同

其中 - M 参数示意限度返回的 token 长度,因为咱们只须要返回咱们标签分类,所以返回长度 1 就能够了

(venv) D:\dev2023\openai-tutorial>openai api completions.create -m ada:ft-personal:sms-classifier-2023-02-14-05-49-24 -p "sms: 你在哪里 ###" -M 1
sms: 你在哪里 ### 1

(venv) D:\dev2023\openai-tutorial>openai api completions.create -m ada:ft-personal:sms-classifier-2023-02-14-05-49-24 -p "sms:【京东】邀您参加调研,有机会得 800 京豆,点 3.cn/1EgRyx-J 回复 TD8 退订 ###" -M 1          
sms:【京东】邀您参加调研,有机会得 800 京豆,点 3.cn/1EgRyx-J 回复 TD8 退订 ### 4

能够看到模型曾经能失常辨认一些全新的短信并正确分类。

如何利用到生产环境中:

import openai

def model_predict(sms):
    response = openai.Completion.create(
        # 指定要应用的模型:这里应用的是咱们训练好的模型
        model="ada:ft-personal:sms-classifier-2023-02-14-05-49-24",
        prompt="""sms: {sms}###""".format(sms=sms),
        temperature=0.6,
        max_tokens=1,
    )
    return response

if __name__ == '__main__':
    sms = "【腾讯云】尊敬的用户,您好,我是腾讯云技术顾问。您(账号 ID: 123*****"
    category = {"1": "短信", "2": "告诉短信", "3": "公益告短信", "4": "垃圾短信"}
    response = model_predict(sms)
    print("判断后果:", category[response.choices[0].text])

输入

(venv) D:\dev2023\openai-tutorial>python sms_classifier/test.py  
判断后果:告诉短信

 

迭代训练

然而目前准确率依然不高,起因有二:

  • 样本总量不够多
  • 各分类的样本数量不平均,有的太少(不到 10 条)

为了进步准确率,咱们后续还能够持续整顿样本,对以后模型进一步进行训练,不须要从头开始从新训练。

同时,持续整顿新样本时,能够先用模型进行辨认标注再人工校对,能够进步整顿速度。

在创立迭代训练任务时,减少参数:

-m curie: ft-< org >-< date >

也就是上次训练实现的名称:ada:ft-personal:sms-classifier-2023-02-14-05-49-24

与上次创立工作的参数雷同,在前面减少参数:

openai api fine_tunes.create -m ada --suffix "sms_classifier" -t "sms_classifier/sms_sample_500_converted_prepared_train.jsonl" -v "sms_classifier/sms_sample_500_converted_prepared_valid.jsonl" --compute_classification_metrics --classification_n_classes 4 -m ada:ft-personal:sms-classifier-2023-02-14-05-49-24

另外咱们还能够对每次的训练后果进行剖析,这里须要帮助官网提供的其余工具,因篇幅无限这里就不开展聊这个局部。

 

更多训练类型与商业利用

GPT- 3 经过训练能够利用在很多种场景,能够实现 ChatGPT 达不到的成果,能够实现更精准更弱小的商业利用

咱们大抵布局以下能够训练的类型:

 

内容分类器

能够实现对一段内容的分类,以下类型都能够用明天这篇教程的形式训练

  1. 短信分类、垃圾邮件分类
  2. 微博博文情绪判断(消极 / 踊跃、侧面 / 负面)
  3. 美食评估、点评内容的分类
  4. 网站留言是否为广告
  5. 微信群内信息是否为广告 / 是否为须要重点关注的信息

 

结构化信息提取

能够实现对一段内容进行结构化提取,取出咱们想要的重点字段

  1. 简历重点信息提取和筛选
  2. IPO 招股书、上市公司年报等核心内容提取
  3. 从一段求职文本提取重要信息
  4. 快递地址结构化提取

 

上下文会话

通过训练对话样本,能够训练一个对话机器人,实现专用的聊天客服机器人。

  1. 公司征询客服机器人
  2. 在线销售聊天辅助
  3. 语音呼叫应答逻辑解决
  4. 心理 / 法律 / 医疗等业余会话征询

     
    

信息嵌入查问

能够通过加载内部数据库,实现更弱小的信息查问性能,在业余畛域进行利用

  1. 律师文本撰写:比方输出案由生成法律条文根据
  2. 患者病历诊断,输出病历和诊断后果训练,从而辅助医生判断病情
  3. 银行信贷审核,输出贷款客户各项信息,输入判断

 

留神:所有训练样本都能够脱敏解决,电话、姓名等隐衷信息请全副用 * 号代替。

训练完之后的模型和数据是公有的,只能在你的账号之下应用。

如果您有以上内容的或者能够实现类似性能的样本,违心与咱们单干,能够分割咱们代为训练,能够在您的账号之下训练,这项服务目前不免费用。

本次分享所有的代码和数据集会放在公众号后,请关注公众号并回复:短信分类器 获取。

 

ChatGPT 正在迅速走红,寰球都在推广和关注这个我的项目,许多人也正在尝试从中变现获利。然而,他们所采纳的办法往往都过于简略和低门槛,如“写作文”、“写求职信”等。为了实现更高水平的商业价值,咱们心愿尝试更简单,更深度定制的办法。例如,咱们能够通过收集数据库并进行二次训练,比方训练一个适宜公司理论状况的客户服务的机器人。
因而,咱们将在当前逐步分享咱们的钻研步骤和操作方法,以帮忙那些心愿深刻理解 GPT 模型训练的敌人。这样,他们就能够以更低的技术门槛实现更高级的商业价值。

我的公众号:@大鹏学开发

加我拉你进交换群:aaronpeng2046 

此内容由猪猪代管经营,业务邮箱:1018097585@qq.com

正文完
 0