外掛知識庫
1.什么是rag?
RAG,即LLM在回答問題或生成文本時,會先從大量文檔中檢索出相關的信息,然后基于這些信息生成回答或文本,從而提高預測質量。
2.外掛知識庫的實現思路
只用幾十萬量級的數據對大模型進行微調并不能很好的將額外知識注入大模型。如果想讓大模型根據文檔來回答問題,必須要精簡在輸入中文檔內容的長度。
如果模型對無限長的輸入都有很好的理解能力,那么我可以設計這樣一個輸入“以下是世界上所有樂隊的介紹:[插入100w字的樂隊簡介文檔],請根據上文給我介紹一下萬青這支樂隊”,讓模型來回答我的問題。
一種做法是,我們可以把文檔切成若干段,只將少量的和問題有關的文檔片段拿出來,放到大模型的輸入里。至此,”大模型外掛數據庫“的問題轉換成了“文本檢索的問題”了,目標是根據問題找出文檔中和問題最相關的片段,這已經和大模型本身完全無關了。
文本檢索里邊比較常用的是利用向量進行檢索,我們可以把文檔片段全部向量化(通過語言模型,如bert等),然后存到向量數據庫(如Annoy、 FAISS、hnswlib等)里邊,來了一個問題之后,也對問題語句進行向量話,以余弦相似度或點積等指標,計算在向量數據庫中和問題向量最相似的top k個文檔片段,作為上文輸入到大模型中。向量數據庫都支持近似搜索功能,在犧牲向量檢索準確度的情況下,提高檢索速度。
3.對稱語義檢索與非對稱語義檢索
問題1:How to learn Python online?
答案1:How to learn Python on the web?
適用于非對稱語義檢索的例子:
問題2:What is Python?
答案2:*Python is an interpreted, high-level and general-purpose programming language. Python’s design philosophy …”
對稱語義檢索的“問題”和“答案”要求有差不多的意思,或者根本就不屬于我們常規意義里的問答,而僅僅是同義句匹配。而非對稱語義檢索所做的任務才是我們常規意義下問答任務。很顯然,通過向量檢索的方式進行非對稱語義檢索的難度要大的多。對稱語義檢索的目標是找相似的句子,與向量檢索基于計算向量相似度的原理天然匹配,只需要模型有比較強的內容抽象能力就可以。但是非對稱語義檢索則要求模型能夠將問題和答案映射到同一空間
通過上述例子,可以看出向量檢索只能檢索出意思差不多的內容,下游用一個可以真正能很好理解語義的大模型進行進一步的提取檢索出來的句子中的信息是十分有必要的。
模型是否支持非對稱語義檢索的根本原因是什么呢?是訓練的數據不同
正是因為訓練數據有真正的問答屬性,模型才有真正的問答檢索能力(將問題與答案映射到同一向量空間)。我的理解是,如果訓練數據里沒有某一領域的數據,比如金融領域,那么通用的非對稱語義模型就不能很好的完成該領域的檢索任務。但是對稱語義檢索有“泛化”到其他領域的能力,畢竟只需要理解“字面意思”。
就直接把問題+答案拼在一起,做個二分類嘛。模型同時有了問題+答案這樣一對的上下文信息,當然比直接分別將問題+答案映射到相同的向量空間、再計算相似度準的多了。但是這種計算向量相似度的模式會慢。假設有m個問題和n個答案,向量檢索(圖中的bi-encoder環節)只需要跑m+n次bert模型就夠了,但是cross-encoder需要將所有問題和答案分別組合起來,跑m*n次bert模型。
4.如何協調查詢和文檔的語義空間?(上述問題的一個解決思路)
1.查詢重寫。
由于用戶的查詢可能表達不清晰或缺少必要的語義信息。因而可以使用大模型的能力生成一個指導性的偽文檔,然后將原始查詢與這個偽文檔結合,形成一個新的查詢。
也可以通過文本標識符來建立查詢向量,利用這些標識符生成一個相關但可能并不存在的“假想”文檔,它的目的是捕捉到相關的模式。
此外,多查詢檢索方法讓大語言模型能夠同時產生多個搜索查詢。這些查詢可以同時運行,它們的結果一起被處理,特別適用于那些需要多個小問題共同解決的復雜問題。
2.嵌入變換
在2023年提出的LLamaIndex中,研究者們通過在查詢編碼器后加入一個特殊的適配器,并對其進行微調,從而優化查詢的嵌入表示,從而使之更適合特定的任務。
Li 團隊在 2023 年提出的 SANTA 方法,就是為了讓檢索系統能夠理解并處理結構化的信息。他們提出了兩種預訓練方法:一是利用結構化與非結構化數據之間的自然對應關系進行對比學習;二是采用了一種圍繞實體設計的掩碼策略,讓語言模型來預測和填補這些被掩蓋的實體信息。
5.基本步驟概括
1.將文檔內容加載進來
2.由于文檔很長,可能會超出模型所允許的token,因而對文檔進行切割。
3.對文檔進行向量化,變成計算機可以理解的形式。
4.對數據進行檢索
在對數據進行檢索時,可以首先進行一下元數據過濾,當索引分成許多的chunks時,檢索效率會成為問題,通過元數據進行過濾,可以大大提升效率和相關度。
圖關系檢索:引入知識圖譜,將實體變成node,把它們之間的關系變成relation,就可以利用知識之間的關系做更準確的回答。
檢索技術
向量化(embedding)相似度檢索:相似度計算方式包括歐氏距離、曼哈頓距離、余弦等;
關鍵詞檢索:這是很傳統的檢索方式,元數據過濾也是一種,還有一種就是先把chunk做摘要,再通過關鍵詞檢索找到可能相關的chunk,增加檢索效率;
全文檢索:
SQL檢索:更加傳統的檢索算法。
重排序(Rerank):相關度、匹配度等因素做一些重新調整,得到更符合業務場景的排序。
查詢輪換:這是查詢檢索的一種方式,一般會有幾種方式:
子查詢:可以在不同的場景中使用各種查詢策略,比如可以使用LlamaIndex等框架提供的查詢器,采用樹查詢(從葉子結點,一步步查詢,合并),采用向量查詢,或者最原始的順序查詢chunks等;
HyDE:這是一種抄作業的方式,生成相似的或者更標準的 prompt 模板。
6.將原始query和檢索得到的文本組合起來輸入模型得到結果的過程,本質上就是個prompt enginering的過程。
6.現如今全流程的框架
Langchain和LLamaIndex
7.案例
1.chatPDF
2.Baichuan
3.Multi-modal retrieval-based LMs
8.存在的問題
1.檢索效果依賴embedding和檢索算法。目前可能檢索到無關信息,反而對輸出有負面影響。
2.大模型如何檢索到的信息仍是黑盒。可能仍存在不準確(甚至生成的文本與檢索信息相沖突)
3.對所有任務都無差別檢索 k 個文本片段,效率不高,同時會大大增加模型輸入的長度;
4.無法引用來源,也因此無法精準地查證事實,檢索的真實性取決于數據源及檢索算法。
9.RAG的評估方法
1.獨立評估
獨立評估涉及對檢索模塊和生成模塊的評估
指標:
1.答案相關性
此指標的目標是評估生成的答案與提供的問題提示之間的相關性。答案如果缺乏完整性或者包含冗余信息,那么其得分將相對較低。這一指標通過問題和答案的結合來進行計算,評分的范圍通常在0到1之間,其中高分代表更好的相關性。
2.忠實度
這個評價標準旨在檢查生成的答案在給定上下文中的事實準確性。評估的過程涉及到答案內容與其檢索到的上下文之間的比對。這一指標也使用一個介于0到1之間的數值來表示,其中更高的數值意味著答案與上下文的一致性更高。
3.上下文精確度
在這個指標中,我們評估所有在給定上下文中與基準信息相關的條目是否被正確地排序。理想情況下,所有相關的內容應該出現在排序的前部。這一評價標準同樣使用0到1之間的得分值來表示,其中較高的得分反映了更高的精確度。
4.答案正確性
該指標主要用于測量生成的答案與實際基準答案之間的匹配程度。這一評估考慮了基準答案和生成答案的對比,其得分也通常在0到1之間,較高的得分表明生成答案與實際答案的一致性更高。
現如今的評估框架:
RGAGS、ARES
https://zhuanlan.zhihu.com/p/661867062)
案與實際基準答案之間的匹配程度**。這一評估考慮了基準答案和生成答案的對比,其得分也通常在0到1之間,較高的得分表明生成答案與實際答案的一致性更高。
現如今的評估框架:
RGAGS、ARES
https://zhuanlan.zhihu.com/p/661867062)