RAG 技術全解析:從基礎原理到優化實戰

你瞭解 RAG 嗎?,下面這些問題你是否能回答上來呢?

本篇文章來詳細介紹什麼是 RAG?RAG 的流程以及 RAG 進階優化

乾貨滿滿,相信你看完文章之後會對 RAG 有更深入的理解。

RAG 介紹

RAG (Retrieval Augmented Generation) 是一種無需微調即可擴充模型知識的常用方法。 藉助 RAG,LLM 可以從數據庫中檢索上下文文檔,以提高答案的準確性。

因爲 LLM 大模型通過海量數據進行訓練,數據是有時效性的。如果詢問最新的文檔或者一些專業領域的知識,LLM 是無法回答的。所以 檢索增強生成 (RAG) 通過將你的數據添加到 LLM 已有的數據中來解決此問題。

RAG 解決了純生成模型的侷限性(如幻覺、知識過時等),通過動態檢索外部知識增強生成結果的可信度和時效性。

RAG 流程

典型的 RAG 流程分爲兩個部分:

  1. 構建向量存儲:創建向量存儲是構建檢索增強生成 (RAG) 流程的第一步。文檔會被加載(Load)、拆分(Split)、Embedding 存儲到向量數據庫中。

2. 檢索生成:根據用戶輸入用向量數據庫進行相似性搜索,讓後把用戶的 question 和搜索到的 context 作爲上下文餵給 LLM 大模型,LLM 分析推理回答用戶的問題。

我使用 LangGraph 構建了基本的 RAG 流程:

調用 Retrieval Tool 搜索相關文檔,然後 **GradeDocument **對文檔進行評分:對從向量數據庫檢索到的文檔進行評分: 如果檢索到的文檔與用戶輸入的內容相關,則 GenerateAnswer 生成答案返回,如果不相關,則 Rewrite 重新生成 query 進行檢索。

代碼已上傳 Github:

https://github.com/Liu-Shihao/ai-agent-demo/tree/main/src/rag_agent

進階 - RAG 優化

文檔 Chunking

大模型對話的 token 數量是有限制的,文檔切分是爲了將文檔切分爲小的文本塊,適合檢索並且節省 token。 切分的文本塊長度也會影響 LLM 回答的質量。

常見的切分文檔的方法:

  1. 固定長度切分(重疊分塊邊界)

    :按照字符或者 Token 數(如 512 個 token)切分。重疊分塊以避免邊界信息丟失。這種方式最簡單,但是有可能會截斷語義。

  2. 按照句子邊界

    (標點符號)分塊,例如使用 NLP 框架 SpaCy, 但是長段落可能語義斷裂。

  3. 自定義規則分割

    :用正則表達式或者 DOM 解析器(如 BeautifulSoup)按照邏輯結構(標題,段落)分塊。適合結構化文檔,但是需要手動設計分割規則。

  4. 基於語義的分塊

    : 用 Transformer 模型分析語義關係分塊。

優化原則:

相似性算法

在 RAG(檢索增強生成)和其他信息檢索任務中,相似性算法用於衡量文本、向量或實體之間的關聯程度。

  1. 歐氏距離(L2): 歐幾里得距離測量連接兩點的線段的長度(計算向量間的直線距離)。它是最常用的距離度量,當數據連續時非常有用。值越小,相似度越高。

  2. 餘弦相似度(COSINE): 餘弦相似度使用兩組向量之間夾角的餘弦來衡量它們的相似程度。餘弦相似度始終在 區間 [-1, 1] 內。餘弦值越大,兩個向量之間的夾角越小,表明這兩個向量彼此越相似。 適合文本 embedding 比較。

  3. BM25((Best Matching 25)):BM25 基於詞頻(TF) 和逆文檔頻率(IDF)。根據詞頻、倒排文檔頻率、文檔規範化對相關性進行評分。用於評估文檔與查詢的相關性。 廣泛應用於搜索引擎和問答系統。如 Elasticsearch 默認使用 BM25 排序。

  1. Jaccard相似度(Jaccard Index): 比較集合的交集與並集比例。適用場景:關鍵詞集合、推薦系統(如用戶興趣匹配)。範圍 [0,1],值越小,相似度越高。

RAG 中的典型應用

通過靈活組合這些算法,可以優化 RAG 系統的召回率、準確率和響應速度。

餘弦相似度(COSINE)的缺點

  1. 忽視向量長度信息:餘弦相似度僅計算向量方向的夾角,忽略向量的長度(模)。這意味着
  1. 語義相似度 ≠ 相關性: 餘弦相似度基於表面語義匹配。

    表面匹配,但相關文檔不一定語義相似: 如果兩個文本共享許多相同的關鍵詞(如 “貓”“狗”“寵物”),即使邏輯不同,餘弦相似度仍可能很高。 例如:

    文檔 1:“貓和狗是常見的寵物。”(正向描述)

    文檔 2:“貓和狗不適合作爲寵物。”(負向觀點)

    餘弦相似度高,但語義相反。

    詞序顛倒,但餘弦相似度相同。 示例:

    句子 A:“醫生治療病人。”

    句子 B:“病人治療醫生。”

解決方案:

Rerank 重排序

重排序(Reranking)是對初步檢索結果進行優化排序的技術,旨在提升結果的相關性和準確性。

初次檢索(如餘弦相似度)可能返回語義相關但冗餘或低質量片段,重排序可結合更多特徵優化順序。

方法:

Graph RAG

使用知識圖譜(Knowledge Graph, KG)增強 RAG(檢索增強生成)可以顯著提升複雜推理、多跳問答和關係挖掘的能力。 通過將文檔中的 實體(Entities) 和 關係(Relations) 提取爲知識圖譜,在檢索階段不僅返回文本片段,還返回相關的子圖結構,從而增強生成模型的上下文理解能力。

與傳統 RAG 的區別

kZr3VD

實現步驟:

  1. 實體識別(NER)

    使用 SpaCy NLP 模型或者 LLM 大模型進行命名實體提取,從文本中識別提取人名,地名,組織名,地點,日期等實體。

  2. 關係抽取

    可以利用 LLM 大模型抽取三元組 (〈主體 (Subject), 關係 (Predicate), 客體 (Object)〉)。

  3. 圖譜存儲

    將節點 Node 和關係 Relations 存儲到圖數據庫中,如 Neo4j。

三元組(Triple)是知識圖譜(Knowledge Graph)中的基本數據單元,用於表示實體(Entity)之間的關係(Relation),其結構爲:〈主體 (Subject), 關係 (Predicate), 客體 (Object)〉

通過知識圖譜的引入,RAG 系統能夠從 “平面檢索” 升級爲 “立體推理” ,尤其適合需要深挖實體關係的複雜場景。

RAG Evaluate 評估

對 RAG 的評估可以從以下兩個部分進行:

檢索質量

生成質量

RAG 有哪些缺點?

  1. 檢索的質量依賴外部數據庫:如果知識庫不完整,過時,或者噪聲多,檢索到的內容可能不相關或者錯誤,導致生成的答案質量下降。

    解決方案: 定期更新知識庫(實時爬取權威數據源)

  2. 分塊(Chunking)導致上下文碎片化:固定大小的分塊可能截斷關鍵信息。答案可能分散在多個 chunk 塊中。

    解決方案:動態分塊(按照語義邊界切分,如段落,章節 ·)

  3. 語義相關不等於答案相關: :向量檢索(如餘弦相似度)可能返回語義相關但無實際答案的文檔。(如查詢 “如何治療感冒?”,可能檢索到“感冒症狀描述” 而非治療方案)。

    解決方案: 引入重排序(Re-rank)模型(如交叉編碼器);混合檢索(結合關鍵詞檢索,如 BM25)。

  4. 生成模型忽視檢索內容:生成模型可能忽略檢索到的文檔,仍依賴自身知識(幻覺)。

    解決方案: 強化提示工程(如 “嚴格基於以下上下文回答”)。

  5. 無法處理多跳推理:傳統 RAG 難以回答需要多步推理的問題(如 “A 公司的競爭對手的 CEO 是誰?”)。

    解決方案: 引入知識圖譜(GraphRAG)顯式建模實體關係。

  6. RAG 流程時間長:檢索 + 生成兩階段流程導致響應時間較長(尤其涉及重排序時)。

    解決方案:緩存高頻查詢結果。

vSpxEP

引用

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/TsEJDHvfmMk8v-AfPX1oGw