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