為什么 RAG 系統"一看就會,一做就廢"? 原創
隨著大模型(LLM)的廣泛應用,檢索增強生成(RAG)技術作為一種創新架構,因其在結合外部知識庫和生成模型方面的卓越表現而備受關注。RAG 技術通過將 LLM 與結構化或非結構化的外部數據源相結合,顯著提升了生成內容的準確性、相關性和可信度。
第一、RAG 的優勢
RAG 技術在多個領域表現出色,尤其是在聊天機器人、知識密集型任務和企業應用中。通過檢索外部知識庫,RAG 能夠為 LLM 提供更豐富的上下文信息,從而生成更準確、更相關的內容。這種結合不僅提高了回答的可信度,還減少了生成模型的“幻覺”現象。
第二、RAG 的挑戰
然而,從理論到工程實踐,開發和優化一個高效的 RAG 系統并非易事。RAG 系統面臨著諸多挑戰,主要包括以下幾個方面:
1、檢索效率
檢索階段需要在大規模數據集中快速找到相關文檔,這對檢索系統的效率和準確性提出了很高的要求。如何在幾億篇文檔中快速找到與查詢最相關的文檔片段,是 RAG 系統面臨的一個關鍵問題。
2、生成質量
生成階段需要將檢索到的文檔片段有效地整合到生成的回答中,這對生成模型的能力提出了挑戰。如何避免生成的回答中出現冗余或不連貫的內容,是提升生成質量的關鍵。
3、上下文窗口限制
生成模型的上下文窗口有限,這意味著它能夠處理的文檔片段數量是有限的。如何在有限的上下文窗口中選擇最相關的文檔片段,是優化 RAG 系統的一個重要方向。
4、系統集成
RAG 系統需要將檢索模塊和生成模塊無縫集成,確保整個系統的流暢運行。如何優化系統架構,確保檢索和生成模塊之間的高效協作,是 RAG 系統開發中的一個難點。
第三、RAG 的優化路徑
為了克服這些挑戰,我們可以從以下幾個方面進行系統性的分析和優化:
1、改進檢索模型
使用更高效的檢索模型,如稀疏-密集混合檢索模型,提高檢索的效率和準確性。例如,結合稀疏嵌入模型和向量搜索,可以在大規模數據集中快速找到相關文檔。
2、優化生成模型
使用更強大的生成模型,如預訓練語言模型(比如:DeepSeek R1、QwQ 等),提高生成回答的質量。同時,可以通過微調生成模型,使其更好地適應特定領域的任務。
3、引入重排序(Rerank)
在檢索階段引入重排序模型,對檢索到的文檔片段進行重新排序,確保傳遞給生成模型的文檔片段是最相關的。重排序模型可以顯著提高檢索結果的相關性,從而提升生成回答的質量。
4、優化系統架構
優化 RAG 系統的整體架構,確保檢索模塊和生成模塊之間的高效協作。例如,可以通過兩階段檢索策略,先快速篩選出候選文檔,再進行精細排序,從而在保證效率的同時,提升系統的整體性能。
1、RAG 系統的12個問題
在工程實踐中,RAG(檢索增強生成)系統面臨著諸多挑戰。澳大利亞吉朗應用人工智能研究所的 Scott Barnett 等人在論文《Seven Failure Points When Engineering a Retrieval Augmented Generation System》中,深入探討了這些問題,并總結了以下 7 個常見問題:
1. 缺失內容(Missing Content)
當用戶的問題無法從文檔庫中檢索到相關內容時,可能會導致大模型(LLM)產生“幻覺”現象。理想情況下,RAG 系統可以簡單地回復“抱歉,我不知道”。然而,如果用戶問題能夠檢索到文檔,但文檔內容與用戶問題無關,LLM 仍可能被誤導。
2. 錯過超出排名范圍的文檔(Missed Top Ranked)
由于 LLM 的上下文長度限制,從文檔庫中檢索時,通常只返回排名靠前的 K 個段落。如果問題的答案所在段落超出了排名范圍,就會導致問題無法得到正確回答。
3. 不在上下文中(Not In Context)
即使包含答案的文檔已經成功檢索出來,但這些文檔可能沒有被包含在 LLM 所使用的上下文中。當從數據庫中檢索到多個文檔,并通過合并過程提取答案時,這種情況尤為常見。
4. 未提取(Not Extracted)
答案可能存在于提供的上下文中,但 LLM 未能準確提取出來。這通常發生在上下文中存在過多噪聲或沖突信息時。
5. 錯誤的格式(Wrong Format)
用戶的問題可能要求以特定格式提取信息,例如表格或列表,但 LLM 忽略了這一指示。
6. 不正確的具體性(Incorrect Specificity)
盡管 LLM 正常回答了用戶的問題,但回答可能不夠具體或過于具體,無法滿足用戶的需求。這種情況也可能發生在用戶不確定如何提問或提問過于籠統時。
7. 不完整的回答(Incomplete Answers)
例如,用戶提問“文件 A、B、C 包含哪些關鍵點?”直接使用這個問題檢索可能只能得到每個文件的部分信息,導致 LLM 的回答不完整。一個更有效的方法是分別針對每個文件提出具體問題,以確保全面覆蓋。
其他問題
Wenqi Glantz 在文章《12 RAG Pain Points and Proposed Solutions》中,又提出了另外 5 個問題:
8. 數據攝取的可擴展性問題(Data Ingestion Scalability)
RAG 管道中的數據攝取可擴展性問題是指系統在處理大量數據時可能遇到的挑戰。這些問題可能導致攝取時間延長、系統過載、數據質量問題和可用性受限等。
9. 結構化數據的問答(Structured Data QA)
準確檢索用戶問題所需的結構化數據可能很困難,尤其是當用戶的問題比較復雜或模糊時。當前的文本到 SQL 轉換技術不夠靈活,且 LLM 在處理這類任務時仍存在局限性。
10. 從復雜 PDF 文檔提取數據(Data Extraction from Complex PDFs)
復雜的 PDF 文檔可能包含表格、圖片等嵌入內容。傳統的檢索方法在處理這類文檔時往往效果不佳,需要更高效的方法來提取數據。
11. 備用模型(Fallback Model(s))
在使用單一 LLM 時,可能會遇到模型故障或訪問頻率限制等問題。此時,需要一個或多個備用模型來確保系統的穩定運行。
12. 大語言模型的安全性(LLM Security)
防止惡意輸入、確保輸出安全、保護敏感信息不被泄露等,是每個 AI 架構師和工程師需要面對的重要挑戰。
2、RAG 系統的12個優化策略
從 RAG(檢索增強生成)的工作流程來看,各個環節都存在優化空間。結合上述提到的 12 個問題,我們可以從 RAG 工作流程的 5 個關鍵環節入手,詳細了解具體的優化策略。
1. 數據清洗(Clean your data)
高性能的 RAG 系統依賴于準確且清潔的原始知識數據。為了確保數據的準確性,需要優化文檔讀取器和多模態模型。特別是處理如 CSV 表格等文件時,單純的文本轉換可能會丟失表格原有的結構。因此,需要引入額外的機制在文本中恢復表格結構,比如使用分號或其他符號來區分數據。
此外,還需要對知識文檔進行基本的數據清洗,包括:
文本清理:規范文本格式,去除特殊字符、干擾和不相關信息;刪除可能使檢索過程產生偏差的重復文檔或冗余信息;識別并更正拼寫錯誤和語法錯誤,拼寫檢查器和語言模型等工具可以幫助解決這個問題。
實體解析:消除實體和術語的歧義以實現一致的引用。例如,將“LLM”、“大語言模型”和“大模型”標準化為通用術語。
文檔劃分:合理地劃分不同主題的文檔。如果作為人類都不能輕松地判斷出需要查閱哪個文檔來回答常見的提問,那么檢索系統也無法做到。
數據增強:使用同義詞、釋義甚至其他語言的翻譯來增加語料庫的多樣性。
用戶反饋循環:基于現實世界用戶的反饋不斷更新數據庫,標記它們的真實性。
時間敏感數據:對于經常更新的主題,實施一種機制來使過時的文檔失效或更新。
2. 分塊處理(Chunking)
在 RAG 系統中,文檔需要分割成多個文本塊再進行向量嵌入。分塊的目的是在保持語義上的連貫性的同時,盡可能減少嵌入內容中的噪聲,從而更有效地找到與用戶查詢最相關的文檔部分。分塊策略包括:
固定大小的分塊:設定塊中的字數,并選擇塊之間是否重復內容。通常保持塊之間的一些重疊,以確保語義上下文不會在塊之間丟失。
內容分塊:根據文檔的具體內容進行分塊,例如根據標點符號(如句號)分割,或者使用更高級的 NLTK 或 spaCy 庫提供的句子分割功能。
遞歸分塊:通過重復應用分塊規則來遞歸地分解文本。例如,在 LangChain 中會先通過段落換行符(\n\n)進行分割,然后檢查這些塊的大小。如果大小不超過一定閾值,則該塊被保留。對于大小超過標準的塊,使用單換行符(\n)再次分割。
從小到大分塊:將同一文檔進行從大到小所有尺寸的分割,然后把不同大小的分塊全部存進向量數據庫,并保存每個分塊的上下級關系,進行遞歸搜索。但這種方法需要更大的存儲空間。
特殊結構分塊:針對特定結構化內容的專門分割器,如 Markdown 文件、Latex 文件以及各種主流代碼語言分割器。
分塊大小的選擇:不同的嵌入模型有其最佳輸入大小。例如,OpenAI 的 text-embedding-ada-002 模型在 256 或 512 大小的塊上效果更好。文檔的類型和用戶查詢的長度及復雜性也是決定分塊大小的重要因素。
3. 嵌入模型(Embedding Models)
嵌入模型能夠將文本轉換成向量。不同的嵌入模型帶來的效果不同。例如,Word2Vec 模型生成的詞向量是靜態的,這在處理一詞多義的情況時可能導致問題。相比之下,引入自注意力機制的模型,如 BERT,能夠提供動態的詞義理解。在選擇嵌入模型時,可以參考 Hugging Face 推出的嵌入模型排行榜 MTEB,同時注意模型是否支持中文。
4. 元數據(Metadata)
當在向量數據庫中存儲向量數據時,某些數據庫支持將向量與元數據(即非向量化的數據)一同存儲。為向量添加元數據標注是一種提高檢索效率的有效策略。常見的元數據標簽包括日期、章節或小節的引用、文本的關鍵信息、小節標題或關鍵詞等。這些元數據不僅有助于改進知識檢索的準確性,還能為最終用戶提供更加豐富和精確的搜索體驗。
5. 多級索引(Multi-Level Indexing)
當元數據無法充分區分不同上下文類型時,可以考慮進一步嘗試多重索引技術。多重索引技術的核心思想是將龐大的數據和信息需求按類別劃分,并在不同層級中組織,以實現更有效的管理和檢索。這意味著系統不僅依賴于單一索引,而是建立了多個針對不同數據類型和查詢需求的索引。例如,可能有一個索引專門處理摘要類問題,另一個專門應對直接尋求具體答案的問題。這種多重索引策略使 RAG 系統能夠根據查詢的性質和上下文,選擇最合適的索引進行數據檢索,從而提升檢索質量和響應速度。但為了引入多重索引技術,還需要配套加入多級路由機制,確保每個查詢被高效引導至最合適的索引。
6. 索引/查詢算法(Indexing/Query Algorithms)
利用索引篩選數據,但最終仍需從篩選后的數據中檢索出相關的文本向量。由于向量數據量龐大且復雜,尋找絕對的最優解變得計算成本極高,有時甚至是不可行的。因此,通常采用最近鄰搜索(Approximate Nearest Neighbor Search,ANNS)來找到“足夠接近”或“相似”的項。在某些垂直領域,如法律、醫療、金融等,大模型的不確定性可能會帶來致命的結果。因此,LLM + RAG 結合互補,以期望解決 LLM 在某些場景的短板。
7. 查詢轉換(Query Transformation)
在 RAG 系統中,用戶的查詢問題被轉化為向量,然后在向量數據庫中進行匹配。查詢的措辭會直接影響搜索結果。如果搜索結果不理想,可以嘗試以下幾種方法對問題進行重寫,以提升召回效果:
結合歷史對話的重新表述:利用 LLM 重新表述問題,特別是在多輪對話中,將歷史信息和用戶提問一并交給 LLM 重新表述。
假設文檔嵌入(HyDE):先讓 LLM 在沒有外部知識的情況下生成一個假設性的回復,然后將這個假設性回復和原始查詢一起用于向量檢索。
退后提示(Step Back Prompting):如果原始查詢太復雜或返回的信息太廣泛,可以選擇生成一個抽象層次更高的“退后”問題,與原始問題一起用于檢索。
多查詢檢索/多路召回(Multi Query Retrieval):使用 LLM 生成多個搜索查詢,特別適用于一個問題可能需要依賴多個子問題的情況。
8. 檢索參數(Retrieval Parameters)
在具體的檢索過程中,可以根據向量數據庫的特定設置來優化一些檢索參數,包括:
稀疏和稠密搜索權重:結合稀疏搜索(如 BM25)和稠密搜索(向量搜索),并設定兩者對最終結果評分的權重比例。
結果數量(TopK):足夠的檢索結果可以確保系統覆蓋到用戶查詢的各個方面,但結果數量過多可能導致信息過載。
相似度度量方法:選擇合適的相似度度量方法,如余弦相似度,因為它不受向量長度的影響,只反映方向上的相似度。
9. 高級檢索策略(Advanced Retrieval Strategies)
在向量數據庫檢索之上,開發或改進整個系統的策略是關鍵和復雜的步驟。一些常用或新提出的策略包括:
上下文壓縮:通過 LLM 的幫助對單個文檔內容進行壓縮,或者對返回結果進行一定程度的過濾,僅返回相關信息。
句子窗口搜索:將匹配到的分塊周圍的塊作為上下文一并交給 LLM 進行輸出,增加 LLM 對文檔上下文的理解。
父文檔搜索:先將文檔分為尺寸更大的主文檔,再把主文檔分割為更短的子文檔兩個層級,用戶問題會與子文檔匹配,然后將該子文檔所屬的主文檔和用戶提問發送給 LLM。
自動合并:對文檔進行結構切割,如按三層樹狀結構進行切割,在檢索時只拿葉子節點和問題進行匹配,當某個父節點下的多數葉子節點都與問題匹配上則將該父節點作為結果返回。
多向量檢索:給一個知識文檔轉化成多個向量存入數據庫,這些向量不僅包括文檔在不同大小下的分塊,還可以包括該文檔的摘要,用戶可能提出的問題等。
多代理檢索:選取部分優化策略交給一個智能代理合并使用,如子問題查詢、多級索引和多向量查詢結合。
Self-RAG:通過檢索評分和反思評分來提高質量,主要分為檢索、生成和批評三個步驟。
10. 重排模型(Re-ranking)
在完成語義搜索的優化步驟后,能夠檢索到語義上最相似的文檔,但語義最相似并不一定代表最相關。例如,當用戶查詢“最新上映的科幻電影推薦”時,可能得到的結果是“科幻電影的歷史演變”,雖然從語義上這與科幻電影相關,但并未直接回應用戶關于最新電影的查詢。
重排模型可以幫助我們緩解這個問題。重排模型通過對初始檢索結果進行更深入的相關性評估和排序,確保最終展示給用戶的結果更加符合其查詢意圖。這一過程通常由深度學習模型實現,如 Cohere 模型。這些模型會考慮更多的特征,如查詢意圖、詞匯的多重語義、用戶的歷史行為和上下文信息等。
例如,對于查詢“最新上映的科幻電影推薦”,在首次檢索階段,系統可能基于關鍵詞返回包括科幻電影的歷史文章、科幻小說介紹、最新電影的新聞等結果。然后,在重排階段,模型會對這些結果進行深入分析,并將最相關、最符合用戶查詢意圖的結果(如最新上映的科幻電影列表、評論或推薦)排在前面,同時將那些關于科幻電影歷史或不太相關的內容排在后面。這樣,重排模型就能有效提升檢索結果的相關性和準確性,更好地滿足用戶的需求。
在實踐中,使用 RAG 構建系統時都應考慮嘗試重排方法,以評估其是否能夠提高系統性能。
11. 提示詞(Prompt Engineering)
大型語言模型的解碼器部分通常基于給定輸入來預測下一個詞。這意味著設計提示詞或問題的方式將直接影響模型預測下一個詞的概率。通過改變提示詞的形式,可以有效地影響模型對不同類型問題的接受程度和回答方式。
為了減少模型產生主觀回答和幻覺的概率,一般情況下,RAG 系統中的提示詞中應明確指出回答僅基于搜索結果,不要添加任何其他信息。例如,可以設置提示詞如下: “你是一名智能客服。你的目標是提供準確的信息,并盡可能幫助提問者解決問題。你應保持友善,但不要過于啰嗦。請根據提供的上下文信息,在不考慮已有知識的情況下,回答相關查詢。”
此外,使用少量樣本(few-shot)的方法,將想要的問答例子加入提示詞中,指導 LLM 如何利用檢索到的知識,也是提升 LLM 生成內容質量的有效方法。這種方法不僅使模型的回答更加精準,也提高了其在特定情境下的實用性。
12. 大語言模型(LLM)
最后一步是 LLM 生成回答。LLM 是生成響應的核心組件。與嵌入模型類似,可以根據自己的需求選擇 LLM,例如開放模型與專有模型、推理成本、上下文長度等。此外,可以使用一些 LLM 開發框架來搭建 RAG 系統,比如 LlamaIndex 或 LangChain。這兩個框架都擁有比較好用的 debugging 工具,可以讓我們定義回調函數,查看使用了哪些上下文,檢查檢索結果來自哪個文檔等。
3、總結
構建 RAG 系統不僅需要深厚的技術功底,還需注重工程實踐的細節。從提升檢索精度、優化生成質量到確保系統穩定性,每一個環節都需要精心設計與打磨。借助最新的優化策略和前沿工具鏈(例如 Cursor、MCP 技術),可以有效攻克開發過程中的關鍵難題,打造出高效、穩定且靈活的 RAG 系統。
隨著多模態技術的不斷進步、大模型上下文理解能力的增強、動態學習機制的完善以及隱私保護技術的成熟,RAG 系統將在更多垂直領域大放異彩,成為推動下一代智能應用發展的核心技術之一。它將為用戶提供更智能、更可靠的服務體驗,助力各行業實現智能化轉型與升級。
本文轉載自公眾號玄姐聊AGI 作者:玄姐
