模型也能“知其然知其所以然”——看SimRAG如何通過提問提升自己 精華
1. 引言部分
今天要給大家分享一篇很有意思的論文。這篇論文主要解決的是什么問題呢?就是如何讓大語言模型在專業領域,比如醫療、科學領域表現得更好。
你們有沒有想過,雖然現在的ChatGPT、Claude這些大模型很厲害,但在專業領域它們的表現還是不夠好,對吧?比如說,當我們問它一個關于"支氣管擴張"的專業問題時,它可能就答不太準確了。這是為什么呢?
主要原因是這樣的 - 這些專業領域有很多特殊的知識和術語,普通模型可能理解得不夠深入。就像我們普通人看醫學論文一樣,沒有專業背景的話,很多術語都看不懂,是不是?
那么現在有一個很好的技術叫RAG(檢索增強生成),這個技術的原理其實很像我們人類查資料的過程。比如當我們要回答一個問題時,會先去查找相關的資料,然后再基于這些資料來回答,對不對?RAG就是讓模型也這樣做 - 先檢索相關文檔,再基于這些文檔來回答問題。
但是呢,這里又出現了一個新的問題。就算用了RAG技術,在專業領域的表現還是不夠理想。這是為什么呢?因為模型可能不太懂得如何正確使用檢索到的專業文獻。就像一個醫學院新生,即使給他一堆醫學文獻,他也不一定能準確理解和應用這些知識,對吧?那現在已經有哪些解決方案呢?主要有這么幾種:
- 在專業文獻上繼續預訓練,就像讓模型多讀點專業書籍
- 用專業領域的指令來微調模型
- 用GPT-4這樣的強大模型來生成訓練數據
但這些方法都有什么問題呢?
- 第一個方法成本很高,就像要付很多學費一樣
- 第二個方法需要大量標注數據,這個在專業領域特別難獲取
- 第三個方法不但貴,而且在一些涉及隱私的領域(比如醫療)可能還有安全隱患
這就是為什么我們需要一個更好的解決方案。那作者是怎么解決的呢?他們提出了一個叫SimRAG的方法。這個方法最有趣的地方是它讓模型同時學會了兩個能力:一個是回答問題,一個是提出問題。
你們覺得為什么要讓模型同時具備這兩種能力呢?這就像我們學習一樣,不僅要會答題,還要會出題,對吧。只有真正理解了知識,才能提出好的問題。這兩個能力相輔相成,可以幫助模型更好地理解專業知識。
2. 相關工作
在講具體方法之前,我們先來了解一下相關的研究工作。這就像我們做研究之前,要先知道前人都做了什么。首先是RAG技術。它是怎么工作的呢?就像我們寫論文要先查文獻一樣,RAG也是先去找相關的資料,然后再基于這些資料來回答問題。近期有很多研究者在改進這個技術,比如說:
- 有的在研究如何找到更相關的文檔,就像圖書館員幫我們找最合適的參考資料一樣
- 有的在研究如何過濾掉無關的內容,就像我們寫論文時要去掉不相關的引用一樣
- 還有的在研究如何讓模型更好地理解和使用這些資料
第二個重要的技術叫自訓練。這個概念聽起來可能有點陌生,但其實很好理解。它就像是“教學相長”的過程 - 模型一邊學習,一邊用學到的知識來教自己。具體怎么做呢?
- 先讓模型學習一些基礎知識
- 然后讓它自己生成一些訓練數據
- 再用這些數據來提升自己
但這個過程也有個問題,就像我們自學時可能會學到一些錯誤的知識一樣,模型生成的訓練數據也可能有錯誤。所以研究者們想了很多辦法來解決這個問題:
- 有的會仔細篩選生成的數據,只用質量好的
- 有的會給不同的數據分配不同的重要性
第三個是領域特定的大語言模型。現在已經有很多專門針對特定領域的模型了,比如醫療領域的、法律領域的。他們是怎么訓練這些模型的呢?主要有兩種方式:
- 一種是讓模型不斷地讀專業文獻,就像醫學生要不斷學習專業知識一樣
- 另一種是用特定領域的問題來訓練模型,就像針對性地做習題
但這些方法都有什么問題呢?
- 成本太高了,就像請個一對一家教一樣貴
- 效率不夠高,投入了很多資源可能效果卻不理想
- 有些方法還依賴GPT-4這樣的大模型來生成訓練數據,這就更貴了
現在大家應該能明白為什么需要一個新的解決方案了吧。就是因為現有的這些方法都不夠完美。
3. SimRAG的具體方法
接下來要講的是本文最核心的部分了 - SimRAG具體是怎么工作的。這個方法很巧妙,分為兩個主要階段。
3.1 第一階段:基礎訓練
第一階段是做什么呢?就是先教會模型一些基本功。這就像我們學習任何新東西一樣,要先掌握基礎知識,對吧。具體來說,要讓模型學習三類知識:
- 首先是基本的指令理解能力。這就像我們要先學會聽懂老師的話一樣。用了哪些訓練數據呢?
OpenAssistant的數據
Dolly的數據
SODA的數據
這些數據都是幫助模型理解人類指令的。
- 然后是問答能力的訓練。用了很多問答數據集,比如:
Squad數據集,這是關于閱讀理解的
DROP數據集,這需要一些推理能力
NQ(自然問題)數據集,這些都是真實用戶的提問
這就像給學生做各種類型的習題,幫助他們提高解題能力。
- 最后是檢索相關的訓練。這個訓練分兩部分:
教模型怎么從文檔中找到可能的答案
教模型怎么根據文檔和答案來提出好問題
就像教會學生不僅要會做題,還要會出題一樣。
3.2 第二階段:自我提升
這個階段是最有意思的部分。模型要用第一階段學到的能力來提升自己,具體怎么做呢?首先是答案生成。模型會讀一段專業文獻,然后找出里面可能成為答案的內容。比如讀到這樣一段醫學文獻:
For its survival, the body needs to ensure a continuous delivery of energy despite highly variable supplies of nutrients from the external environment.
模型就會找出重要的概念,比如"continuous delivery of energy"這樣的關鍵信息。然后是問題生成。基于找到的答案,模型會生成相應的問題。而且,模型會生成不同類型的問題:
- 有的是簡單的填空題
- 有的是多選題
- 有的是判斷對錯的題
這樣做的好處是什么呢?就像我們復習時用不同類型的題目來測試自己,可以全面地掌握知識。最后還有個重要的步驟 - 質量控制。不是所有生成的問題都會被用來訓練,而是要經過篩選:
- 會檢查答案是否能在相關文檔中找到
- 會看問題是否清晰合理,就像老師出題也要經過反復推敲一樣。
4. 實驗結果分析
好,現在到了最激動人心的部分了 - 我們來看看這個方法到底效果如何。
4.1 實驗設置
首先,作者選擇了三個非常重要的領域來測試:
- 醫療領域:選了7個數據集
PubMedQA:這是關于醫學研究的問答
BioASQ:這是生物醫學領域的問題
MedQA:這個更專業,是醫學執照考試的題目
還有其他幾個數據集
就像是讓模型去參加不同類型的醫學考試一樣。
- 科學領域:用了3個數據集
ARC:這是中學級別的科學題目
SciQ:這包含了物理、化學、生物等各種科學問題
MMLU-sci:這個更全面,包含了14個科學學科
相當于是從基礎到高等的科學知識都測試了一遍。
- 計算機科學領域:
用了最新的CS-Bench數據集
包含了編程、算法等各種計算機科學的問題
這就像是給模型來了次計算機系的期末考試。那模型用什么"教材"來學習呢?
- 醫療領域:用了醫學教科書、維基百科、PubMed的文章
- 科學領域:主要用維基百科的內容
- 計算機領域:用了維基百科的CS部分和arXiv上的論文
4.2 比較對象
作者找了好幾類模型來比較,就像舉辦一場比賽一樣:
- 通用大模型選手:這些就像是全能型選手。
GPT-3.5
GPT-4
Llama3-8B
- 專業領域選手:這些就像是專攻某個領域的專家。
醫療領域有PMC-llama、MEDITRON
科學領域有SciTulu
- RAG技術選手:這些是專門做檢索增強的高手。
Self-RAG
ChatQA
4.3 實驗結果
在醫療領域:
在科學領域:
在計算機科學領域:
雖然分數看起來不是很高,但要知道CS-Bench的題目是很難的,這個成績已經很不錯了。
4.4 深入分析
作者還做了一些很有意思的分析:
- 不同問題類型的表現:
多選題表現最好,因為選項可以提供線索
開放性問題稍微差一點,這很正常,因為需要自由發揮嘛
判斷題介于兩者之間
- 生成數據的質量分析,讓我們看個例子:
生成的問題很自然,答案也很準確,不是簡單的復制粘貼。
- 一個很有趣的發現:如果不做數據過濾,性能會下降約2%。這說明什么?說明質量控制真的很重要,就像我們學習也要注意區分哪些是對的,哪些是錯的信息。
5. 局限性和未來展望
當然,這個方法也不是完美的,還有一些可以改進的地方:
- 目前只做一輪生成:
就像我們復習,多復習幾遍效果會更好
未來可以嘗試迭代式的生成方式
- 計算開銷問題:
生成和過濾數據需要不少時間
但好在這些都是訓練時的開銷,用的時候不會變慢
- 還可以用更強的模型:
比如說用70B的模型可能效果會更好
但這樣就需要更多計算資源了
這種自我提升的思路其實在很多領域都能用。比如說,我們學習新知識的時候,也可以先掌握基礎,然后自己出題來檢驗,這樣不是很像SimRAG的思路嗎?
原文:《SimRAG: Self-Improving Retrieval-Augmented Generation for Adapting Large Language Models to Specialized Domains》
本文轉載自張 ??芝士AI吃魚??,作者: 雷厲風行
