使用GPT-3訓(xùn)練垃圾短信分類器示例詳解
引言
平時(shí)我們都會(huì)收到很多短信,由于微信等即時(shí)通訊工具的普及,短信已經(jīng)成為了一個(gè)驗(yàn)證碼接收器,但是偶爾也有不少垃圾短信,所以對(duì)短信進(jìn)行分類和屏蔽是一個(gè)很簡單又很重要的需求。
目前在AppStroe上有很多實(shí)現(xiàn)短信分類的App,比如《熊貓吃短信》,有需要可以自行下載體驗(yàn)一下。解決這樣的一個(gè)簡單的需求的App,就可以讓App的開發(fā)者賺不少錢,我們可以學(xué)習(xí)一下這種需求用GPT-3如何實(shí)現(xiàn)。
今天這個(gè)教程,我們可以使用GPT-3模型來實(shí)現(xiàn)一個(gè)垃圾短信分類器,可以做為一個(gè)GPT3模型二次開發(fā)訓(xùn)練的簡單的入門練手項(xiàng)目
因?yàn)槭褂贸杀镜脑颍ㄓ?xùn)練完成調(diào)用接口仍然需要付費(fèi),而且更貴),此方式不適合用于正式的生產(chǎn)環(huán)境,僅作為學(xué)習(xí)體驗(yàn)使用,期待以后會(huì)有成本更低更合適的方式。
*如果您沒有開發(fā)基礎(chǔ)也可以了解學(xué)習(xí)訓(xùn)練過程,再找到有基礎(chǔ)的程序員代為訓(xùn)練 *
訓(xùn)練數(shù)據(jù)
希望訓(xùn)練什么,就要準(zhǔn)備什么數(shù)據(jù),如果想要做一個(gè)通用的短信識(shí)別那就需要盡可能的廣泛而多的短信樣本,這個(gè)案例我們只取一個(gè)人的短信來訓(xùn)練,需要的樣本數(shù)量可以很少,訓(xùn)練出來的模型也會(huì)很適用于這個(gè)人。
我們從某位同學(xué)手機(jī)上直接導(dǎo)出了一萬條短信(好幾年沒刪),然后隨機(jī)取了500條短信作為樣本進(jìn)行標(biāo)注,將短信分成四個(gè)簡單的類型:通知短信、垃圾短信、公益短信、正常短信,然后將文件保存為.csv格式的文件,放到項(xiàng)目文件夾
分類 | 短信內(nèi)容 |
---|---|
通知短信 | 【碼上購】【網(wǎng)上營業(yè)廳】您的訂單正在做修改證件操作,驗(yàn)證碼:522348,非本人同意請(qǐng)勿向他人提供驗(yàn)證碼信息 |
通知短信 | 尊敬的客戶:您好!您所反映的問題(工單號(hào):TS00000000000000)已處理完畢,我司將跟進(jìn)滿意度調(diào)查,如您收到提示短信,請(qǐng)對(duì)我們的服務(wù)給予10分的滿意評(píng)價(jià)。感謝您的理解和支持!<湖南聯(lián)通10010> |
垃圾短信 | 交費(fèi)、充值更多人選聯(lián)通手機(jī)營業(yè)廳,安全快捷,固定面值本機(jī)交費(fèi)享受9.95折,快來體驗(yàn)吧!u.10010.cn/khddf2 |
公益短信 | 公益短信:4月15日是全民國家安全教育日。國家安全,人人有責(zé)!發(fā)現(xiàn)危害國家安全的情況,請(qǐng)撥打舉報(bào)電話12339,一經(jīng)查實(shí)將予獎(jiǎng)勵(lì)?!竞鲜野踩珡d】 |
正常短信 | 今天上午可以安裝嗎老板 |
注意事項(xiàng)
- 樣本數(shù)量最少200條,建議500條以上,數(shù)據(jù)越多準(zhǔn)確率越高
- 做分類訓(xùn)練,每個(gè)類型至少有100個(gè)樣本,否則會(huì)影響準(zhǔn)確率
- 確保訓(xùn)練的樣本與實(shí)際使用的情況是非常相似的,否則影響準(zhǔn)確率
- 如果樣本里面包含敏感信息,可以用*號(hào)或者某某來進(jìn)行脫敏處理,不會(huì)影響訓(xùn)練效果
- 每條樣本添加一個(gè)結(jié)束符,比如“###”或者“->",如果沒有添加,轉(zhuǎn)換工具會(huì)問是否需要幫你添加
這里需要注意,我們將短信分為四種,并且用中文表示,是方便我們教程測試,實(shí)際使用中,使用數(shù)字代替中文分類,我們將分類換成:
正常短信=1, 通知短信=2, 公益短信=3, 垃圾短信=4
因?yàn)槟P徒涌谑前磘oken收費(fèi)的,可以理解為按字?jǐn)?shù)收費(fèi),用數(shù)字就可以節(jié)省一些成本
另外,訓(xùn)練的模型有四種可選,davinci、curie、babbage、ada
其中ada價(jià)格最便宜,性能最好,像這種分類的簡單需求,使用ada模型就可以了。
四種模型的價(jià)格如下:
模型 | 訓(xùn)練價(jià)格 | 訓(xùn)練完成調(diào)用價(jià)格 |
---|---|---|
Ada | $0.0004 / 1K tokens | $0.0016 / 1K tokens |
Babbage | $0.0006 / 1K tokens | $0.0024 / 1K tokens |
Curie | $0.0030 / 1K tokens | $0.0120 / 1K tokens |
Davinci | $0.0300 / 1K tokens | $0.1200 / 1K tokens |
每1千token,token大概相當(dāng)于字?jǐn)?shù),一個(gè)中文字約為2個(gè)token,一條短信大約為140個(gè)token,如果我們以ada模型作為訓(xùn)練模型,換算下來,識(shí)別1千條短信大概成本為1.568人民幣。
價(jià)格不算便宜,但是人類歷史上所有有需求但價(jià)格昂貴的東西,最終都會(huì)被市場打下來的。
訓(xùn)練過程
首先安裝最新的openai庫
pip install --upgrade openai
然后導(dǎo)入open的密鑰,可以使用環(huán)境變量導(dǎo)入的方式
export OPENAI_API_KEY="<填你的openai密鑰>" // linux系統(tǒng) set OPENAI_API_KEY="<填你的openai密鑰>" // windows系統(tǒng)
GPT-3訓(xùn)練需要將樣本數(shù)據(jù)轉(zhuǎn)換為他們要求的JSONL格式
{"prompt": "輸入的提示", "completion": "輸出的結(jié)果"} ...
{"prompt":"sms: 今天上午可以安裝嗎老板 ->", "completion":" 正常短信"} ……
我們可以使用openai提供的轉(zhuǎn)換工具,來換為符合要求的格式
openai tools fine_tunes.prepare_data -f <樣本文件地址> openai tools fine_tunes.prepare_data -f sms_classifier/sms_sample_500_converted.csv
首先將我們csv文件的表頭,改成 prompt 和 completion,代表輸入和輸出的內(nèi)容,然后在信息前面加一個(gè)標(biāo)志(sms: ),用于區(qū)別正常的內(nèi)容
completion | prompt |
---|---|
通知短信 | sms:【碼上購】【網(wǎng)上營業(yè)廳】您的訂單正在做修改證件操作,驗(yàn)證碼:522348,非本人同意請(qǐng)勿向他人提供驗(yàn)證碼信息! |
處理好csv文件之后,執(zhí)行命令進(jìn)行轉(zhuǎn)換
openai tools fine_tunes.prepare_data -f sms_classifier/sms_sample_500_converted.csv
其中提示我們一些注意事項(xiàng),一路點(diǎn)選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.
其中工具會(huì)幫我們將樣本分成訓(xùn)練集和測試集,以便訓(xùn)練完成之后測試訓(xùn)練的效果
同時(shí)也提醒我們:
- 訓(xùn)練完成后,正常的調(diào)用也需要保持與樣本相同的請(qǐng)求格式
- 如果選擇curie模型,大概需要12.92分鐘,如果選擇ada或者babbage模型則更短一些
開始訓(xùn)練
這里我們指定模型為ada:-m ada
指定訓(xùn)練的名稱為:--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
這里提示已經(jīng)創(chuàng)建了一個(gè)訓(xùn)練任務(wù),返回了一個(gè)任務(wù)ID:ft-zYQQqF1bBvOgiFllSR8R9jvZ
后面我們可以通過這個(gè)任務(wù)ID來查詢具體的情況
按Ctrl+C可以中斷輸出任務(wù)訓(xùn)練情況,但不會(huì)中斷任務(wù)
如果發(fā)生中斷,可以使用命令繼續(xù)查看記錄
openai api fine_tunes.follow -i <任務(wù)ID>
等待一會(huì)后可以看到已經(jīng)完成了訓(xùn)練
(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>
可以看到任務(wù)是消耗了$0.10,模型名稱為:ada:ft-personal:sms-classifier-2023-02-14-05-05-31
我們可以輸入一條短信來測試一下結(jié)果,注意格式必須與樣本的格式相同
其中 -M參數(shù)表示限制返回的token長度,因?yàn)槲覀冎恍枰祷匚覀儤?biāo)簽分類,所以返回長度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: 【京東】邀您參與調(diào)研,有機(jī)會(huì)得800京豆,點(diǎn) 3.cn/1EgRyx-J 回復(fù)TD8退訂###" -M 1 sms: 【京東】邀您參與調(diào)研,有機(jī)會(huì)得800京豆,點(diǎn) 3.cn/1EgRyx-J 回復(fù)TD8退訂### 4
可以看到模型已經(jīng)能正常識(shí)別一些全新的短信并正確分類。
如何應(yīng)用到生產(chǎn)環(huán)境中:
import openai def model_predict(sms): response = openai.Completion.create( # 指定要使用的模型:這里使用的是我們訓(xùn)練好的模型 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 = "【騰訊云】尊敬的用戶,您好,我是騰訊云技術(shù)顧問。您(賬號(hào)ID: 123*****" category = {"1": "短信", "2": "通知短信", "3": "公益告短信", "4": " 垃圾短信"} response = model_predict(sms) print("判斷結(jié)果:", category[response.choices[0].text])
輸出
(venv) D:\dev2023\openai-tutorial>python sms_classifier/test.py 判斷結(jié)果:通知短信
迭代訓(xùn)練
但是目前準(zhǔn)確率仍然不高,原因有二:
- 樣本總量不夠多
- 各分類的樣本數(shù)量不均勻,有的太少(不到10條)
為了提高準(zhǔn)確率,我們后續(xù)還可以繼續(xù)整理樣本,對(duì)當(dāng)前模型進(jìn)一步進(jìn)行訓(xùn)練,不需要從頭開始重新訓(xùn)練。
同時(shí),繼續(xù)整理新樣本時(shí),可以先用模型進(jìn)行識(shí)別標(biāo)注再人工校對(duì),可以提高整理速度。
在創(chuàng)建迭代訓(xùn)練任務(wù)時(shí),增加參數(shù):
-m curie: ft-< org >-< date >
也就是上次訓(xùn)練完成的名稱:ada:ft-personal:sms-classifier-2023-02-14-05-49-24
與上次創(chuàng)建任務(wù)的參數(shù)相同,在后面增加參數(shù):
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
另外我們還可以對(duì)每次的訓(xùn)練結(jié)果進(jìn)行分析,這里需要協(xié)助官方提供的其他工具,因篇幅有限這里就不展開聊這個(gè)部分。
更多訓(xùn)練類型與商業(yè)應(yīng)用
GPT-3經(jīng)過訓(xùn)練可以應(yīng)用在很多種場景,可以實(shí)現(xiàn)ChatGPT達(dá)不到的效果,可以實(shí)現(xiàn)更精準(zhǔn)更強(qiáng)大的商業(yè)應(yīng)用
我們大致規(guī)劃以下可以訓(xùn)練的類型:
內(nèi)容分類器
可以實(shí)現(xiàn)對(duì)一段內(nèi)容的分類,以下類型都可以用今天這篇教程的方式訓(xùn)練
- 短信分類、垃圾郵件分類
- 微博博文情緒判斷(消極/積極、正面/負(fù)面)
- 美食評(píng)價(jià)、點(diǎn)評(píng)內(nèi)容的分類
- 網(wǎng)站留言是否為廣告
- 微信群內(nèi)信息是否為廣告/是否為需要重點(diǎn)關(guān)注的信息
結(jié)構(gòu)化信息提取
可以實(shí)現(xiàn)對(duì)一段內(nèi)容進(jìn)行結(jié)構(gòu)化提取,取出我們想要的重點(diǎn)字段
- 簡歷重點(diǎn)信息提取和篩選
- IPO招股書、上市公司年報(bào)等核心內(nèi)容提取
- 從一段求職文本提取重要信息
- 快遞地址結(jié)構(gòu)化提取
上下文會(huì)話
通過訓(xùn)練對(duì)話樣本,可以訓(xùn)練一個(gè)對(duì)話機(jī)器人,實(shí)現(xiàn)專用的聊天客服機(jī)器人。
公司咨詢客服機(jī)器人
在線銷售聊天輔助
語音呼叫應(yīng)答邏輯處理
心理/法律/醫(yī)療等專業(yè)會(huì)話咨詢
信息嵌入查詢
可以通過加載外部數(shù)據(jù)庫,實(shí)現(xiàn)更強(qiáng)大的信息查詢功能,在專業(yè)領(lǐng)域進(jìn)行應(yīng)用
- 律師文本撰寫:比如輸入案由生成法律條文依據(jù)
- 患者病歷診斷,輸入病歷和診斷結(jié)果訓(xùn)練,從而輔助醫(yī)生判斷病情
- 銀行信貸審核,輸入貸款客戶各項(xiàng)信息,輸出判斷
注意:所有訓(xùn)練樣本都可以脫敏處理,電話、姓名等隱私信息請(qǐng)全部用***號(hào)代替。
訓(xùn)練完之后的模型和數(shù)據(jù)是私有的,只能在你的賬號(hào)之下使用。
如果您有以上內(nèi)容的或者可以實(shí)現(xiàn)相似功能的樣本,愿意與我們合作,可以聯(lián)系我們代為訓(xùn)練,可以在您的賬號(hào)之下訓(xùn)練,這項(xiàng)服務(wù)目前不收費(fèi)用。
本次分享所有的代碼和數(shù)據(jù)集 會(huì)放在公眾號(hào)后,請(qǐng)關(guān)注公眾號(hào)并回復(fù):短信分類器 獲取。
ChatGPT正在迅速走紅,全球都在推廣和關(guān)注這個(gè)項(xiàng)目,許多人也正在嘗試從中變現(xiàn)獲利。然而,他們所采用的方法往往都過于簡單和低門檻,如“寫作文”、“寫求職信”等。為了實(shí)現(xiàn)更高水平的商業(yè)價(jià)值,我們希望嘗試更復(fù)雜,更深度定制的方法。例如,我們可以通過收集數(shù)據(jù)庫并進(jìn)行二次訓(xùn)練,比如訓(xùn)練一個(gè)適合公司實(shí)際情況的客戶服務(wù)的機(jī)器人。 因此,我們將在以后逐漸分享我們的研究步驟和操作方法,以幫助那些希望深入了解GPT模型訓(xùn)練的朋友。這樣,他們就可以以更低的技術(shù)門檻實(shí)現(xiàn)更高級(jí)的商業(yè)價(jià)值。
以上就是使用GPT-3訓(xùn)練垃圾短信分類器示例詳解的詳細(xì)內(nèi)容,更多關(guān)于GPT-3訓(xùn)練垃圾短信分類器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
jupyter 實(shí)現(xiàn)notebook中顯示完整的行和列
這篇文章主要介紹了jupyter 實(shí)現(xiàn)notebook中顯示完整的行和列,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04謹(jǐn)慎使用Python進(jìn)行矩陣計(jì)算解析
這篇文章主要介紹了使用Python進(jìn)行矩陣計(jì)算原理解析,真正的單位矩陣,只有對(duì)角線元素為1,其他元素為0,用 np.identity(N) 生成單位矩陣,需要的朋友可以參考下2023-08-08python中numpy包使用教程之?dāng)?shù)組和相關(guān)操作詳解
這篇文章主要給大家介紹了關(guān)于python中numpy包的使用教程,包含數(shù)組和相關(guān)操作等內(nèi)容,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。2017-07-07分享Pytest fixture參數(shù)傳遞的幾種方式
這篇文章主要分享的是Pytest fixture參數(shù)傳遞的幾種方式,文章基于python的相關(guān)資料展開對(duì)主題的詳細(xì)介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-04-04python實(shí)現(xiàn)下載整個(gè)ftp目錄的方法
這篇文章主要介紹了python實(shí)現(xiàn)下載整個(gè)ftp目錄的方法,文中給出了詳細(xì)的示例代碼,相信對(duì)大家的理解和學(xué)習(xí)具有一定的參考借鑒價(jià)值,有需要的朋友可以一起來學(xué)習(xí)學(xué)習(xí)。2017-01-01