2022 年11 月ChatGPT 發布了3.5 版本,迅速成為了炙手可熱的大語言模型。短時間內,網絡上湧現出了許多基於ChatGPT 的想法和應用。
ChatGPT 展現了其毋庸置疑的強大能力,同時我們發現它在特定領域的能力依然不夠突出。因此我們在思考:能否訓練出一個專精於特定領域「ChatGPT」,使之在該領域的認知更深入、更精準。
以 Metaverse 領域為例,在MetaCat 官網中有大量Metaverse 領域研究的重要文章,因此,我們在尋找一種方法能夠將這些文章所傳達觀點、思維方式賦予類似ChatGPT 的大語言模型,使之成為一個像MetaCat 一樣具備Metaverse 領域深度見解的大語言模型,以下是探索過程。
調研:尋找訓練出專屬數據的「ChatGPT」的方式
我們開始時尋找是否已經有一個模型或者通過對現有模型的訓練可以滿足需求。通過查閱文檔和進行初步的調研,預選了三種方式:
- LlamaIndex(原GPT-Index)
- GPT 微調(Fine-tuning)
- BERT 微調
LlamaIndex
簡單了解了一下它的作用和工作原理。
LlamaIndex 是一種面向大規模文本數據集的索引技術,可為結構化和非結構化數據提供索引支持。它將龐大的文本數據集劃分為多個小塊,並通過索引表快速定位目標文檔,以加快檢索和處理速度。
在進一步調研之後,我們決定放棄採用LlamaIndex 方案。最初我們的期望是讓一個模型學習所有的文章,並且在提問時能夠對這些知識進行總結和歸納。由於文章的連貫性,這可能需要對整篇文章進行一次性的學習,而LlamaIndex 則是通過對內容進行分塊索引的方式來工作的,不符合我們的需求。它適用於基於文檔內容的對話場景。
接下來,我們將繼續探索GPT 微調和BERT 這兩種方式,以找到最適合我們目標的訓練方法。
GPT 微調
GPT 微調(Fine-tuning)是指在GPT 模型的基礎上,利用特定的數據集對其進行進一步的訓練和調整,以適應特定的任務和應用場景。微調的目標是在已經訓練好的模型上進行少量的調整,從而使模型在特定任務上表現更出色。
在微調過程中,我們使用prompt 和completion 文本對的格式作為輸入數據。例如:
{"prompt":"元宇宙和互聯網有什麼區別?","completion":" 元宇宙和互聯網不同,互聯網是一個“二維”的網絡世界,而元宇宙則是一個“三維”的虛擬世界。"}
因此,我們需要將文章的內容進行拆分和總結,生成多個文本對,然後使用這些文本對進行微調。值得注意的是,文本對中的信息質量將直接影響微調後模型的質量。
通過利用GPT 模型獲取每個部分的文本對,並對其進行總結,我們可以基於這些文本對對模型進行微調,這樣的微調過程將使模型對特定領域的理解和生成能力得到顯著提升。
BERT 微調
Google 的BERT(Bidirectional Encoder Representations from Transformers),它與GPT 都是基於Transformer 網絡架構。但與GPT 不同的是BERT 是一個雙向的預訓練模型,它通過在大規模無標籤數據上進行預訓練,學習到句子中各個位置的上下文表示。
BERT 主要用於自然語言理解任務,如文本分類、情感分析、命名實體識別等。它可以理解文本中的語義和關係,並能夠找出語句之間的聯繫
相比之下GPT 則通常用於生成式任務,如文本生成、對話生成等。
這樣看下來,通過GPT 微調可能會實現我們最初的需求,接著讓我們來實現並總結評估一下該過程中遇到的問題。
注:什麼是單向預訓練模型和雙向預訓練模型?
單向預訓練模型:單向模型只能按照給定的順序閱讀文本,類似於我們在閱讀時從左到右的方式。這意味著模型只能看到當前單詞之前的上下文信息,而無法預測後面的單詞。
雙向預訓練模型:雙向模型可以同時考慮當前單詞之前和之後的上下文信息,類似於我們在閱讀時可以回頭查看前面的內容,然後再繼續往後讀。這樣的模型可以更好地理解整個句子的語義和上下文關係。
實現過程
相關代碼:https://github.com/themetacat/ChatGPT_Fine_Tuning
注:由於「gpt-3.5-turbo」模型不支持微調,GPT-4 api 並未直接開放使用,需要申請加入候補名單,所以我們選用GPT-3 模型
- 首先獲取到文章的內容,然後對其結構,內容進行處理
- 通過「gpt-3.5-turbo」模型獲得文本對數據
- 將數據整合上傳
- 根據上傳的數據創建微調模型
- 對模型進行質量評估
我們可以通過GitHub 獲取到文章content.txt,已經對其進行簡單的結構化和內容處理。(處理原因:原始文章的段落結構可能不代表一個完整的內容段落。例如,第一段可能是提問問題,而第二段則是對問題的解答,這些應該放在同一個段落中。此外,如果文章是由某個組織撰寫的,並且內容中出現了大量的「我們」等詞語,需要將這些詞替換為該組織的名稱,以使GPT 生成更準確的問題和答案。)
content.txt: 似乎有許多新組織出現,在大型行業參與者的支持下,聯合構建元宇宙。然後是M3,一個由藝術家和開源黑客組成的草根社區,他們也想要參與構建開放元宇宙,並且在同一個章程的指導下已經運營了將近4 年。M3 代表Metaverse Makers。我們無法決定第三個M 是什麼,所以發揮你的想像力吧。它是JanusXR、AnarchyArcade、Webaverse 和Hyperfy 等創新項目背後思想的家園。自2019 年以來,我們一直致力於構建一個可互操作和去中心化的元宇宙的共同目標,我們的GitHub 證明了這一點:github.com/m3-org ......
然後通過「gpt-3.5-turbo」獲取對每段內容獲取不定量的問答對數據
獲取到文本對數據後,我們可以使用官方提供的工具將數據格式轉換為JSONL,並將其上傳,獲取文件的唯一標識符(ID)。
# 由於上傳文件的格式要是JSONL 的,使用官方CLI 工具做一下轉化,輸入以下內容# openai tools fine_tunes.prepare_data -f qa_pairs.json
# 上傳文件# https://platform.openai.com/docs/api-reference/files/uploaddef create_file(): res = openai.File.create( file=open("qa_pairs_prepared.jsonl", "rb"), purpose='fine-tune' ) print(res) return res
接著,我們可以基於上傳的數據文件創建微調模型,以便讓模型能夠更好地理解和回答特定領域的問題。
def create_fine_tune(): # file-xxx 在上傳文件後返回的結果中res = openai.FineTune.create(training_file="file-xxx") # res = openai.FineTune.retrieve(id="ft-AF1WoRqd3aJAHsqc9NY7iL8F") print(res)
最後,我們應對模型進行質量評估。(由於整體需求的性質,每個問題的答案可能是不確定的,類似於語文中的閱讀理解。因此,直接進行人工評估可能是最準確的方法。通過評估模型在特定問題集上的回答質量,我們可以進一步優化微調過程,並確保生成的答案的準確性和一致性。)
關鍵步驟與成本評估
上述操作中提到,文本對的內容質量會直接影響到微調模型的質量,而處理後的文章內容又會影響到文本對的內容質量。因此,在初期的文章內容和文本對內容處理過程中,我們需要特別注意,因為它們會直接或間接地影響到最終模型的質量。
以此為前提,在初步測試和評估後得到以下問題
- 在「實現」過程中的第一步是獲取所有的文章。這可以通過腳本來實現,但是獲取到的文章內容格式可能各不相同,因此需要進行預處理。在此過程中,需要處理的問題是:原始文章中的每個段落不一定代表一個完整的部分。有時,在第n-1 段是問題,第n 段是答案,或者第n 段是問題,第n+1 段是答案。因此,這部分預計需要進行人工處理
- ”””
- 例如:
- 我們是誰
- 我們是一群致力於具體化實用「Metaverse」的創客。
- 我們通過開發產品、內容製作、佈道和籌款來做到這一點。
- ”””
- 在分段處理完成後,類似於「我們」這樣的內容需要明確指出是指文章的作者還是其他人,這樣為了獲得更準確的文本對,這也需要進行人工處理
- 處理完內容後,我們可以使用「gpt-3.5-turbo」模型來獲取文本對的內容。由於速率限制,每分鐘只能調用3 次,並且根據token 數計費(成本為$0.002/1k tokens)。對於文章的長度約為1600 字,分為15 段,獲取到了53 條文本對,總共花費了$0.011
- 對於獲取到的文本對的內容,也需要通過人工檢查和調整,以使其更加準確。
- 在所有的這些步驟處理好了之後,因為文章是頻繁更新的,而在OpenAI 文檔中並未找到如何對微調模型進行更新
總結
在探索「訓練一個精通於特定領域的GPT 模型」解決方案的過程中,最初,我們希望將所有原始文章的內容輸入到一個模型中,以獲得專屬數據的GPT。然而,我們最終發現這種方法不可行,大多數情況下需要通過微調的方式來實現。因此,我們對微調進行了測試和評估。
經過測試和評估後總結了上述「關鍵步驟與成本評估」內容,我們也可以看到,需要對所有的文章進行分段、內容處理,並檢查獲取到的文本對的質量(需要對每篇文章有一定的理解)。此外,我們還需要評估模型的質量(評估者需要具備對文章和MetaVerse 領域的一定認知)。所有這些步驟都需要人工進行處理,而且後兩步的檢查還需要一定的專業能力。綜合而言,這會導致成本很高。如果使用一些自動化的方法,很可能會對某些步驟的結果質量產生影響,從而影響微調模型的質量。
目前暫未找到其他方法可以更好的實現我們這個想法,如果讀者有更好的期待交流。微調的實現過程所需的內容和代碼已經上傳到GitHub,供大家參考。如果您在使用過程中發現有任何不清楚或問題,歡迎隨時交流。