領域模型生產指南
領域模型脫胎于通用大模型,兩者有相似之處,但通用大模型在訓練時使用的是通識數據集,缺少領域知識,導致企業在應用過程中會發現一些問題。比如,如果我們要做一個滴普科技的智能問答機器人,但通用大模型并沒有學習到滴普科技的各種產品信息,缺少先驗知識。
目前這個問題有兩種解決途徑,一種是 RAG,通過外掛知識庫來彌補通用大模型缺乏領域知識或知識更新較慢的問題;另一種是構建領域大模型,即在通用大模型的基礎上使用領域數據集進行微調,使其能夠識別或記住領域知識,以更好地為企業服務。
本文將分享滴普科技在服務客戶過程中積累下來的領域大模型構建指南。
一、領域大模型與通用大模型的區別
1. 數據集不同
- 通用大模型已有許多優秀的開源數據集,注重廣度、覆蓋各行各業,但在特定行業的深度不夠,或只在某幾個行業具備一定深度。比如 Code Llama(代碼生成大模型)在 Python、Java 等代碼層面有較多的數據集的積累,但其他冷門語言的數據集較少。
- 領域大模型可以使用通用數據,但不能完全使用,因此受限于行業。目前只有少數行業存在行業數據集,比如法律行業有裁判文書等開源數據集,但較多行業比如零售沒有數據集。
2. 靈活性和準確性不同
靈活性和準確性是天平的兩端,如果追求高準確性,靈活性就會受限,相反若追求靈活性則準確性會受限。因此在模型訓練過程中需要平衡靈活性和準確性。
3. 復雜性不同
二、基于企業數據的領域數據集構建
數據集準備是領域模型中最重要的環節,最終會影響領域模型的效果。
1. 高質量數據集創建難點
在創建高質量領域數據集的過程中,存在以下三個難點:
- 高質量數據集少:較多客戶只有一個文檔庫,且這些文檔大多是完全未經處理的。
- 數據處理受限:需要先對客戶的數據進行處理,耗時、成本高。通用大模型處理數據時,優先會使用 ChatGPT 先做一些預處理,但為了保障企業數據隱私,此類數據處理方法無法使用,數據處理工具受限。
- 數據多樣性:數據多樣性的平衡會影響模型的靈活性和準確性,如果數據多樣性低,模型的靈活性受限;如果多樣性高,模型的準確性就可能會降低。
2. 高質量數據集創建方法論
(1)SFT
高質量數據集少時,優先使用 SFT 進行訓練。
我們截取了《置身事內》中的一段文字,近似于在做領域大模型時普遍拿到的數據類型,即 word 文檔數據。我們要通過 ChatGPT 或人工的方式,將數據處理成一問一答的對話數據。比如問題是“土地財政是什么,它對地方政府對貢獻有多大”,回答的結果就是書里面的原文。通過這種方式去積累 SFT 數據,通過 SFT 去做訓練,可以降低我們對高質量數據集的要求。
就實際測試情況來看,在做一個特殊領域的時候,只需要積累 1000 條這樣的問答對,就可以達到一個能夠接受的效果。
這就是我們的第一個方法論,通過 SFT 去做訓練。對于一些很大的文檔,從中提取要點,通過這種方式喂給數據集。
(2)使用大模型自身能力
面對數據處理受限問題,我們提出的方法是使用大模型本身的能力去提速數據處理過程。
例如,靠人工去寫問答對肯定是不現實的,這種情況下可以通過大模型本身的信息提取能力去實現。把原始文檔放到 LLM 里面,通過 prompt 形式提取文檔的詳細信息,使其變成結構化知識,轉換為訓練集。
在這個過程中,LLM 有幾種選擇,例如 Claude2、GPT4 和 GPT3.5。這三種模型能夠在公網上使用。我們強烈推薦 Claude2,因為它最大能支持 200K 的 token,意味著我們拿到的大部分文檔都可以整個塞進去,不需要通過 RAG 或embedding 的手段做特征提取等工作。ChatGPT4 比較貴,不太能獲取到,3.5 版本也是可以的。如果面向不能把數據放在公網上的客戶,我們建議使用 LLAMA2 13B、ChatGLM2 6B。
我們在客戶現場做項目的時候,第一件事是先把滴普大模型部署到客戶的環境中,然后基于滴普大模型幫客戶處理文檔,以解決客戶文檔處理中的人手問題。在這種情況下,人所需要做的只是根據文檔特征確定 prompt,之后就可以把文檔一篇一篇地放到大模型里面,使其源源不斷地輸出結構化知識。最后我們再通過一些手段把結構化知識變成我們的訓練集。
(3)數據多樣性的平衡方法
在結構化知識轉變為訓練集的過程中,我們需要去思考數據多樣性的平衡問題,即如何平衡靈活性和準確性。
我們認為,要達到比較平衡的效果,領域數據集大概需要占到 30%。超過這個比例越多,靈活性就越低、準確性越高;相反,則靈活性越高、準確性越低。
具體這個比例選擇多少,需要根據客戶需求及實際場景去考慮。
- 比如某個客戶需求是做一個意圖識別大模型,它不需要面向普通用戶,而是面向程序,這種情況下是不需要考慮靈活性的,那么就可以把領域數據的比例直接拉到 100%。
- 又比如客戶需要大模型對公司汽車產品的操作指南、操作手冊去進行回答,用戶遇到問題就可以詢問大模型。對于這種客戶,是需要應對客戶需求、直接面向終端用戶的,那么就需要把數據拉到 30%。
(4)總結
三、模型訓練方法的選擇
常用的訓練方法包括 Fine tune、P-tuning、Lora、Q-Lora 等,接下來介紹如何選擇微調方法。
1. 不同訓練方法的比較
訓練方法可以分為全參微調和高效微調兩類:
(1)全參微調
(2)高效微調
2. 選擇方法
這里列出了兩個數據集:
第一個數據集的目標是調整格式:
問 Java 線程是什么,用滴普大模型生成了回答,這個回答看上去是比較完整的。如果客戶有個需求是給出一些定義而非代碼,那么就需要去微調模型的輸出。需要通過這類數據得到下面關于“Java 線程是什么?”的一句話定義。
第二種數據集的目的是記住新的知識:
比如一個金融題,授信額度是什么?這個題目答案是 a。但是在沒有訓練或沒有針對性訓練的時候,大模型的回答是 c,這是沒有微調時的答案。這種情況下如果要微調,那我們的目標是要讓大模型能夠記住一些新的知識。
(1)從數據集特征入手
通過這兩類數據,即可得出第一個方法論,先從數據集的特征入手:
- 只是做一些輸出格式的調整,不需要讓大模型去記住新的知識時,選擇高效微調方法。訓練模型只是為了輸出更符合客戶需求的話術,或更符合客戶要求的數據集,而并沒有改變數據集本身的權重、記憶、知識結構時,Lora 的表現比較好。
- 需要讓模型記住新的知識時,建議通過全量參數去微調。
(2)從硬件層面選擇
進行全量微調時,13B 模型至少需要一塊 80G 的 A800。根據實際數量不同,對塊數要求也不同。比如根據滴普實測結果來看,350 萬條的對話數據集,一塊 A800 肯定是不行的,速度會非常慢。訓練一個 100 萬數量級的數據集,A800 的塊數估計是 32-64 塊,也就是至少需要兩臺服務器,才能達到可接受的速度,即不超過 72 小時。
7B 模型,4090 就可以跑,需要 24G 的顯存。
(3)從效果層面選擇
對靈活性要求不高,只注重準確性時,全量微調是比較好的選擇。需文本分類、實體關系提取、意圖識別之類的場景,對數據多樣性、靈活性要求不高時,完全可以選擇全量微調的形式,因為如果發生過擬合也可以接受。
(4)總結
結合客戶需求,建議先使用 Q- Lora 進行試驗;如果 Q- Lora 不可行,則選擇Lora;如果 Lora 也不行,就選全參微調。
四、驗證集的構建及模型評估方法
當我們辛辛苦苦用昂貴的硬件通過 72 小時甚至幾百小時的訓練之后,得到一個模型,迫切需要驗證其是否可用,有沒有記住數據集。
首先模型一定是選擇 loss 比較低、準確率比較高的,但是選擇準確性最好的模型就行了嗎?如果它發生了比較長的記憶遺忘的情況怎么辦?因此,我們需要去驗證一下模型是否合理。
1. 領域大模型驗證的難點
領域大模型的驗證是比較難的一個問題,因為它不像通用大模型存在 human even 等通用的驗證數據集,只需要用普通的腳本跑一遍就可以知道好還是不好。
2. 五維模型能力評估
對于領域大模型如何構建驗證集,到目前為止仍處在探索過程中,這里要講的方法不一定是最優的,只是我們通過一些選擇、實驗發現的效果比較好的一種方法,并且評估方法也會不停迭代。
我們建立了五維的模型基礎能力評估模型:
(1)分詞能力
中文和英文不同,英文是一個單詞接近于一個 token,但中文是通過單個字喂進去的。在這種情況下,模型本身的分詞能力就非常重要。
在沒有大模型之前,分詞本身就是一個非常難的事情,是靠人類寫一些方法去實現的,其效果局限于分詞模型的大小。但是在大模型時代,可以把單個字喂到大模型里,讓大模型自己產生分詞能力,分詞能力已經從之前靠分詞模型的能力變成了大模型本身的能力。所以我們首先就要去判斷模型的分詞能力是否及格。
(2)句法分析、語法分析、語義消歧、理解能力
分完詞后,要去判斷它的句法分析能力,然后判斷語法分析能力,以及語義消歧能力,最后判斷其理解能力。
從這個過程可以看出來,對于一個基本的文本,通過它的語料和元素,從最開始的一個字詞變成一句話、再變成語法、再到語義消歧,整個閱讀理解是從低到高的順序。
3. 舉例
(1)分詞能力
給大模型一段話,比如告訴他,請對下面這段話進行分詞并用數組格式輸出,通過這種方式判斷模型能不能正確分出來。
(2)句法分析能力
模型能不能分析出一句話的主語、謂語、賓語、主謂賓、定狀補等,分析句子之間的關系,并列、轉折等。
(3)語義分析能力
比如請分析一下下面兩句話的語義是否相似:廣東的廣州是廣東的省會,廣東省的省會是廣州。這兩句話的含義其實是一樣的,模型最后輸出的內容是能夠識別出這兩句語義是一樣的。另一示例,廣州是廣東的省會,江蘇省的省會是哪?這兩句語義是完全不一樣的,大模型也能夠識別出來,說明它是具備一定的語義分析能力的。
(4)語義消歧能力
比如給出“雷軍是小米的創始人”,詢問模型小米指的是?因為小米放到某些特定語義下指的我們吃的小米,但在這句話里面小米指的是公司。模型回答小米指的是小米科技,說明它能對語義做一些消歧。
還比如給它一段比較長的昨天發生的新聞,詢問模型里面提到的公司是哪家?模型能夠識別出一段話里面的具體代詞,這也說明模型可以做到跨上下文的關聯性。
(5)理解能力
給模型一段非常長的文本,讓模型能夠提取出這段文本里面的一個比較關鍵的特征。
4. 驗證集準備方法論
- 事先準備通識驗證數據集。
- 針對五個維度,客戶準備具體領域的數據集。
- 準備一個基準模型,可以用 Llama2、chatGLM、百川之類的開源大模型做基準。如下圖所示,將基準模型和我們模型的能力放到同一個雷達圖上,得出兩者之間面積的重合點以及兩者的差距,這是一種橫向對比的方法。
五、國產硬件評測
最后來分享一下對國產硬件的評測結果。
根據最后一列的數據,英偉達的 A800,13B 的推理速度大概是 33 個 token 每秒,7B 是 45 個 token 每秒。
以此為基準,摩爾線程 S3000 顯卡,13B 的推理速度可以達到 20;S4000 可以達 29;華為升騰 910A,13B 是 15,7B 是 23。
兼容性方面,這些顯卡的兼容性都是不錯的,但是都需要對我們現有的英偉達的模型做一些轉換。
六、問答環節
Q1:模型驗證還是要靠人工來看?能不能自動化?分數是怎么得出的?
A1:很多驗證是可以通過腳本去干的。以分詞為例,對比它的輸出結果和標準答案之間的區別。prompt 寫得好一點,告訴它應該輸出什么樣的格式,調整成代碼能夠接受的輸出,就可以自動化去做判斷。
Q2:拿比較少的數據去微調一個領域的模型,它在回答那種需要準確答案的場景下的效果是怎么樣的?比如在法律領域,用一兩千條去調完之后,問它刑罰的第二條第三款,它能夠比較準確地回答嗎?
A2:如果你問的問題已經在這 1000 條內容之間了,它只需要做一些簡單的推理,這個是沒問題的。
如果說只訓練了刑法的內容,但問他民法的內容,那肯定是回答不了的,會出現幻覺問題。
所以如果需要的領域比較大,那肯定是要對應地增加這 1000 條數據集的。
Q3:比如用一兩千條的數據來微調它,那么即使問的問題可能是在你的訓練數據集里的,但問法稍微一變,它還能夠準確的回答嗎?比如說法律里的權利跟權力。這兩個力是不一樣的,那么它在回答的時候,可能你的數據集體原始答案是利的利,它會變成力量的力,它意思就完全變了,這種情況的話會不會出現以及怎么解決?
A3:會出現,其實這個問題就是全量微調里面非常頭疼的問題,訓著訓著可能把它本身的一些能力給弱化掉了,這在全量微調的時候其實是非常容易出現的一個問題,并且還不是少數。
這種情況下我覺得第一個點就是驗證模型變得非常關鍵。比如說就像你剛剛問的,權利跟權力之間有什么區別。我們在準備數據集的時候,就把這一塊的數據做成訓練集訓練進去。完全指望模型去做知識與知識之間的連接效果沒有那么好。其次就是如果真的發現這種情況,那只能去不停地訓練,只能通過準備數據集加上驗證的方式,盡可能得去降低這一風險。但要完全避開這種問題,目前還是做不到的,可能得等整個模型界有一些新的技術出現才會解決,并不是通過工程化的方式能解決的。
Q4:您剛剛講了整個做領域模型的 pipeline,我有一個小小的問題。因為您剛剛都是單輪的,從準備數據一直到訓練、驗證,假設驗證效果不好,我們肯定要再繼續來這個過程,那在這個過程中如果我們發現,比如準確性不高,我們可能想要把數據量變大、數據質量提高或者換一種訓練方法等等。這個時候一般是怎樣去考慮的?
A4:我們更多的也是通過驗證的結果去看的。
舉個例子,如果說發現它的分詞能力比較弱,那么已經不僅僅是訓練集準備的問題了,可能是整個模型過擬合已經非常嚴重了。這種情況下基本上這個模型是需要重新訓練的。
如果只是理解能力或者語義消歧能力出現問題,可能只是數據集準備得不夠到位。這種情況下就需要去補充數據集。
我們發現大部分情況基本上是通過補充數據集或者調整數據集就能夠解決的。