RAG 徹底爆了!一文讀懂其架構演進及核心要點
本文系統梳理了檢索增強生成(RAG)架構的演進歷程,從基礎架構到智能化解決方案的迭代路徑。文章通過對比 Naive RAG、Advanced RAG、Modular RAG 和 Agentic RAG 四代架構的核心特點與技術突破,揭示了 RAG 技術如何通過模塊化設計、智能體協同等創新解決知識更新、語義對齊和複雜任務處理等關鍵問題,爲 LLM 應用落地提供重要參考。由於作者水平有限,若相關理解有誤請以實際爲準。
01 引言
1.1 什麼是 RAG(維基)
檢索增強生成(英語:Retrieval-augmented generation, RAG ) 是賦予生成式人工智能模型信息檢索能力的技術。檢索增強生成優化大型語言模型 (LLM) 的交互方式,讓模型根據指定的一組文件迴應用戶的查詢,並使用這些信息增強模型從自身龐大的靜態訓練數據中提取的信息。檢索增強生成技術促使大型語言模型能夠使用特定領域或更新後的信息。應用案例,包括讓聊天機器人訪問公司內部資料,或來自權威來源的事實信息。
簡易 RAG 流程
元寶 RAG 示例
1.2 爲什麼需要 RAG
1、LLM 的已知問題
-
知識有限:LLM 訓練是離線的,其模型知識僅限於訓練數據所覆蓋的知識範圍,模型不具備新知識或未訓練知識,如沒有實時數據或私有數據。
-
容易產生幻覺:沒有答案的情況下可能會提供虛假信息。
RAG 是解決上述問題的一種比較輕量的解決方案。
2、RAG 優點
-
輕量,成本更低,靈活:相比組織特定領域信息重新訓練基礎模型,RAG 是將新數據引入 LLM 成本更低的方法。
-
支持實時數據更新:可以通過工具實時檢索最新信息,並利用 LLM 的整合推理能力更準確回答實時問題。
-
可解釋性,可溯源:答案來源可追溯到具體檢索庫以及檢索內容,用戶可驗證準確性。
3、RAG 缺點
-
依賴知識庫質量及系統設計:系統回答的效果與外部知識庫質量和整體系統設計有較大關係,若設計不合理可能導致答案偏差。
-
系統複雜度增加,增加計算開銷:大規模的知識庫檢索會讓整體系統更加複雜,並且會延長系統性響應時間,對耗時敏感的業務可能產生性能瓶頸。研究表明,檢索環節佔 RAG 總耗時的 60% 以上。
02 RAG 演變流程
Navie RAG -> Advanced RAG -> Modular RAG -> Agentic RAG
2.1 Navie RAG
2.1.1 來源
最早由 meta 在論文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》中提出,提出的原因爲: 大規模預訓練語言模型(LLM)雖在下游任務上表現優異,但由於知識存儲在參數中,無法及時更新且易出現 “幻覺”(hallucination);爲此,引入外部可檢索的非參數化記憶(如 Wikipedia 向量索引),並將檢索結果與生成模型結合,從而提升知識密集型任務的準確性與可追溯性。
2.1.2 介紹
最簡單的架構,只包含 3 個階段:Indexing -> Retrieval -> Generation.
流程
1、索引構建 (離線)
-
數據加載:從各個來源整合數據。
-
文檔切塊:按照一定策略切塊文檔,如固定大小,語義分塊等。
-
向量化與存儲:使用 Embedding 模型(bge 系列等)將文檔轉換成向量,將向量即文檔信息存儲到向量數據庫(騰訊雲,Milvus,Faiss)等。
2、在線檢索(在線)
-
檢索:使用相同 Embedding 模型轉換用戶輸入,並從向量數據庫檢索相似 TopK 文檔(餘弦相似度或者歐氏距離)。
-
生成:將用戶輸入與檢索到的 toK 文檔組織成 Prompt,輸入 LLM 生成回答。
缺點
-
檢索質量不佳:存在檢索精度低和召回率低的問題,可能導致無關或過時信息被召回,影響生成答案的準確性。
-
生成內容缺陷:模型容易產生幻覺(信息不足)。
2.2 Advanced RAG
2.2.1 來源
沒有明確的提出者,在 Navie RAG 架構之後由多方逐步演進得到,如微軟研究院提出 HyDE,谷歌引入 Rerank,以及如 Elastic 和 Cohere 公司提出的各種優化技術等,由多方共同構成 Advanced RAG 技術體系. 這些優化技術提出的動因,主要是由於 Navie RAG 仍存在一系列問題,如
-
檢索精度不足:Navie RAG 依賴關鍵詞匹配(如 BM25)或簡單向量檢索,導致語義偏差問題。
-
多上下文割裂:Navie RAG 直接將檢索到的上下文直接拼接 Prompt 輸入 LLM,沒有做 post-retrieval 處理,文檔容易出現冗餘或矛盾。
-
無法處理複雜場景:Navie RAG 工作流比較簡單,沒有針對性優化,系統表現上限有限。
2.2.2 介紹
基於 Navie Rag 增加兩個步驟,包含 5 個階段:Indexing -> Pre Retrieval -> Retrievel -> Post Retrievel -> Generation,旨在解決文檔召回的質量和準確率。Navie RAG 屬於 Advanced Rag 的一個特化,即 Pre Retrievel 和 Post Retrievel 爲空。
1、Pre-Retrieval
預檢索處理: 側重數據索引優化。
-
索引數據優化
-
增強數據密度:如利用 LLM 清洗冗餘信息,元數據增強(條件過濾等)。
-
增強索引語義: 如預生成 chunk 快的假設性問題,提升檢索對稱性,建立如關鍵詞搜索(BM25),向量檢索或圖數據庫。嘗試多種 chunk 分塊策略(固定大小,遞歸,語義分塊)。
-
Embeddings 模型優化: 針對特定領域數據對模型進行微調,提升語義匹配精度。
-
Query 增強
-
Query translation: query 轉換,用於用戶的不確定性,用戶可能會輸入模糊表達,或 query 與 index 文檔不在一個語義空間,或 query 過於複雜的情況,因此需要 query 轉換。如 query-rewrite,query-expansion 等。
-
Query enhancement: query 增強,增強或者擴大用戶輸入的 query 語義,如: HyDE(假設文檔增強),Step-Back Prompting(回退一步 prompt)。
-
Query decomposition: query 分解,把用戶的複雜 query 分解成多個可管理的子問題,引導模型逐步解決各個子問題。如 Answer Recursively(遞歸回答,迭代),Answer Individually(獨立回答,分解後並行回答)。
2、Post-Retrievel
後檢索處理: 側重數據結果的二次加工 & 過濾
-
重排序 Rerank
對檢索出的文檔做更精細的評估,將真正最匹配意圖的文檔排列到前面,儘可能減少噪聲
-
上下文壓縮 Prompt Compression
若檢索出大量文檔,在輸送給 LLM 之前可能還需要對文檔做裁切,僅保留最關鍵核心的內容
2.3 Modular RAG
2.3.1 來源
Modular RAG 最早由 Yunfan Gao 等人在 2024 年 7 月的論文《Modular RAG: Transforming RAG Systems into LEGO-like Reconfigurable Frameworks》中首次系統化提出。提出的動因有:
-
RAG 系統日漸複雜:傳統 RAG 線性結構難以應對更復雜的需求,需要合理抽象及規劃,否則系統維護困難。
-
提升可重用性及維護,快速迭代:將各個環節抽象成一個個的可插拔模塊,便於 RAG 系統引入新的算法或計算策略。
對比 Advanced RAG 架構,該框架將系統各個部分抽象單獨的模塊與算子,實現模塊可複用,易擴展及維護的 RAG 架構。
2.3.2 介紹
Modular RAG: Transforming RAG Systems into LEGO-like Reconfigurable Frameworks
模塊化 RAG,將 RAG 系統分爲 Module Type、Module 和 Operators 三層結構。每個 Module Type 代表 RAG 系統中的一個核心流程,包含多個功能模塊。每個功能模塊反過來都包含多個特定的運算符。整個 RAG 系統變成了多個模塊和相應運算符的排列組合,形成了我們所說的 RAG Flow。整體有 7 個部分:Indexing, Pre Retrieval, Retrievel, Post Retrievel, Memory, Generation, Orchestration. 這種範式在基於 Advanced RAG 的橫向架構上引入了縱向的結構,即 Module 和 Operators。
Orchestration 是 Modular RAG 區分 Advanced RAG 的一個重要部分,而 Memory 模塊雖然在原論文沒有提及,但筆者認爲也是 Modular RAG 的一個重要組成部分,用於賦予 RAG 系統的長期記憶能力
-
Module Type: RAG 系統中的模塊分類,即 Indexing, Pre Retrieval, Retrievel, Post Retrievel, Memory, Generation, Orchestration 模塊,可以理解是函數接口。
-
Module: RAG 系統中的具體功能組件,每個模塊負責完成某個子任務,如 Retrievel 中可以是 VectorRetriever(向量檢索),HybridRetriever(混合檢索)。可以理解是函數接口的實現類
-
Operators: 每個模塊的具體實現,可以理解是接口實現類內部的核心算法完整功能的代碼片段,如 VectorRetriever 裏有如下餘弦相似度算法
def _cosine_similarity(query_vec, doc_vec): # 操作符
return np.dot(query_vec, doc_vec) / (np.linalg.norm(query_vec)*np.linalg.norm(doc_vec))
關鍵區別
-
Modular RAG 的模塊間通過數據流而非單純函數調用交互(如檢索模塊輸出文檔列表給生成模塊)。
-
操作符可以跨模塊複用(如相似度計算操作符可能被多個檢索模塊共享)。
Modular Rag 舉個例子
1、代碼示例,使用 haystack 官方示例。
Haystack 是一個開源框架,用於邊界構建 LLM 應用程序,框架整體採用 “節點 + 流水線” 架構,允許開發者通過自由組合預構建組件(如檢索器、生成器、評估器)構建定製化管道工作流。
##################
### 0. 組件定義 ###
##################
from haystack import Document, Pipeline
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack.components.embedders import SentenceTransformersTextEmbedder
from haystack.components.retrievers.in_memory import InMemoryEmbeddingRetriever
document_store = InMemoryDocumentStore(embedding_similarity_function="cosine")
text_embedder = SentenceTransformersTextEmbedder()
retriever = InMemoryEmbeddingRetriever(document_store=document_store)
##################
### 1. 添加組件 ###
##################
query_pipeline = Pipeline()
query_pipeline.add_component("component_name", component_type)
# Here is an example of how you'd add the components initialized in step 2 above:
query_pipeline.add_component("text_embedder", text_embedder)
query_pipeline.add_component("retriever", retriever)
# You could also add components without initializing them before:
query_pipeline.add_component("text_embedder", SentenceTransformersTextEmbedder())
query_pipeline.add_component("retriever", InMemoryEmbeddingRetriever(document_store=document_store))
##################
### 2. 連接組件 ###
##################
# This is the syntax to connect components. Here you're connecting output1 of component1 to input1 of component2:
pipeline.connect("component1.output1", "component2.input1")
# If both components have only one output and input, you can just pass their names:
pipeline.connect("component1", "component2")
# If one of the components has only one output but the other has multiple inputs,
# you can pass just the name of the component with a single output, but for the component with
# multiple inputs, you must specify which input you want to connect
# Here, component1 has only one output, but component2 has mulitiple inputs:
pipeline.connect("component1", "component2.input1")
# And here's how it should look like for the semantic document search pipeline we're using as an example:
pipeline.connect("text_embedder.embedding", "retriever.query_embedding")
# Because the InMemoryEmbeddingRetriever only has one input, this is also correct:
pipeline.connect("text_embedder.embedding", "retriever")
2、可視化示例,使用 LangFlow。
Modular RAG 下的 RAG 流
各個模塊之間的協作,可以有類似以下的工作流模式串聯
1、線性編排 (Linear Pattern)
整個 RAG 流由各個 Module 線性串聯起來,爲最簡單的模式。
2、條件編排 (Conditional Pattern)
RAG 流中會添加一些 Route 條件判斷,增強系統的靈活性。
3、分支 (並行) 編排(Branching)
RAG 流中存在多個並行的分支,各自處理後隨之合併到一起,這種情況多用於要增加生成結果的多樣性而引入
4、循環編排 (Loop Pattern)
- Interative retrieval(循環檢索): 單次檢索和生成無法有效解決需要大量知識的複雜問題,每次循環後會把當前 Generate 的輸出作爲匹配源再去檢索內容, 直到循環結束,整體類似 HyDE 檢索增強方法。ITER-RETGEN 是一種實現循環檢索的架構。
核心: 在每次迭代中,ITER-RETGEN 利用上一次迭代的模型輸出作爲特定上下文來幫助檢索更多相關知識。
HyDE(Hypothetical Document Embeddings), 即預先讓 LLM 生成用戶問題的答案,然後再用答案去知識庫檢索更大範圍內的內容,即提升 query 的泛化性
如: query: 如何提高睡眠質量, 但知識庫爲 “不喝咖啡,睡前不玩手機等” 內容,此時可以用 LLM 先生成簡單的答案,可能未“提升睡眠質量要避免咖啡因和電子設備等…”,此時可以檢索到對應文檔
- rescursive retrieval(遞歸檢索): 與循環檢索類似,但更明確的指出依賴前一步的各個內容(如利用上一次的 query 改寫內容),不斷深化檢索,不斷明確用戶查詢(消除歧義),有更明確的退出循環的條件。TOC RAG 流是一種實現,關鍵在 Tree of Clarification 中,通過澄清樹結構,在不斷迭代中消除用戶輸入的歧義。
澄清樹: 當初始查詢不明確時,通過遞歸迭代不斷生成多層子問題。
每次迭代檢索,會基於上一次迭代的輸入,檢索結果和生成內容,重新文檔 rerank,生成新的節點插入到樹中,達到一定深度或者節點樹後合併成一個全面的答案。
TOC RAG 流,一種 rescursive retrieval 的實現
Tree of Clarification
Interative 和 rescursive 的比較:
- Adaptive retrieval(自適應檢索):引入 LLM Agent 概念,在系統關鍵環節使用 LLM 判斷是否應該怎麼行動。如可以在 pre-retrieval 環節使用 LLM 判斷是否需要去檢索外部知識。同 Adaptive Agentic RAG。
-
tuning 模式
RAG 系統在各個 Module 都可能使用了 LLM 技術,使用數據微調以優化各個 LLM 組件的表現,包括:
-
retriever fine-tuning: 檢索器微調。
-
generator fine-tuning: 生成器微調。
-
dual fine-tuning: 即檢索器 + 生成器微調。
-
2.4 Agentic RAG
2.4.1 來源
最早 Chidaksh Ravuru 等人於 2024 年 8 月 18 日在 arXiv 上發表的論文《Agentic Retrieval-Augmented Generation for Time Series Analysis》中正式提出。 提出動因:
-
多層次依賴難以捕捉:傳統 RAG 將檢索和生成視爲線性流水線,對於具有季節性、趨勢性及突發事件的時序數據,單一向量檢索器難以兼顧各類模式,導致預測準確性不足。
-
分佈漂移與模型失效:歷史訓練數據與實時數據分佈常出現偏差,若依賴靜態文檔庫,容易陷入 “信息孤島”,降低時序分析的可靠性。
對比傳統 RAG, Agentic RAG 將能力依託於智能體,提升了 RAG 系統的靈活性及擴展其應用邊界。
2.4.2 介紹
Agentic RAG:架構上引入 Agent 的思路,實現動態決策(如是否檢索、工具調用)和多輪迭代優化。相比上述提到的幾種 RAG,Agentic RAG 將實際輸入處理的多樣性交給 LLM 處理,可以解決更復雜的問題。
Agent 的核心部件:LLM + Memory + Planning + Tools
如何運作?
從 Modular RAG 的架構來看,只要是涉及 LLM 的模塊理論上都可以使用 Agent 來增強,但在該 Agentic RAG 架構中更多強調的是在 retrievel 模塊中使用。 在檢索階段,不同數據源可以視作不同的 tool,然後由檢索 Agent 集成這些 tool 動態檢索內容
一些 Agent Agentic RAG 架構
-
Single-Agent Agentic RAG
該框架核心是一個系統決策中心的 Router Agent,該 Agent 動態處理信息檢索,集成操作,類似上述 Modular RAG 中提到的條件編排的 Agent 代理版本,比較適用於多檢索源的簡單問答場景。
-
Multi-Agent Agentic RAG
爲 Single-Agent Agentic RAG 架構的演進版本,用多個專用代理來細化更復雜的工作流和不同的查詢類型。核心 Router Agent 下又掛接了多個檢索 Agent, 如 Agent1 用於查詢結構化數據 (Mysql),Agent2 用於查詢非結構化數據,Agent3 用於 Web 查詢或專用 API 查詢等。
- Hierarchical Agentic RAG
分層代理 RAG,爲 Multi-Agent Agentic RAG 架構的拓展,將整個系統分爲多個層級的 Agent,由頂級 Agent 驅動子 Agent,並聚合子 Agent 的結果。
- Agentic Corrective RAG
Corrective RAG 的核心是他可以動態評估檢索到的文檔並糾正查詢,提升檢索文檔的質量。
Agentic Corrective RAG 系統建立在 5 個關鍵 Agent 上。
-
Context Retrieval Agent: 負責從數據庫中檢索相關上下文。
-
Relevance Evaluation Agent: 負責評估檢索到的文檔的相關性,並標記出不相關或不明確文檔並採取糾正措施。
-
Query Refinement Agent: 重寫 query 增強檢索的 Agent。
-
External Knowledge Retrieval Agent: 當 Context Retrieval Agent 檢索的上下文不足時,從其他備用數據源檢索數據 (如 Web 檢索)。
-
Response Synthesis Agent: 組織響應 Agent。
- Adaptive Agentic RAG
自適應 Agent RAG, 與上述 Modular RAG 中的 Adaptive retrieval 一樣,語義上都是在各個環節引入了 LLM 判斷,並在引入 LLM 評測實現 Loop 自迭代。
- Graph-Based Agentic RAG
Graph-Based Agentic RAG 在檢索中引入了圖檢索,合併圖數據及其他檢索數據增強檢索效果
03 總結
04 一些思考
-
Generation 模塊 (LLM 回答) 的前後處理
在 Advanced RAG 中,爲了提升最終回答效果從而引入了 Pre-Retrieval 和 Post-Retrieval 兩個流程,或對回答 LLM 進行微調。從 “garbage in garbage out” 理論來看,實際落地時,需要充分考慮業務屬性,提升輸入 LLM 的數據質量。
-
RAG 系統設計的模塊化 & 可插拔
由於 RAG 系統的不確定性(引入 LLM),在構建自己的 RAG 系統時,可參考 Modular RAG 思維使用模塊化設計,便於快速切換某環節中的 Module 後驗證整體系統效果。
-
Agent 的不穩定,實際業務落地存在不確定性
當前由於模型能力的瓶頸,Agent 系統存在極大的不確定性,在 Agentic RAG 系統中,在大的層面引入 Agent 對實際業務落地不太可取,可考慮在某個小環節中引入,如 Generation 問答補充(在基於檢索出的文檔後,動態給定一些 tools 讓其優化回答效果)。
Reference
-
《Retrieval-augmented generation》 - https://en.wikipedia.org/wiki/Retrieval-augmented_generation
-
《What is RAG》 - https://aws.amazon.com/cn/what-is/retrieval-augmented-generation/
-
《Retrieval-Augmented Generation for Large Language Models: A Survey》 - https://arxiv.org/pdf/2312.10997
-
《Modular RAG: Transforming RAG Systems into LEGO-like Reconfigurable Frameworks》 - https://arxiv.org/pdf/2407.21059
-
《Modular RAG and RAG Flow: Part Ⅰ》 - https://medium.com/@OpenRAG/modular-rag-and-rag-flow-part-%E2%85%B0-e69b32dc13a3
-
《Modular RAG and RAG Flow: Part II》 - https://medium.com/@OpenRAG/modular-rag-and-rag-flow-part-ii-77b62bf8a5d3
-
《Tree of Clarifications: Answering Ambiguous Questions with Retrieval-Augmented Large Language Models》 - https://arxiv.org/pdf/2310.14696
-
《Implementing “Modular RAG” with Haystack and Hypster》 - https://medium.com/data-science/implementing-modular-rag-with-haystack-and-hypster-d2f0ecc88b8f
-
《Modular RAG with Haystack and Hypster》 - https://github.com/gilad-rubin/modular-rag
-
《Agentic Retrieval-Augmented Generation: A Survey on Agentic RAG》 - https://arxiv.org/abs/2501.09136
-
《haystack-api》 - https://docs.haystack.deepset.ai/reference/routers-api
-
《What is Agentic RAG》 - https://weaviate.io/blog/what-is-agentic-rag
-
《AGENTIC RETRIEVAL-AUGMENTED GENERATION: A SURVEY ON AGENTIC RAG》 - https://arxiv.org/pdf/2501.09136
原創作者|黃志傑
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/-0PmwBVvL2t3eYMrup6_vA