為什么你的RAG不起作用?失敗的主要原因和解決方案
無數企業正在嘗試使用檢索增強生成(RAG),但在制作這些系統達到生產質量時普遍會感到失望。因為他們的RAG不僅運行效果差,而且對于如何改進和如何進行后續的工作也感到十分的迷茫。
其實阻礙RAG系統的一個關鍵因素是語義不協調,這是由于任務的預期含義、RAG的理解以及存儲的底層知識之間的不一致。由于向量嵌入的底層技術是神奇的(易變且極不透明),因此難以診斷這種不協調,使其成為生產化的重大障礙。
本文的目標是揭示普通RAG失敗的主要原因,并提供具體策略和方法,使您的RAG更接近生產階段。
在這篇文章中,我們將:
- 區分理想形態的RAG的前景與普通RAG的現實
- 解釋語義不協調是如何產生的
- 介紹如何判斷和緩解語義不協調
- 總結一些額外的高ROI策略,使RAG更加接近生產質量
注:為簡化問題我們將關注基于問答的文本示例,但核心思想可以推廣到其他用例
為什么選用RAG?
RAG(檢索增強生成)是一個目前正經歷炒作周期的范式。它聽起來很吸引人,在本質上它是AI的搜索引擎。
在GPT-3成為大熱之后不久,RAG開始流行。企業在構建LLM驅動的AI時面臨的一個直接問題是,像GPT這樣的模型沒有在它們特定的數據和領域上進行訓練。所以LLM從業者很快發現,當在提示中直接提供業務特定上下文(如支持文檔)時,GPT的表現出奇的好。這就為企業提供了一個不用進行微調模型的替代方案。
對于RAG,給它一個問題,可能還有用戶特定的信息,它將返回最相關的上下文給GPT。雖然這在理論上聽起來很棒,但在實現生產級RAG時存在重大挑戰,我們將在接下來的部分中探討。
RAG是有前途的,普通RAG只是開始
RAG只是一個框架,一個完美運作的RAG,無論其后端如何,都將為無數用例帶來巨大的價值。如果你對RAG有所了解則可以跳過此節。
傳統RAG(定義):一個單步語義搜索引擎,它將業務知識(如支持文檔)存儲在向量數據庫中,如Pinecone,使用現成的嵌入模型。然后通過創建問題文本的向量嵌入,并使用比較度量(如余弦相似性)來對最相關的前k個文檔進行排名。
一個向量嵌入模型接收任意字符串并返回一個固定維度的數學向量。流行的嵌入模型包括OpenAI的text-embedding-ada-002及其最新模型text-embedding-3-small。這些模型將文本塊轉換為約1500維的向量,并且幾乎沒有人類理解的可解釋性。
向量是非常普遍且非常有用的工具,因為可以將非定量的事物分解為豐富的維度數組,并對它們進行定量比較。一些例子是:
- (紅、綠、藍)顏色調色板是一個向量,每個值介于0-255之間。
- 通過行業標準如Barra,可以將股票表示為一個向量,量化其對經濟因素(如廣泛增長、利率變化等)的敏感度。
- 像Netflix這樣的平臺可以將用戶偏好分解為一個向量,其中的組成部分可以表示類型和其他特征。
余弦相似性可以說是在語義搜索中比較向量的默認度量標準,它通過應用余弦到兩個向量之間的點積角度來工作。余弦越接近1,向量就越相似。
也有其他衡量語義相似性的方法,但通常這不是問題的關鍵所在,我們將在文章中使用余弦相似性。
但是這里必須強調的是,像余弦相似性這樣的向量比較度量是很難處理的,因為它們沒有絕對的意義——這些值完全取決于嵌入模型和涉及文本的上下文。假設你將一個問題與一個答案匹配,得到了0.73的余弦相似性。這是一個好匹配嗎?
我們提出一個問題“What is rain?”并將其與三個相關性不同的文本進行比較。在下表中看到,使用兩個不同的OpenAI模型的余弦相似性的范圍和解釋有很大差異。對于第一個模型,0.73表示完全不相關的匹配,但是對于第二個模型,0.73表示高度相關。這表明任何功能良好的RAG系統都需要校準對這些分數的理解。
Text1 (definition): “Rain is the precipitation of water droplets from clouds, falling to the ground when they become too heavy to stay suspended in air.”
Text2 (mentions rain): “The winds blowing moisture over the mountains are responsible for rain in Seattle.”
Text3 (irrelevant info): “Stripe is a payments infrastructure business.”
語義不協調造成問題
傳統的RAG的幾個挑戰可以歸因于語義不協調和嵌入的解釋性差。語義不協調是任務預期含義、RAG的理解以及存儲的底層知識之間的不一致。
可以大致說為“問題在語義上與它們的答案不一樣”,所以直接比較問題和你的原始知識庫只會得到有限的結果。
想象一個律師需要搜索成千上萬的文檔來尋找投資欺詐的證據。然后他提出了問題“有什么證據表明Bob進行了金融欺詐?”與“Bob在3月14日購買了XYZ股票”(其中隱含XYZ是競爭對手,且3月14日是財報公布前一周)基本上沒有語義重疊,但是在因果層面這兩件事情是有聯系的
向量嵌入和余弦相似性是模糊的,因為向量在完全捕捉任何給定陳述的語義內容方面有其固有的不完美。余弦相似性導致精確排名并不是必然的,因為它隱含地假設每個維度都具有相同的重要性。
使用余弦相似性進行語義搜索傾向于在方向上是正確的,但本質上是模糊的。它可以很好地估計前20個結果,但通常只靠它來可靠地排名最佳答案是有很多要求的。
在互聯網上訓練的嵌入模型不理解你的業務和領域,尤其是在喜歡造詞的互聯網時代,Connect、Radar和Link等詞,在討論不同產品時意義大相徑庭,語義不協調的來源是多重的,并導致排名不可靠。
診斷和緩解語義不協調
在這個示例中將介紹如何診斷RAG中的完全語義不協調。我們還將介紹如何通過增加結構來提高性能的早期跡象。
這個例子來自現實生活中的用例。
1、我們假設一個電子商務初創公司正在建立一個內部使用的RAG,它找到給定業務問題的最佳SQL表。下面是示例的設置,其中我們:
events.purchase_flow:產品流程中的詳細原始用戶事件
aggregates.purchases:匯總的表,包含摘要分析
2、然后創建了一些假設的問題進行評估
IP地址對查看和購買的產品類型有什么影響?本季度鞋類銷售的整體趨勢如何?每小時的幾秒鐘內有不尋常的行為嗎?像新年這樣的重大事件周圍用戶參與度如何變化?
3、生成了額外的元數據
每個表的簡要描述,每個表獨特回答的示例問題
4、通過將我們的輸入文本與“垃圾”進行比較來檢查嘈雜的余弦相似性得分
5、比較四種不同的檢索策略,看哪些文本類型與我們的輸入“最語義相似”。
策略1:僅表結構
策略2:表結構 + 簡要描述
策略3:表結構 + 簡要描述 + 示例問題
策略4:僅示例問題
我們比較了隨機文本片段與每個問題以及原始表文本的余弦相似性(下圖為示例)。我們發現,對于垃圾輸入的余弦相似性約在0.04-0.23之間,這這有助于建立識別語義重疊弱到無的基線。
四種策略的比較
從下面的結果可以看出,策略4將問題與示例問題進行比較,具有最高的語義重疊和最佳排名。策略1和策略2的表現相似,與噪聲一致——也就是說,業務問題與SQL表語句之間存在弱的或根本沒有語義重疊。
這可能與我們的認知不同因為在一般人的理解中策略1就已經足夠了,LLM能搞定一切。而專業人士理解的策略3因該更好,因為它將所有內容混合在一起,但表現不如策略4。
- 噪聲(隨機,無關文本):余弦相似性在0.04–0.23之間。
- 策略1(僅表結構):值在0.17–0.25之間(與噪聲一致)。
- 策略2(表結構 + 描述):值在0.14–0.25之間(仍然與噪聲一致)。
- 策略3(表結構 + 描述 + 示例問題):值在0.23–0.30之間。明顯改善,我們開始從噪聲中看到信號。
- 策略4(僅示例問題):值在0.30–0.52之間。明顯是表現最好的策略,并且完全超出了噪聲范圍。,它導致正確表與錯誤表之間的余弦相似性有了最大的分離,從而產生了更強的信號。
進一步提高你的RAG的策略
如果你也遇到了我們目前所描述的問題,那么首先恭喜你,你是一個真正使用過或者想使用RAG的從業者。但是上面的問題也只是觸及了表面,更復雜的問題已經超出了本文的范疇,我們會在后面的文章進行討論。目前我們需要著眼解決本文所描述的問題,以下則是一些對進行階梯式改進的值得采用的方法。
結構化數據
可以通過增加結構來改善RAG,這是首先將問題鏈接到現有的問題庫,隨后將指導你找到正確的答案。這與直接將問題鏈接到單步中的正確文本相反。
對于基于支持文檔構建的Q&A系統,問題→問題的比較將實質性地提高性能,而不是問題→支持文檔。實際操作中,最簡單的方法是 要求你的大模型(如ChatGPT)為每個文檔生成示例問題,并讓人類專家進行策劃。本質上講就是建立了我們自己的知識庫。
這種方法還能進一步發展嗎?
- 對于每個文檔,讓ChatGPT生成它可以回答的100個問題列表
- 這些問題不會完美,因此對于你生成的每個問題,計算其與其他每個文檔的余弦相似性
- 篩選出那些會將正確文檔排在所有其他文檔之前的問題
- 通過排序那些正確文檔與第二名文檔的余弦相似性差異最大的問題,來識別最高質量的問題
- 發送給人類進行進一步的判斷(這步就要人工成本了)
語義 + 相關性排名
幾乎每個主要搜索引擎都在使用這個方法,所以這可能是我們能得到的更大的好處的方法。因為余弦相似性很適合做初步評估,但最終無法進行更高精度的排名。
如果你的業務可能擁有更多的信息來幫助AI做出更好的決策,例如:收集了諸如頁面瀏覽和點贊等指標,可能按人物特征擁有這些指標。那么你就可以創建一個包括廣泛用戶/任務特征的相關性評分,來微調排名,使RAG工作得更好。例如可以讓你的排名成為一個線性組合,
排名 = (余弦相似性) + (權重) x (相關性評分)
使用AI作為工具,而不是完整的解決方案
幾十年來,軟件工程實踐演變為傾向于設計許多小組件,這些組件具有嚴格、明確的保證。圍繞聊天界面的狂熱完全顛覆了這一范式,五年后,這種做法很可能被視為是錯誤的。
ChatGPT以及大部分新興生態系統鼓勵的范式是“給我任何文本,我就給你任何文本。”這些AI沒有效力或成本和延遲的保證,而是有著“我可能在某些時候在某種程度上是對的”的模糊承諾。其實企業應該通過提供更具范圍和主觀性的接口來構建更健壯的AI。
這也就是對于OpenAI所說的超級對齊的來說是非常重要的但又不是必要的。(這里僅是我個人的關系,供參考)
總結
我們正在見證AI的新時代的到來。這個時代的新穎之處不在于NLP和語言模型的出現,而是現成技術降低了企業利用自然語言技術針對他們特定用例的門檻。但是,我們還要清楚的認識到,目前這項技術仍處于早期開發階段,在為你的AI構建RAG時,其實是在構建一個復雜的搜索引擎,這是可行的,但是要認識到這里的復雜性和挑戰并解決這些問題才能讓我們向成功邁出第一步。