領(lǐng)域模型生產(chǎn)指南
領(lǐng)域模型脫胎于通用大模型,兩者有相似之處,但通用大模型在訓(xùn)練時使用的是通識數(shù)據(jù)集,缺少領(lǐng)域知識,導(dǎo)致企業(yè)在應(yīng)用過程中會發(fā)現(xiàn)一些問題。比如,如果我們要做一個滴普科技的智能問答機器人,但通用大模型并沒有學(xué)習(xí)到滴普科技的各種產(chǎn)品信息,缺少先驗知識。
目前這個問題有兩種解決途徑,一種是 RAG,通過外掛知識庫來彌補通用大模型缺乏領(lǐng)域知識或知識更新較慢的問題;另一種是構(gòu)建領(lǐng)域大模型,即在通用大模型的基礎(chǔ)上使用領(lǐng)域數(shù)據(jù)集進行微調(diào),使其能夠識別或記住領(lǐng)域知識,以更好地為企業(yè)服務(wù)。
本文將分享滴普科技在服務(wù)客戶過程中積累下來的領(lǐng)域大模型構(gòu)建指南。
一、領(lǐng)域大模型與通用大模型的區(qū)別

1. 數(shù)據(jù)集不同
- 通用大模型已有許多優(yōu)秀的開源數(shù)據(jù)集,注重廣度、覆蓋各行各業(yè),但在特定行業(yè)的深度不夠,或只在某幾個行業(yè)具備一定深度。比如 Code Llama(代碼生成大模型)在 Python、Java 等代碼層面有較多的數(shù)據(jù)集的積累,但其他冷門語言的數(shù)據(jù)集較少。
 - 領(lǐng)域大模型可以使用通用數(shù)據(jù),但不能完全使用,因此受限于行業(yè)。目前只有少數(shù)行業(yè)存在行業(yè)數(shù)據(jù)集,比如法律行業(yè)有裁判文書等開源數(shù)據(jù)集,但較多行業(yè)比如零售沒有數(shù)據(jù)集。
 
2. 靈活性和準(zhǔn)確性不同
靈活性和準(zhǔn)確性是天平的兩端,如果追求高準(zhǔn)確性,靈活性就會受限,相反若追求靈活性則準(zhǔn)確性會受限。因此在模型訓(xùn)練過程中需要平衡靈活性和準(zhǔn)確性。
3. 復(fù)雜性不同
二、基于企業(yè)數(shù)據(jù)的領(lǐng)域數(shù)據(jù)集構(gòu)建
數(shù)據(jù)集準(zhǔn)備是領(lǐng)域模型中最重要的環(huán)節(jié),最終會影響領(lǐng)域模型的效果。
1. 高質(zhì)量數(shù)據(jù)集創(chuàng)建難點

在創(chuàng)建高質(zhì)量領(lǐng)域數(shù)據(jù)集的過程中,存在以下三個難點:
- 高質(zhì)量數(shù)據(jù)集少:較多客戶只有一個文檔庫,且這些文檔大多是完全未經(jīng)處理的。
 - 數(shù)據(jù)處理受限:需要先對客戶的數(shù)據(jù)進行處理,耗時、成本高。通用大模型處理數(shù)據(jù)時,優(yōu)先會使用 ChatGPT 先做一些預(yù)處理,但為了保障企業(yè)數(shù)據(jù)隱私,此類數(shù)據(jù)處理方法無法使用,數(shù)據(jù)處理工具受限。
 - 數(shù)據(jù)多樣性:數(shù)據(jù)多樣性的平衡會影響模型的靈活性和準(zhǔn)確性,如果數(shù)據(jù)多樣性低,模型的靈活性受限;如果多樣性高,模型的準(zhǔn)確性就可能會降低。
 
2. 高質(zhì)量數(shù)據(jù)集創(chuàng)建方法論
(1)SFT

高質(zhì)量數(shù)據(jù)集少時,優(yōu)先使用 SFT 進行訓(xùn)練。
我們截取了《置身事內(nèi)》中的一段文字,近似于在做領(lǐng)域大模型時普遍拿到的數(shù)據(jù)類型,即 word 文檔數(shù)據(jù)。我們要通過 ChatGPT 或人工的方式,將數(shù)據(jù)處理成一問一答的對話數(shù)據(jù)。比如問題是“土地財政是什么,它對地方政府對貢獻(xiàn)有多大”,回答的結(jié)果就是書里面的原文。通過這種方式去積累 SFT 數(shù)據(jù),通過 SFT 去做訓(xùn)練,可以降低我們對高質(zhì)量數(shù)據(jù)集的要求。
就實際測試情況來看,在做一個特殊領(lǐng)域的時候,只需要積累 1000 條這樣的問答對,就可以達(dá)到一個能夠接受的效果。
這就是我們的第一個方法論,通過 SFT 去做訓(xùn)練。對于一些很大的文檔,從中提取要點,通過這種方式喂給數(shù)據(jù)集。
(2)使用大模型自身能力

面對數(shù)據(jù)處理受限問題,我們提出的方法是使用大模型本身的能力去提速數(shù)據(jù)處理過程。
例如,靠人工去寫問答對肯定是不現(xiàn)實的,這種情況下可以通過大模型本身的信息提取能力去實現(xiàn)。把原始文檔放到 LLM 里面,通過 prompt 形式提取文檔的詳細(xì)信息,使其變成結(jié)構(gòu)化知識,轉(zhuǎn)換為訓(xùn)練集。
在這個過程中,LLM 有幾種選擇,例如 Claude2、GPT4 和 GPT3.5。這三種模型能夠在公網(wǎng)上使用。我們強烈推薦 Claude2,因為它最大能支持 200K 的 token,意味著我們拿到的大部分文檔都可以整個塞進去,不需要通過 RAG 或embedding 的手段做特征提取等工作。ChatGPT4 比較貴,不太能獲取到,3.5 版本也是可以的。如果面向不能把數(shù)據(jù)放在公網(wǎng)上的客戶,我們建議使用 LLAMA2 13B、ChatGLM2 6B。
我們在客戶現(xiàn)場做項目的時候,第一件事是先把滴普大模型部署到客戶的環(huán)境中,然后基于滴普大模型幫客戶處理文檔,以解決客戶文檔處理中的人手問題。在這種情況下,人所需要做的只是根據(jù)文檔特征確定 prompt,之后就可以把文檔一篇一篇地放到大模型里面,使其源源不斷地輸出結(jié)構(gòu)化知識。最后我們再通過一些手段把結(jié)構(gòu)化知識變成我們的訓(xùn)練集。
(3)數(shù)據(jù)多樣性的平衡方法

在結(jié)構(gòu)化知識轉(zhuǎn)變?yōu)橛?xùn)練集的過程中,我們需要去思考數(shù)據(jù)多樣性的平衡問題,即如何平衡靈活性和準(zhǔn)確性。
我們認(rèn)為,要達(dá)到比較平衡的效果,領(lǐng)域數(shù)據(jù)集大概需要占到 30%。超過這個比例越多,靈活性就越低、準(zhǔn)確性越高;相反,則靈活性越高、準(zhǔn)確性越低。
具體這個比例選擇多少,需要根據(jù)客戶需求及實際場景去考慮。
- 比如某個客戶需求是做一個意圖識別大模型,它不需要面向普通用戶,而是面向程序,這種情況下是不需要考慮靈活性的,那么就可以把領(lǐng)域數(shù)據(jù)的比例直接拉到 100%。
 - 又比如客戶需要大模型對公司汽車產(chǎn)品的操作指南、操作手冊去進行回答,用戶遇到問題就可以詢問大模型。對于這種客戶,是需要應(yīng)對客戶需求、直接面向終端用戶的,那么就需要把數(shù)據(jù)拉到 30%。
 
(4)總結(jié)

三、模型訓(xùn)練方法的選擇

常用的訓(xùn)練方法包括 Fine tune、P-tuning、Lora、Q-Lora 等,接下來介紹如何選擇微調(diào)方法。
1. 不同訓(xùn)練方法的比較

訓(xùn)練方法可以分為全參微調(diào)和高效微調(diào)兩類:
(1)全參微調(diào)
(2)高效微調(diào)
2. 選擇方法

這里列出了兩個數(shù)據(jù)集:
第一個數(shù)據(jù)集的目標(biāo)是調(diào)整格式:
問 Java 線程是什么,用滴普大模型生成了回答,這個回答看上去是比較完整的。如果客戶有個需求是給出一些定義而非代碼,那么就需要去微調(diào)模型的輸出。需要通過這類數(shù)據(jù)得到下面關(guān)于“Java 線程是什么?”的一句話定義。
第二種數(shù)據(jù)集的目的是記住新的知識:
比如一個金融題,授信額度是什么?這個題目答案是 a。但是在沒有訓(xùn)練或沒有針對性訓(xùn)練的時候,大模型的回答是 c,這是沒有微調(diào)時的答案。這種情況下如果要微調(diào),那我們的目標(biāo)是要讓大模型能夠記住一些新的知識。
(1)從數(shù)據(jù)集特征入手

通過這兩類數(shù)據(jù),即可得出第一個方法論,先從數(shù)據(jù)集的特征入手:
- 只是做一些輸出格式的調(diào)整,不需要讓大模型去記住新的知識時,選擇高效微調(diào)方法。訓(xùn)練模型只是為了輸出更符合客戶需求的話術(shù),或更符合客戶要求的數(shù)據(jù)集,而并沒有改變數(shù)據(jù)集本身的權(quán)重、記憶、知識結(jié)構(gòu)時,Lora 的表現(xiàn)比較好。
 - 需要讓模型記住新的知識時,建議通過全量參數(shù)去微調(diào)。
 
(2)從硬件層面選擇

進行全量微調(diào)時,13B 模型至少需要一塊 80G 的 A800。根據(jù)實際數(shù)量不同,對塊數(shù)要求也不同。比如根據(jù)滴普實測結(jié)果來看,350 萬條的對話數(shù)據(jù)集,一塊 A800 肯定是不行的,速度會非常慢。訓(xùn)練一個 100 萬數(shù)量級的數(shù)據(jù)集,A800 的塊數(shù)估計是 32-64 塊,也就是至少需要兩臺服務(wù)器,才能達(dá)到可接受的速度,即不超過 72 小時。
7B 模型,4090 就可以跑,需要 24G 的顯存。
(3)從效果層面選擇

對靈活性要求不高,只注重準(zhǔn)確性時,全量微調(diào)是比較好的選擇。需文本分類、實體關(guān)系提取、意圖識別之類的場景,對數(shù)據(jù)多樣性、靈活性要求不高時,完全可以選擇全量微調(diào)的形式,因為如果發(fā)生過擬合也可以接受。
(4)總結(jié)

結(jié)合客戶需求,建議先使用 Q- Lora 進行試驗;如果 Q- Lora 不可行,則選擇Lora;如果 Lora 也不行,就選全參微調(diào)。
四、驗證集的構(gòu)建及模型評估方法
當(dāng)我們辛辛苦苦用昂貴的硬件通過 72 小時甚至幾百小時的訓(xùn)練之后,得到一個模型,迫切需要驗證其是否可用,有沒有記住數(shù)據(jù)集。
首先模型一定是選擇 loss 比較低、準(zhǔn)確率比較高的,但是選擇準(zhǔn)確性最好的模型就行了嗎?如果它發(fā)生了比較長的記憶遺忘的情況怎么辦?因此,我們需要去驗證一下模型是否合理。
1. 領(lǐng)域大模型驗證的難點

領(lǐng)域大模型的驗證是比較難的一個問題,因為它不像通用大模型存在 human even 等通用的驗證數(shù)據(jù)集,只需要用普通的腳本跑一遍就可以知道好還是不好。
2. 五維模型能力評估
對于領(lǐng)域大模型如何構(gòu)建驗證集,到目前為止仍處在探索過程中,這里要講的方法不一定是最優(yōu)的,只是我們通過一些選擇、實驗發(fā)現(xiàn)的效果比較好的一種方法,并且評估方法也會不停迭代。

我們建立了五維的模型基礎(chǔ)能力評估模型:
(1)分詞能力
中文和英文不同,英文是一個單詞接近于一個 token,但中文是通過單個字喂進去的。在這種情況下,模型本身的分詞能力就非常重要。
在沒有大模型之前,分詞本身就是一個非常難的事情,是靠人類寫一些方法去實現(xiàn)的,其效果局限于分詞模型的大小。但是在大模型時代,可以把單個字喂到大模型里,讓大模型自己產(chǎn)生分詞能力,分詞能力已經(jīng)從之前靠分詞模型的能力變成了大模型本身的能力。所以我們首先就要去判斷模型的分詞能力是否及格。
(2)句法分析、語法分析、語義消歧、理解能力
分完詞后,要去判斷它的句法分析能力,然后判斷語法分析能力,以及語義消歧能力,最后判斷其理解能力。
從這個過程可以看出來,對于一個基本的文本,通過它的語料和元素,從最開始的一個字詞變成一句話、再變成語法、再到語義消歧,整個閱讀理解是從低到高的順序。
3. 舉例
(1)分詞能力

給大模型一段話,比如告訴他,請對下面這段話進行分詞并用數(shù)組格式輸出,通過這種方式判斷模型能不能正確分出來。
(2)句法分析能力

模型能不能分析出一句話的主語、謂語、賓語、主謂賓、定狀補等,分析句子之間的關(guān)系,并列、轉(zhuǎn)折等。
(3)語義分析能力

比如請分析一下下面兩句話的語義是否相似:廣東的廣州是廣東的省會,廣東省的省會是廣州。這兩句話的含義其實是一樣的,模型最后輸出的內(nèi)容是能夠識別出這兩句語義是一樣的。另一示例,廣州是廣東的省會,江蘇省的省會是哪?這兩句語義是完全不一樣的,大模型也能夠識別出來,說明它是具備一定的語義分析能力的。
(4)語義消歧能力

比如給出“雷軍是小米的創(chuàng)始人”,詢問模型小米指的是?因為小米放到某些特定語義下指的我們吃的小米,但在這句話里面小米指的是公司。模型回答小米指的是小米科技,說明它能對語義做一些消歧。
還比如給它一段比較長的昨天發(fā)生的新聞,詢問模型里面提到的公司是哪家?模型能夠識別出一段話里面的具體代詞,這也說明模型可以做到跨上下文的關(guān)聯(lián)性。
(5)理解能力

給模型一段非常長的文本,讓模型能夠提取出這段文本里面的一個比較關(guān)鍵的特征。
4. 驗證集準(zhǔn)備方法論

- 事先準(zhǔn)備通識驗證數(shù)據(jù)集。
 - 針對五個維度,客戶準(zhǔn)備具體領(lǐng)域的數(shù)據(jù)集。
 - 準(zhǔn)備一個基準(zhǔn)模型,可以用 Llama2、chatGLM、百川之類的開源大模型做基準(zhǔn)。如下圖所示,將基準(zhǔn)模型和我們模型的能力放到同一個雷達(dá)圖上,得出兩者之間面積的重合點以及兩者的差距,這是一種橫向?qū)Ρ鹊姆椒ā?/span>
 

五、國產(chǎn)硬件評測

最后來分享一下對國產(chǎn)硬件的評測結(jié)果。
根據(jù)最后一列的數(shù)據(jù),英偉達(dá)的 A800,13B 的推理速度大概是 33 個 token 每秒,7B 是 45 個 token 每秒。
以此為基準(zhǔn),摩爾線程 S3000 顯卡,13B 的推理速度可以達(dá)到 20;S4000 可以達(dá) 29;華為升騰 910A,13B 是 15,7B 是 23。
兼容性方面,這些顯卡的兼容性都是不錯的,但是都需要對我們現(xiàn)有的英偉達(dá)的模型做一些轉(zhuǎn)換。
六、問答環(huán)節(jié)
Q1:模型驗證還是要靠人工來看?能不能自動化?分?jǐn)?shù)是怎么得出的?
A1:很多驗證是可以通過腳本去干的。以分詞為例,對比它的輸出結(jié)果和標(biāo)準(zhǔn)答案之間的區(qū)別。prompt 寫得好一點,告訴它應(yīng)該輸出什么樣的格式,調(diào)整成代碼能夠接受的輸出,就可以自動化去做判斷。
Q2:拿比較少的數(shù)據(jù)去微調(diào)一個領(lǐng)域的模型,它在回答那種需要準(zhǔn)確答案的場景下的效果是怎么樣的?比如在法律領(lǐng)域,用一兩千條去調(diào)完之后,問它刑罰的第二條第三款,它能夠比較準(zhǔn)確地回答嗎?
A2:如果你問的問題已經(jīng)在這 1000 條內(nèi)容之間了,它只需要做一些簡單的推理,這個是沒問題的。
如果說只訓(xùn)練了刑法的內(nèi)容,但問他民法的內(nèi)容,那肯定是回答不了的,會出現(xiàn)幻覺問題。
所以如果需要的領(lǐng)域比較大,那肯定是要對應(yīng)地增加這 1000 條數(shù)據(jù)集的。
Q3:比如用一兩千條的數(shù)據(jù)來微調(diào)它,那么即使問的問題可能是在你的訓(xùn)練數(shù)據(jù)集里的,但問法稍微一變,它還能夠準(zhǔn)確的回答嗎?比如說法律里的權(quán)利跟權(quán)力。這兩個力是不一樣的,那么它在回答的時候,可能你的數(shù)據(jù)集體原始答案是利的利,它會變成力量的力,它意思就完全變了,這種情況的話會不會出現(xiàn)以及怎么解決?
A3:會出現(xiàn),其實這個問題就是全量微調(diào)里面非常頭疼的問題,訓(xùn)著訓(xùn)著可能把它本身的一些能力給弱化掉了,這在全量微調(diào)的時候其實是非常容易出現(xiàn)的一個問題,并且還不是少數(shù)。
這種情況下我覺得第一個點就是驗證模型變得非常關(guān)鍵。比如說就像你剛剛問的,權(quán)利跟權(quán)力之間有什么區(qū)別。我們在準(zhǔn)備數(shù)據(jù)集的時候,就把這一塊的數(shù)據(jù)做成訓(xùn)練集訓(xùn)練進去。完全指望模型去做知識與知識之間的連接效果沒有那么好。其次就是如果真的發(fā)現(xiàn)這種情況,那只能去不停地訓(xùn)練,只能通過準(zhǔn)備數(shù)據(jù)集加上驗證的方式,盡可能得去降低這一風(fēng)險。但要完全避開這種問題,目前還是做不到的,可能得等整個模型界有一些新的技術(shù)出現(xiàn)才會解決,并不是通過工程化的方式能解決的。
Q4:您剛剛講了整個做領(lǐng)域模型的 pipeline,我有一個小小的問題。因為您剛剛都是單輪的,從準(zhǔn)備數(shù)據(jù)一直到訓(xùn)練、驗證,假設(shè)驗證效果不好,我們肯定要再繼續(xù)來這個過程,那在這個過程中如果我們發(fā)現(xiàn),比如準(zhǔn)確性不高,我們可能想要把數(shù)據(jù)量變大、數(shù)據(jù)質(zhì)量提高或者換一種訓(xùn)練方法等等。這個時候一般是怎樣去考慮的?
A4:我們更多的也是通過驗證的結(jié)果去看的。
舉個例子,如果說發(fā)現(xiàn)它的分詞能力比較弱,那么已經(jīng)不僅僅是訓(xùn)練集準(zhǔn)備的問題了,可能是整個模型過擬合已經(jīng)非常嚴(yán)重了。這種情況下基本上這個模型是需要重新訓(xùn)練的。
如果只是理解能力或者語義消歧能力出現(xiàn)問題,可能只是數(shù)據(jù)集準(zhǔn)備得不夠到位。這種情況下就需要去補充數(shù)據(jù)集。
我們發(fā)現(xiàn)大部分情況基本上是通過補充數(shù)據(jù)集或者調(diào)整數(shù)據(jù)集就能夠解決的。















 
 
 
















 
 
 
 