RAG 技術全解析:從基礎原理到優化實戰
你瞭解 RAG 嗎?,下面這些問題你是否能回答上來呢?
-
什麼是 RAG(RAG 的流程是什麼),爲什麼需要 RAG?
-
如何對文檔分塊(Chunking)?分塊大小如何選擇?
-
檢索時如何計算相似度?餘弦相似度有什麼缺點?
-
如何優化 RAG 流程?
-
什麼是 Re-rank?如何重排序?
-
什麼是 GraphRAG?
-
如何評估 RAG 系統的效果?
-
RAG 有哪些缺點?
本篇文章來詳細介紹什麼是 RAG?RAG 的流程以及 RAG 進階優化
乾貨滿滿,相信你看完文章之後會對 RAG 有更深入的理解。
RAG 介紹
RAG
(Retrieval Augmented Generation) 是一種無需微調即可擴充模型知識的常用方法。 藉助 RAG,LLM 可以從數據庫中檢索上下文文檔,以提高答案的準確性。
因爲 LLM 大模型通過海量數據進行訓練,數據是有時效性的。如果詢問最新的文檔或者一些專業領域的知識,LLM 是無法回答的。所以 檢索增強生成 (RAG) 通過將你的數據添加到 LLM 已有的數據中來解決此問題。
RAG 解決了純生成模型的侷限性(如幻覺、知識過時等),通過動態檢索外部知識增強生成結果的可信度和時效性。
RAG 流程
典型的 RAG 流程分爲兩個部分:
構建向量存儲
:創建向量存儲是構建檢索增強生成 (RAG) 流程的第一步。文檔會被加載(Load)、拆分(Split)、Embedding 存儲到向量數據庫中。
-
加載文檔 Load
加載各種非結構化的數據,例如:TXT 文本、PDF、JSON,HTML、Markdown 等。Langchain 封裝了各種格式的 DocumentLoaders 文檔加載器 。
-
切分文本 Split
將文本切分成更小的文本塊(Chunk)。
-
轉化向量 Embedding
使用 Embedding 模型將文本轉換爲向量(浮點數數組)表示
-
向量數據庫 VectorStore :存儲 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 回答的質量。
常見的切分文檔的方法:
-
固定長度切分(重疊分塊邊界)
:按照字符或者 Token 數(如 512 個 token)切分。重疊分塊以避免邊界信息丟失。這種方式最簡單,但是有可能會截斷語義。
-
按照句子邊界
(標點符號)分塊,例如使用 NLP 框架
SpaCy
, 但是長段落可能語義斷裂。 -
自定義規則分割
:用正則表達式或者 DOM 解析器(如 BeautifulSoup)按照邏輯結構(標題,段落)分塊。適合結構化文檔,但是需要手動設計分割規則。
-
基於語義的分塊
: 用 Transformer 模型分析語義關係分塊。
優化原則:
-
chunk 塊大小需要匹配 embedding 模型和 llm 大模型的 tokne 限制。
-
關鍵信息(實體,關係)儘量保留在同一塊中。
相似性算法
在 RAG(檢索增強生成)和其他信息檢索任務中,相似性算法用於衡量文本、向量或實體之間的關聯程度。
-
歐氏距離(L2)
: 歐幾里得距離測量連接兩點的線段的長度(計算向量間的直線距離)。它是最常用的距離度量,當數據連續時非常有用。值越小,相似度越高。 -
餘弦相似度(COSINE)
: 餘弦相似度使用兩組向量之間夾角的餘弦來衡量它們的相似程度。餘弦相似度始終在 區間 [-1, 1] 內。餘弦值越大,兩個向量之間的夾角越小,表明這兩個向量彼此越相似。 適合文本 embedding 比較。 -
BM25((Best Matching 25))
:BM25 基於詞頻(TF) 和逆文檔頻率(IDF)。根據詞頻、倒排文檔頻率、文檔規範化對相關性進行評分。用於評估文檔與查詢的相關性。 廣泛應用於搜索引擎和問答系統。如 Elasticsearch 默認使用 BM25 排序。
-
詞頻(TF)
:衡量查詢詞在文檔中的出現頻率,但通過參數 k1 控制詞頻的飽和效應,避免高頻詞過度影響得分。
-
逆文檔頻率(IDF)
:懲罰常見詞(如 “的”“是”),提升罕見詞的權重。反映某個術語在整個語料庫中的重要性。出現在較少文檔中的術語的 IDF 值較高,表明其對相關性的貢獻較大。
-
**文檔長度歸一化 **
:較長的文檔由於包含更多術語,往往得分更高。BM25 通過歸一化文檔長度來緩解這種偏差。通過參數調整長文檔的得分,避免因文檔長度導致的詞頻偏差。
Jaccard相似度(Jaccard Index)
: 比較集合的交集與並集比例。適用場景:關鍵詞集合、推薦系統(如用戶興趣匹配)。範圍 [0,1],值越小,相似度越高。
RAG 中的典型應用
-
初步檢索:餘弦相似度(快速篩選候選文檔)。
-
重排序:交叉編碼器(精細排序 Top-K 結果)。
-
去重:Jaccard 相似度(合併重複片段)。
通過靈活組合這些算法,可以優化 RAG 系統的召回率、準確率和響應速度。
餘弦相似度(COSINE)的缺點
- 忽視向量長度信息:餘弦相似度僅計算向量方向的夾角,忽略向量的長度(模)。這意味着
-
高頻詞幹擾:TF-IDF 或詞頻高的長文本可能主導方向,但實際語義不相關。會放大無關詞的影響。
-
歸一化依賴:未歸一化的向量可能導致相似度計算偏差。長文本包含更多詞彙,其向量各維度值累加後長度(模)顯著大於短文本。
-
語義相似度 ≠ 相關性: 餘弦相似度基於表面語義匹配。
表面匹配,但相關文檔不一定語義相似: 如果兩個文本共享許多相同的關鍵詞(如 “貓”“狗”“寵物”),即使邏輯不同,餘弦相似度仍可能很高。 例如:
文檔 1:“貓和狗是常見的寵物。”(正向描述)
文檔 2:“貓和狗不適合作爲寵物。”(負向觀點)
餘弦相似度高,但語義相反。
詞序顛倒,但餘弦相似度相同。 示例:
句子 A:“醫生治療病人。”
句子 B:“病人治療醫生。”
解決方案:
-
向量歸一化:強制所有向量的單位長度(如 L2 歸一化)。
-
結合其他指標:如點積相似度(考慮長度)或 BM25(詞頻加權)。
-
重排序(Re-rank):用交叉編碼器(如 MiniLM)精細化排序。
-
混合檢索:結合關鍵詞匹配(BM25)或知識圖譜關係。
Rerank 重排序
重排序(Reranking)是對初步檢索結果進行優化排序的技術,旨在提升結果的相關性和準確性。
初次檢索(如餘弦相似度)可能返回語義相關但冗餘或低質量片段,重排序可結合更多特徵優化順序。
方法:
-
交叉編碼器(Cross-Encoder):如 MiniLM-L6-v2,計算查詢與每個文檔的相關性分數(比嵌入模型更準但更慢)。
-
學習排序(Learning to Rank):訓練模型綜合多特徵(如關鍵詞匹配、點擊率)排序。
-
規則調整:去除重複內容、優先新鮮度高的文檔。
Graph RAG
使用知識圖譜(Knowledge Graph, KG)增強 RAG(檢索增強生成)可以顯著提升複雜推理、多跳問答和關係挖掘的能力。 通過將文檔中的 實體(Entities) 和 關係(Relations) 提取爲知識圖譜,在檢索階段不僅返回文本片段,還返回相關的子圖結構,從而增強生成模型的上下文理解能力。
與傳統 RAG 的區別:
實現步驟:
-
實體識別(NER)
使用 SpaCy NLP 模型或者 LLM 大模型進行命名實體提取,從文本中識別提取人名,地名,組織名,地點,日期等實體。
-
關係抽取
可以利用 LLM 大模型抽取三元組 (〈主體 (Subject), 關係 (Predicate), 客體 (Object)〉)。
-
圖譜存儲
將節點 Node 和關係 Relations 存儲到圖數據庫中,如 Neo4j。
三元組(Triple)是知識圖譜(Knowledge Graph)中的基本數據單元,用於表示實體(Entity)之間的關係(Relation),其結構爲:〈主體 (Subject), 關係 (Predicate), 客體 (Object)〉
通過知識圖譜的引入,RAG 系統能夠從 “平面檢索” 升級爲 “立體推理” ,尤其適合需要深挖實體關係的複雜場景。
RAG Evaluate 評估
對 RAG 的評估可以從以下兩個部分進行:
檢索質量
-
上下文準確率(Context Precision):是衡量上下文中相關詞塊比例的指標。準確率是排名爲 k 的相關詞塊數量與排名爲 k 的詞塊總數之比。
-
上下文召回率(Context Recall):前 K 個結果中相關文檔的比例。衡量成功檢索到的相關文檔(或信息片段)數量。更高的召回率意味着遺漏的相關文檔更少。
生成質量
-
答案相關度 Response Relevancy:生成答案與問題的契合度。衡量答案與用戶輸入的相關性。分數越高,表示與用戶輸入的匹配度越高;如果生成答案不完整或包含冗餘信息,則分數越低。
-
忠誠度 Faithfulness:衡量的是 答案 與 檢索內容 的事實一致性。答案是否嚴格基於檢索內容,減少幻覺。
RAG 有哪些缺點?
-
檢索的質量依賴外部數據庫:如果知識庫不完整,過時,或者噪聲多,檢索到的內容可能不相關或者錯誤,導致生成的答案質量下降。
解決方案: 定期更新知識庫(實時爬取權威數據源)
-
分塊(Chunking)導致上下文碎片化:固定大小的分塊可能截斷關鍵信息。答案可能分散在多個 chunk 塊中。
解決方案:動態分塊(按照語義邊界切分,如段落,章節 ·)
-
語義相關不等於答案相關: :向量檢索(如餘弦相似度)可能返回語義相關但無實際答案的文檔。(如查詢 “如何治療感冒?”,可能檢索到“感冒症狀描述” 而非治療方案)。
解決方案: 引入重排序(Re-rank)模型(如交叉編碼器);混合檢索(結合關鍵詞檢索,如 BM25)。
-
生成模型忽視檢索內容:生成模型可能忽略檢索到的文檔,仍依賴自身知識(幻覺)。
解決方案: 強化提示工程(如 “嚴格基於以下上下文回答”)。
-
無法處理多跳推理:傳統 RAG 難以回答需要多步推理的問題(如 “A 公司的競爭對手的 CEO 是誰?”)。
解決方案: 引入知識圖譜(GraphRAG)顯式建模實體關係。
-
RAG 流程時間長:檢索 + 生成兩階段流程導致響應時間較長(尤其涉及重排序時)。
解決方案:緩存高頻查詢結果。
引用
- https://docs.llamaindex.ai/en/stable/understanding/rag/
- https://github.com/mlabonne/llm-course
- https://milvus.io/docs/metric.md
- https://docs.ragas.io/en/stable/concepts/metrics/available_metrics/context_precision/
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/TsEJDHvfmMk8v-AfPX1oGw