一、從0開始:簡易RAG實現
在構建更復雜的 RAG 架構之前,我們先從最基礎的版本入手。整個流程可以分為以下幾個關鍵步驟:
1.數據導入:加載并預處理原始文本數據,為后續處理做好準備。
2.文本分塊:將長文本分割成較小的段落或句子,以提高檢索效率和相關性。
3.創建 Embedding:使用嵌入模型將文本塊轉換為向量表示,便于進行語義層面的比較與匹配。
4.語義搜索:根據用戶輸入的查詢內容,在已有向量庫中檢索出最相關的文本塊。
5.響應生成:基于檢索到的相關內容,結合語言模型生成最終的回答輸出。
二、基于語義的文本分塊
在 RAG中,文本分塊(Text Chunking)是一個至關重要的環節。其核心作用是將一大段連續文本劃分為多個具有語義完整性的較小段落,從而提升信息檢索的準確性和整體效果。
傳統的分塊方式通常采用固定長度的切分策略,例如每500個字符或每若干句子進行一次分割。這種方法雖然實現簡單,但在實際應用中容易割裂完整的語義單元,導致后續的信息檢索與理解受到影響。
相比之下,一種更智能的分塊方法是語義分塊(Semantic Chunking)。它不再依據字數或句數進行機械劃分,而是通過分析句子之間的內容相似性來判斷合適的切分位置。當檢測到前后句子在語義上出現明顯差異時,就在該位置斷開,形成一個新的語義段落。
切分點的判定方法
為了找到合適的語義切分點,我們可以借助以下幾種常見的統計方法:
1.百分位法(Percentile)找出所有相鄰句子之間語義相似度差異的“第 X 百分位數”,并在那些差異值超過該閾值的位置進行切分。
2.標準差法(Standard Deviation)當句子間的語義相似度下降幅度超過平均值減去 X 倍標準差時,在該位置進行切分。
3.四分位距法(IQR, Interquartile Range)利用上下四分位數之差(Q3 - Q1)來識別變化較大的位置,并將其作為潛在的切分點。
三、添加“塊標題”(Contextual Chunk Headers,CCH)
RAG 通過在生成回答之前從外部知識庫中檢索相關信息,從而提升語言模型的事實準確性。然而,在傳統的文本分塊方法中,往往會丟失重要的上下文信息,導致檢索效果不佳,甚至使模型生成脫離上下文的回答。
為了解決這個問題,我們引入了一種改進方法:上下文塊標題(Contextual Chunk Headers, 簡稱 CCH)。 這個方法的核心思想是: 在將文本分成小塊(chunk)時,將該段內容所屬的高級上下文信息(如文檔標題、章節標題等)一并加到每個文本塊的開頭,然后再進行嵌入和檢索。 這樣做可以讓每個文本塊都帶有其背景信息,幫助模型更好地理解它屬于哪個部分,從而提高檢索的相關性,并避免模型基于斷章取義的內容生成錯誤答案。
本方法中的步驟如下:
1.數據導入(Data Ingestion)加載并預處理原始文本數據。
2.帶上下文標題的分塊(Chunking with Contextual Headers)自動識別文檔中的章節標題,并將這些標題加到對應段落的前面,形成帶有上下文的文本塊。👉?例如:
# 第三章:人工智能的基本技術
人工智能的核心方法包括機器學習、深度學習和自然語言處理...
3.創建嵌入向量(Embedding Creation)將這些帶有上下文信息的文本塊轉換成數字形式(即嵌入向量),以便后續進行語義搜索。
4.語義搜索(Semantic Search)當用戶提出問題時,系統會基于這些增強后的文本塊,找到最相關的內容。
5.生成回答(Response Generation)使用大語言模型(如 Llama、ChatGLM 等)基于檢索結果生成自然、準確的回答。
6.評估效果(Evaluation)通過評分系統對 AI 的回答進行評估,檢查加入上下文標題后是否提升了回答的準確性和相關性。
四、Query改寫
實現了三種查詢轉換(Query Transformation),以提升檢索增強生成(RAG)系統的信息檢索效果。
核心目標:
通過修改或擴展用戶的原始查詢,幫助系統更準確地理解用戶意圖,并從向量庫中找到更相關的信息。
三大查詢轉換技巧
1. 查詢重寫(Query Rewriting)
將用戶的問題變得更具體、更詳細,從而提高檢索的精準度。
🔹 示例:
-
用戶原問題:“AI 是什么?”
-
重寫后的問題:“人工智能的定義及其核心技術有哪些?”
? 提升點:讓搜索更精確,避免過于寬泛的結果。
2. 回退提問(Step-back Prompting)
生成一個更廣泛、更高層次的問題,用于獲取更多背景信息,幫助系統更好地理解上下文。
🔹 示例:
-
用戶原問題:“深度學習在醫療領域有哪些應用?”
-
回退問題:“人工智能在醫療行業的應用有哪些?”
? 提升點:有助于找到與問題相關但不直接匹配的重要背景知識。
3. 子查詢拆解(Sub-query Decomposition)
將一個復雜的問題拆分成多個更簡單的小問題,分別進行檢索,最后綜合所有結果,提供更全面的回答。
🔹 示例:
-
用戶原問題:“比較機器學習和深度學習的優缺點及應用場景。”
-
拆解為:
-
“什么是機器學習?”
-
“什么是深度學習?”
-
“機器學習有哪些優缺點?”
-
“深度學習有哪些優缺點?”
-
“它們各自適用于哪些場景?”
? 提升點:確保覆蓋問題的所有方面,避免遺漏關鍵信息。
ref :RAG技巧與底層代碼剖析