作者 | 崔皓?
審校 | 重樓?
摘要?
一次革命性的技術(shù)升級,ChatGPT 4.0的發(fā)布震動(dòng)了整個(gè)AI行業(yè)。現(xiàn)在,不僅可以讓計(jì)算機(jī)識別并回答日常的自然語言問題,ChatGPT還可以通過對行業(yè)數(shù)據(jù)建模,提供更準(zhǔn)確的解決方案。本文將帶您深入了解ChatGPT的架構(gòu)原理及其發(fā)展前景,同時(shí)介紹如何使用ChatGPT的API訓(xùn)練行業(yè)數(shù)據(jù)。讓我們一起探索這個(gè)嶄新且極具前途的領(lǐng)域,開創(chuàng)一個(gè)新的AI時(shí)代。?
ChatGPT 4.0的發(fā)布?
ChatGPT 4.0 已經(jīng)正式發(fā)布了!這一版本的 ChatGPT 引入了跨越式革新,與之前的 ChatGPT 3.5 相比,它在模型的性能和速度方面都有了巨大的提升。在ChatGPT 4.0發(fā)布之前,許多人已經(jīng)關(guān)注過ChatGPT,并意識到它在自然語言處理領(lǐng)域的重要性。然而,在3.5以及之前的版本,ChatGPT的局限性仍然存在,因?yàn)樗挠?xùn)練數(shù)據(jù)主要集中在通用領(lǐng)域的語言模型中,難以生成與特定行業(yè)相關(guān)的內(nèi)容。但是,隨著ChatGPT 4.0的發(fā)布,越來越多的人已經(jīng)開始使用它來訓(xùn)練他們自己的行業(yè)數(shù)據(jù),并被廣泛應(yīng)用于各個(gè)行業(yè)。這使得越來越多的人從關(guān)注到使用 ChatGPT。接下來,我將為您介紹一下 ChatGPT 的架構(gòu)原理、發(fā)展前景以及在訓(xùn)練行業(yè)數(shù)據(jù)方面的應(yīng)用。?
ChatGPT 的能力?
ChatGPT的架構(gòu)基于深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò),是一種自然語言處理技術(shù),其原理是使用預(yù)先訓(xùn)練的大型語言模型來生成文本,使得機(jī)器可以理解和生成自然語言。ChatGPT的模型原理基于Transformer網(wǎng)絡(luò),使用無監(jiān)督的語言建模技術(shù)進(jìn)行訓(xùn)練,預(yù)測下一個(gè)單詞的概率分布,以生成連續(xù)的文本。使用參數(shù)包括網(wǎng)絡(luò)的層數(shù)、每層的神經(jīng)元數(shù)量、Dropout概率、Batch Size等。學(xué)習(xí)的范圍涉及了通用的語言模型,以及特定領(lǐng)域的語言模型。通用領(lǐng)域的模型可以用于生成各種文本,而特定領(lǐng)域的模型則可以根據(jù)具體的任務(wù)進(jìn)行微調(diào)和優(yōu)化。?
OpenAI利用了海量的文本數(shù)據(jù)作為GPT-3的訓(xùn)練數(shù)據(jù)。具體來說,他們使用了超過45TB的英文文本數(shù)據(jù)和一些其他語言的數(shù)據(jù),其中包括了網(wǎng)頁文本、電子書、百科全書、維基百科、論壇、博客等等。他們還使用了一些非常大的數(shù)據(jù)集,例如Common Crawl、WebText、BooksCorpus等等。這些數(shù)據(jù)集包含了數(shù)萬億個(gè)單詞和數(shù)十億個(gè)不同的句子,為模型的訓(xùn)練提供了非常豐富的信息。?
既然要學(xué)習(xí)這么多的內(nèi)容,使用的算力也是相當(dāng)可觀的。ChatGPT花費(fèi)的算力較高,需要大量的GPU資源進(jìn)行訓(xùn)練。據(jù)OpenAI在2020年的一份技術(shù)報(bào)告中介紹,GPT-3在訓(xùn)練時(shí)耗費(fèi)了大約175億個(gè)參數(shù)和28500個(gè)TPU v3處理器。?
ChatGPT在專業(yè)領(lǐng)域的應(yīng)用??
從上面的介紹,我們知道了ChatGPT具有強(qiáng)大的能力,同時(shí)也需要一個(gè)龐大的計(jì)算和資源消耗,訓(xùn)練這個(gè)大型語言模型需要花費(fèi)高昂成本。但花費(fèi)了這樣高昂的成本生產(chǎn)出來的AIGC工具卻存在其局限性,對于某些專業(yè)領(lǐng)域的知識它并沒有涉足。例如,當(dāng)涉及到醫(yī)療或法律等專業(yè)領(lǐng)域時(shí),ChatGPT就無法生成準(zhǔn)確的答案。這是因?yàn)镃hatGPT的學(xué)習(xí)數(shù)據(jù)來源于互聯(lián)網(wǎng)上的通用語料庫,這些數(shù)據(jù)并不包括某些特定領(lǐng)域的專業(yè)術(shù)語和知識。因此,要想讓ChatGPT在某些專業(yè)領(lǐng)域具有較好的表現(xiàn),需要使用該領(lǐng)域的專業(yè)語料庫進(jìn)行訓(xùn)練,也就是說將專業(yè)領(lǐng)域?qū)<业?/span>知識“教給”ChatGPT進(jìn)行學(xué)習(xí)。?
但是,ChatGPT并沒有讓我們失望。如果將ChatGPT應(yīng)用到某個(gè)行業(yè)中,需要先將該行業(yè)的專業(yè)數(shù)據(jù)提取出來,并進(jìn)行預(yù)處理。具體來說,需要對數(shù)據(jù)進(jìn)行清洗、去重、切分、標(biāo)注等一系列處理。之后,將處理后的數(shù)據(jù)進(jìn)行格式化,將其轉(zhuǎn)換為符合ChatGPT模型輸入要求的數(shù)據(jù)格式。然后,可以利用ChatGPT的API接口,將處理后的數(shù)據(jù)輸入到模型中進(jìn)行訓(xùn)練。訓(xùn)練的時(shí)間和花費(fèi)取決于數(shù)據(jù)量和算力大小。訓(xùn)練完成后,可以將模型應(yīng)用到實(shí)際場景中,用于回答用戶的問題。?
使用ChatGPT訓(xùn)練專業(yè)領(lǐng)域知識!?
其實(shí)建立專業(yè)領(lǐng)域的知識庫并不難,具體操作就是將行業(yè)數(shù)據(jù)轉(zhuǎn)換為問答格式,然后將問答的格式通過自然語言處理(NLP)技術(shù)進(jìn)行建模,從而回答問題。使用OpenAI的GPT-3 API(以GPT3 為例)可以創(chuàng)建一個(gè)問答模型,只需提供一些示例,它就可以根據(jù)您提供的問題生成答案。?
使用GPT-3 API創(chuàng)建問答模型的大致步驟如下:?
- 采集數(shù)據(jù):這里可以通過網(wǎng)絡(luò)爬取行業(yè)相關(guān)的信息,針對論壇、問答等,也可以從行業(yè)的文檔中得到線索,例如產(chǎn)品手冊,維護(hù)手冊之類的內(nèi)容產(chǎn)品。具體的采集數(shù)據(jù)方式這里不展開。后面的例子中統(tǒng)一都會(huì)當(dāng)作文本來處理,也就是將所謂的行業(yè)數(shù)據(jù)都處理成一個(gè)字符串給到我們的程序。?
- 轉(zhuǎn)化成問答格式:由于GPT是一個(gè)問答的智能工具,所以需要將你的知識變成問答的格式輸入給GPT,從文本到問答的轉(zhuǎn)化我們使用了工具,后面會(huì)介紹。?
- 通過GPT進(jìn)行訓(xùn)練:這個(gè)步驟是將輸入通過GPT的Fine-Tunning進(jìn)行建模,也就是生成針對這些知識的模型。?
- 應(yīng)用模型:在建模完成之后就可以對其進(jìn)行應(yīng)用了,也就是針對模型內(nèi)容進(jìn)行提問。?
整個(gè)過程需要調(diào)用OpenAI,它提供不同類型的API訂閱計(jì)劃,其中包括Developer、Production和Custom等計(jì)劃。每個(gè)計(jì)劃都提供不同的功能和API訪問權(quán)限,并且有不同的價(jià)格。因?yàn)?/span>并不是本文的重點(diǎn),在這里不展開說明。?
創(chuàng)建數(shù)據(jù)集?
從上面的操作步驟來看,第2步轉(zhuǎn)化為問答格式對我們來說是一個(gè)挑戰(zhàn)。?
假設(shè)有關(guān)于人工智能的歷史的領(lǐng)域知識需要教給GPT,并將這些知識轉(zhuǎn)化為回答相關(guān)問題的模型。那就要轉(zhuǎn)化成如下的形式:?
|
當(dāng)然整理成這樣問答的形式還不夠,需要形成GPT能夠理解的格式,如下所示:?
|
實(shí)際上就是在問題后面加上了“\n\n”,而在回答后面加上了“\n”。?
快速生成問答格式的模型?
解決了問答格式問題,新的問題又來了,我們?nèi)绾螌⑿袠I(yè)的知識都整理成問答的模式呢?多數(shù)情況,我們從網(wǎng)上爬取大量的領(lǐng)域知識,或者找一大堆的領(lǐng)域文檔,不管是哪種情況,輸入文檔對于我們來說是最方便的。但是將大量的文本處理成問答的形式,使用正則表達(dá)式或者人工的方式顯然是不現(xiàn)實(shí)的。?
因此就需要引入一種叫做自動(dòng)摘要(Automatic Summarization)的技術(shù),它可以從一篇文章中提取出關(guān)鍵信息,并生成一個(gè)簡短的摘要。?
自動(dòng)摘要有兩種類型:抽取式自動(dòng)摘要和生成式自動(dòng)摘要。抽取式自動(dòng)摘要從原始文本中抽取出最具代表性的句子來生成摘要,而生成式自動(dòng)摘要?jiǎng)t是通過模型學(xué)習(xí)從原始文本中提取重要信息,并根據(jù)此信息生成摘要。實(shí)際上,自動(dòng)摘要就是將輸入的文本生成問答模式。?
問題搞清楚了接下來就是上工具了,我們使用NLTK來搞事情,NLTK是Natural Language Toolkit的縮寫,是一個(gè)Python庫,主要用于自然語言處理領(lǐng)域。它包括了各種處理自然語言的工具和庫,如文本預(yù)處理、詞性標(biāo)注、命名實(shí)體識別、語法分析、情感分析等。?
我們只需要將文本交給NLTK,它會(huì)對文本進(jìn)行數(shù)據(jù)預(yù)處理操作,包括去除停用詞、分詞、詞性標(biāo)注等。在預(yù)處理之后,可以使用NLTK中的文本摘要生成模塊來生成摘要。可以選擇不同的算法,例如基于詞頻、基于TF-IDF等。在生成摘要的同時(shí),可以結(jié)合問題模板來生成問答式的摘要,使得生成的摘要更加易讀易懂。同時(shí)還可以對摘要進(jìn)行微調(diào),例如句子連貫性不強(qiáng)、答案不準(zhǔn)確等,都可以進(jìn)行調(diào)整。?
來看下面的代碼:?
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM, pipeline? import nltk? # 輸入文本? text = """Natural Language Toolkit(自然語言處理工具包,縮寫 NLTK)是一套Python庫,用于解決人類語言數(shù)據(jù)的處理問題,例如:? 分詞? 詞性標(biāo)注? 句法分析? 情感分析? 語義分析? 語音識別? 文本生成等等? """? # 生成摘要? sentences = nltk.sent_tokenize(text)? summary = " ".join(sentences[:2]) # 取前兩個(gè)句子作為摘要? print("摘要:", summary)? # 用生成的摘要進(jìn)行Fine-tuning,得到模型? tokenizer = AutoTokenizer.from_pretrained("t5-base")? model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")? text = "summarize: " + summary # 構(gòu)造輸入格式? inputs = tokenizer(text, return_tensors="pt", padding=True)? # 訓(xùn)練模型? model_name = "first-model"? model.save_pretrained(model_name)? # 測試模型? qa = pipeline("question-answering", model=model_name, tokenizer=model_name)? context = "What is NLTK used for?" # 待回答問題? answer = qa(questinotallow=context, cnotallow=text["input_ids"])? print("問題:", context)? print("回答:", answer["answer"])? |
輸出結(jié)果如下:?
摘要: Natural Language Toolkit(自然語言處理工具包,縮寫 NLTK)是一套Python庫,用于解決人類語言數(shù)據(jù)的處理問題,例如: - 分詞 - 詞性標(biāo)注? 問題: NLTK用來做什么的?? 答案:自然語言處理工具包? |
上面的代碼通過nltk.sent_tokenize方法對輸入的文本進(jìn)行摘要的抽取,也就是進(jìn)行問答格式化。然后,調(diào)用Fine-tuning的AutoModelForSeq2SeqLM.from_pretrained方法對其進(jìn)行建模,再將名為“first-model”的模型進(jìn)行保存。最后調(diào)用訓(xùn)練好的模型測試結(jié)果。?
上面不僅通過NLTK生成了問答的摘要,還需要使用Fine-tuning的功能。Fine-tuning是在預(yù)訓(xùn)練模型基礎(chǔ)上,通過少量的有標(biāo)簽的數(shù)據(jù)對模型進(jìn)行微調(diào),以適應(yīng)特定的任務(wù)。實(shí)際上就是用原來的模型裝你的數(shù)據(jù)形成你的模型,當(dāng)然你也可以調(diào)整模型的內(nèi)部結(jié)果,例如隱藏層的設(shè)置和參數(shù)等等。這里我們只是使用了它最簡單的功能,可以通過下圖了解更多Fine-tuning的信息。?
需要說明的是:AutoModelForSeq2SeqLM 類,從預(yù)訓(xùn)練模型 "t5-base" 中加載 Tokenizer 和模型。?
AutoTokenizer 是 Hugging Face Transformers 庫中的一個(gè)類,可以根據(jù)預(yù)訓(xùn)練模型自動(dòng)選擇并加載合適的 Tokenizer。Tokenizer 的作用是將輸入的文本編碼為模型可以理解的格式,以便后續(xù)的模型輸入。?
AutoModelForSeq2SeqLM 也是 Hugging Face Transformers 庫中的一個(gè)類,可以根據(jù)預(yù)訓(xùn)練模型自動(dòng)選擇并加載適當(dāng)?shù)男蛄械叫蛄心P?。在這里,使用的是基于T5架構(gòu)的序列到序列模型,用于生成摘要或翻譯等任務(wù)。在加載預(yù)訓(xùn)練模型之后,可以使用此模型進(jìn)行 Fine-tuning 或生成任務(wù)相關(guān)的輸出。?
Fine-tunning 和Hugging Face 到底什么關(guān)系??
上面我們對建模代碼進(jìn)行了解釋,涉及到了Fine-tunning和Hugging Face的部分,可能聽起來比較懵。這里用一個(gè)例子幫助大家理解。?
假設(shè)你要做菜,雖然你已經(jīng)有食材(行業(yè)知識)了,但是不知道如何做。于是你向廚師朋友請教,你告訴他你有什么食材(行業(yè)知識)以及要做什么菜(解決的問題),你的朋友基于他的經(jīng)驗(yàn)和知識(通用模型)給你提供一些建議,這個(gè)過程就是Fine-tuning(把行業(yè)知識放到通用模型中進(jìn)行訓(xùn)練)。你朋友的經(jīng)驗(yàn)和知識就是預(yù)先訓(xùn)練的模型,你需要輸入行業(yè)知識和要解決的問題,并使用預(yù)先訓(xùn)練的模型,當(dāng)然可以對這個(gè)模型進(jìn)行微調(diào),比如:佐料的含量,炒菜的火候,目的就是為了解決你行業(yè)的問題。?
而 Hugging Face就是菜譜的倉庫(代碼中"t5-base"就是一個(gè)菜譜),它包含了很多定義好的菜譜(模型),比如:魚香肉絲、宮保雞丁、水煮肉片的做法。這些現(xiàn)成的菜譜,可以配合我們提供食材和需要做的菜創(chuàng)建出我們的菜譜。我們只需要對這些菜譜進(jìn)行調(diào)整,然后進(jìn)行訓(xùn)練,就形成了我們自己的菜譜。以后,我們就可以用自己的菜譜進(jìn)行做菜了(解決行業(yè)問題)。?
如何選擇適合自己的模型??
可以在 Hugging Face 的模型庫中搜索你需要的模型。如下圖所示,在 Hugging Face 的官網(wǎng)上,點(diǎn)擊"Models",可以看到模型的分類,同時(shí)也可以使用搜索框搜索模型名稱。?
如下圖所示,每個(gè)模型頁面都會(huì)提供模型的描述、用法示例、預(yù)訓(xùn)練權(quán)重下載鏈接等相關(guān)信息。?
總結(jié)?
這里將整個(gè)行業(yè)知識從采集、轉(zhuǎn)化、訓(xùn)練和使用的過程再和大家一起捋一遍。如下圖所示:?
- 采集數(shù)據(jù):通過網(wǎng)絡(luò)爬蟲和知識文檔的方式抽取行業(yè)知識,生成文本就可以了,比如String的字符串。?
- 轉(zhuǎn)換成問答格式:NLTK的摘要功能生成問和答的摘要,然后輸入到GPT進(jìn)行訓(xùn)練。?
- 通過GPT進(jìn)行訓(xùn)練:利用Hugging Face 現(xiàn)成的模型以及NLTK輸入的問答摘要進(jìn)行模型訓(xùn)練。?
- 應(yīng)用模型:將訓(xùn)練好的模型保存以后,就可以提出你的問題獲得行業(yè)專業(yè)的答案了。?
作者介紹?
崔皓,51CTO社區(qū)編輯,資深架構(gòu)師,擁有18年的軟件開發(fā)和架構(gòu)經(jīng)驗(yàn),10年分布式架構(gòu)經(jīng)驗(yàn)。?