RAG (Retrieval-Augmented Generation) 原理詳解與實例

核心概念:什么是 RAG?

在這里插入圖片描述

想象一下,你是一位專家,需要回答一個復雜的問題。你不會憑空編造答案,而是會:

  1. 檢索 (Retrieval):先去查閱相關的書籍、論文、報告或數據庫,找到最相關的信息片段。
  2. 理解與整合 (Comprehension & Integration):閱讀這些信息,理解其核心內容。
  3. 生成 (Generation):基于你檢索到的信息和你自身的專業知識,組織語言,生成一個準確、全面、連貫的回答。

RAG 就是讓大型語言模型 (LLM) 模擬這個過程。 它不是讓 LLM 單純依賴其訓練時學到的(可能過時或不完整的)知識來生成答案,而是在生成答案之前,先從一個外部知識庫中檢索出與當前問題最相關的信息,然后將這些信息作為上下文提供給 LLM,指導它生成更準確、更可靠、更具時效性的答案。

RAG 的核心原理與工作流程

RAG 系統通常包含兩個主要階段:

階段一:離線構建階段(知識庫準備)

這個階段是“打地基”,為后續的檢索做準備。

  1. 數據收集與預處理

    • 收集你需要模型能夠回答的問題相關的所有知識來源。這可以是:
      • 公司內部文檔(產品手冊、技術文檔、HR政策、銷售記錄)
      • 領域知識庫(醫學文獻、法律條文、學術論文)
      • 網頁內容(新聞、博客、論壇帖子)
      • 數據庫記錄
    • 對收集到的原始數據進行清洗(去除無關信息、格式錯誤)、分塊 (Chunking)分塊是關鍵步驟,因為 LLM 的上下文窗口長度有限,且小塊信息更容易精準匹配。例如,將一篇長文檔按段落、句子或語義單元分割成多個小塊。
  2. 文本嵌入 (Embedding)

    • 使用一個嵌入模型 (Embedding Model),如 text-embedding-ada-002 (OpenAI), BAAI/bge-large-en-v1.5, sentence-transformers/all-MiniLM-L6-v2 等。
    • 將每個文本塊(Chunk)轉換成一個向量 (Vector),也叫嵌入 (Embedding)。這個向量是一個由數字組成的列表(例如,長度為 768, 1536 等),它語義上代表了該文本塊的核心含義。
    • 核心思想:語義相似的文本塊,在向量空間中的位置(向量)會非常接近;語義不相關的文本塊,向量位置會相距較遠。(具體如何衡量“接近”,詳見附錄 A:余弦相似度)
  3. 構建向量數據庫 (Vector Database)

    • 將所有文本塊及其對應的向量存儲在一個專門的向量數據庫 (Vector Database) 中。常見的向量數據庫包括:
      • 開源/自托管: Chroma, FAISS, Weaviate, Qdrant, Milvus
      • 云服務: Pinecone, Azure Cognitive Search, Google Vertex AI Matching Engine
    • 這個數據庫建立了文本塊 -> 向量 以及 向量 -> 文本塊 的映射關系。它支持高效的相似性搜索,能快速找到與給定向量最相似的向量(及其對應的文本塊)。(在海量數據下,這種搜索通常使用“近似最近鄰”算法,詳見附錄 B:近似最近鄰)

離線階段總結: 我們將所有知識源處理成小塊,用嵌入模型把它們變成向量,存進向量數據庫。這個數據庫就像一個巨大的、按語義組織的“索引”。

階段二:在線推理階段(回答用戶問題)

當用戶提出一個問題時,RAG 系統開始工作:

  1. 用戶問題嵌入 (Query Embedding)

    • 用戶輸入一個問題,例如:“蘋果公司最新發布的 iPhone 型號是什么?它的主要創新點有哪些?”
    • 使用同一個嵌入模型,將這個問題也轉換成一個向量。
  2. 相似性檢索 (Similarity Search)

    • 將用戶問題的向量,輸入到向量數據庫中。
    • 向量數據庫執行相似性搜索,找到與問題向量最接近的 Top K 個(例如,Top 5)向量。
    • 數據庫返回這些最相似向量對應的原始文本塊。這些文本塊就是從知識庫中檢索到的、與用戶問題最相關的信息片段。
  3. 提示詞構建 (Prompt Construction)

    • 將檢索到的相關文本塊(作為上下文 Context)和用戶的原始問題組合成一個精心設計的提示詞 (Prompt)
    • 這個提示詞通常包含:
      • 指令 (Instruction):告訴 LLM 它的角色和任務(例如:“你是一個樂于助人的知識助手。請根據以下提供的背景信息,準確回答用戶的問題。”)。
      • 上下文 (Context):插入檢索到的 Top K 個文本塊(用分隔符分開,如 ---)。
      • 問題 (Ques

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/92765.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/92765.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/92765.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SOMGAN:利用自組織映射提高生成對抗網絡的模式探索能力

論文信息 論文題目:Improving mode exploring capability ofgenerative adversarial nets by self-organizing map(利用自組織映射提高生成對抗網絡的模式探索能力) 期刊:Neurocomputing 摘要:生成對抗網絡(GANs)的出…

全棧:如果SSM項目里的數據庫是mysql而自己使用的是SQLserver應該替換哪些文件?

將基于 SSM(Spring SpringMVC MyBatis)框架項目里的 MySQL 換成 SQL Server,主要需改動以下幾部分: 1. 依賴配置(pom.xml) 移除 MySQL 驅動依賴:找到原 MySQL 驅動相關依賴,一般類…

基于 Jenkins Pipeline 實現 DITA 文檔自動化構建與發布(開源方案)

這是我最近開發的一個基于 Jenkins Pipeline 的 DITA 文檔自動化構建方案。對于需要維護大量 DITA 格式文檔的團隊來說,手動構建不僅效率低下,還容易出現版本不一致的問題。通過這套開源方案,我們可以實現代碼拉取、多地圖并行構建、結果歸檔…

reinterpret_cast and static cast

什么時候使用 reinterpret_cast&#xff1f;指針類型之間的轉換&#xff1a; 當需要將一種類型的指針轉換為另一種類型的指針時&#xff0c;可以使用 reinterpret_cast。例如&#xff1a;int* intPtr new int(10); void* voidPtr reinterpret_cast<void*>(intPtr); // …

自動化運維 | 樂維8.0安裝及簡單使用

文章目錄1.創建虛擬機2.安裝樂維8.03.Web界面登錄訪問4.添加第一個監控在文章的開頭需要感謝樂維帶來這么好的自動化運維系統提供我們學習參考或是在生產環境中進行使用&#xff0c;并附上樂維官網供大家參考和學習&#xff1a;https://www.lwops.cn/1.創建虛擬機 在VMware wo…

無印良品:回歸本質的管理哲學

一、底層管理哲學 First, the underlying management philosophy核心思想&#xff1a;「無印」即「無品牌標識」&#xff0c;回歸產品本質Core idea: "Muji" means "no brand logo", returning to the essence of products.拒絕過度營銷&#xff0c;靠產品…

Redis面試精講 Day 13:Redis Cluster集群設計與原理

【Redis面試精講 Day 13】Redis Cluster集群設計與原理 開篇 歡迎來到"Redis面試精講"系列第13天&#xff0c;今天我們將深入探討Redis Cluster的集群設計與實現原理。作為Redis官方提供的分布式解決方案&#xff0c;Redis Cluster是面試中必問的高頻考點&#xff…

LangChain-Unstructured 基礎使用:PDF 與 Markdown 處理解析

文章目錄LangChain-Unstructured 基礎使用&#xff1a;PDF 與 Markdown 處理解析一、核心依賴與庫說明二、核心類與方法詳解1.UnstructuredLoader&#xff08;1&#xff09;類原型與核心功能&#xff08;2&#xff09;初始化參數詳解&#xff08;3&#xff09;核心方法詳解① l…

uboot使用指南

1.uboot的分類本節是 uboot 的使用&#xff0c;所以就直接使用正點原子已經移植好的 uboot&#xff0c;這個已經放到了開發板光盤中了&#xff0c;路徑為&#xff1a;開發板光盤->1、程序源碼->3、正點原子 Uboot 和 Linux 出廠源碼->uboot-imx-2016.03-2.1.0-ge468cd…

學習率預熱總結

學習率預熱是什么&#xff1f; 學習率預熱&#xff08;Learning Rate Warmup&#xff09; 是一種在深度學習訓練初期逐漸增加學習率的策略。其核心思想是&#xff1a;在訓練開始時使用較小的學習率&#xff0c;逐步增加到目標學習率&#xff0c;以避免模型參數在初始階段因學習…

初識SYSCFG(System Configuration Controller)寄存器映射

SYSCFG&#xff08;System Configuration Controller&#xff09;寄存器映射的詳細說明&#xff0c;以 STM32&#xff08;如 F1/F4/F7 系列&#xff09;為例。SYSCFG 控制器用于系統級配置&#xff0c;如外部中斷映射、存儲器重映射等。SYSCFG 寄存器映射概述 基地址&#xff1…

《P3403 跳樓機》

題目背景DJL 為了避免成為一只咸魚&#xff0c;來找 srwudi 學習壓代碼的技巧。題目描述Srwudi 的家是一幢 h 層的摩天大樓。由于前來學習的蒟蒻越來越多&#xff0c;srwudi 改造了一個跳樓機&#xff0c;使得訪客可以更方便的上樓。經過改造&#xff0c;srwudi 的跳樓機可以采…

【GPT-OSS 全面測評】釋放推理、部署和自主掌控的 AI 新紀元

目錄 一、背景與意義 二、核心參數對比 三、性能評測&#xff08;Benchmark&#xff09; 四、硬件適配與優化 五、安全性與風險 六、部署方式 七、適用場景 八、大型語言模型對比表&#xff08;2025 年 8 月版&#xff09; 總結 一、背景與意義 &#x1f4a1; 為什么…

醫療健康Agent:診斷輔助與患者管理的AI解決方案

醫療健康Agent&#xff1a;診斷輔助與患者管理的AI解決方案 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般絢爛的技術棧中&#xff0c;我是那個永不停歇的色彩收集者。 &#x1f98b; 每一個優化都是我培育的花朵&#xff0c;每一個特性都是我放…

python魔法屬性__doc__介紹

doc: 魔法屬性。類、函數的描述信息。 __doc__在python中類的使用方法&#xff1a; class Person(object):"""人類---類的描述信息""" # 只能使用多行注釋&#xff0c;單行注釋無效passprint(Person.__doc__)運行結果如圖所示&#xff1a;__d…

PostgreSQL 批量COPY導入優化參數配置

&#x1f4a1; 場景假設我們進行的是 頻繁批量導入、對數據持久性容忍較高 的場景&#xff0c;比如日志表、緩存表、臨時數據表等。如果系統崩潰可重導入&#xff0c;那我們就可以犧牲一點寫入安全性來換極致性能。?? 參數配置推薦&#xff08;postgresql.conf&#xff09;參…

BeanDefinition 與 Bean 生命周期(面試高頻考點)

Bean 是 Spring 應用的核心組件&#xff0c;而 BeanDefinition 作為 Bean 的 “元數據描述”&#xff0c;貫穿了 Bean 從定義到銷毀的全生命周期。理解 BeanDefinition 的加載注冊機制&#xff0c;以及 Bean 的完整生命周期&#xff0c;是掌握 Spring 容器管理邏輯的關鍵&#…

node.js 學習筆記2 進程/線程、fs

進程和線程 進程&#xff1a;進行中的程序。比如有一段程序&#xff0c;程序已經載入內存了&#xff0c;CPU正在執行這段程序&#xff0c;這時候就會產生一個進程。進程&#xff0c;也可以看做程序的一次執行過程。 在window中打開任務管理器&#xff0c;可以查看計算機中的所…

【線性代數】其他

上一節&#xff1a;【線性代數】線性方程組與矩陣——&#xff08;3&#xff09;線性方程組解的結構 總目錄&#xff1a;【線性代數】目錄 文章目錄11. 向量的內積、長度及正交性12. 方陣的特征值與特征向量13. 相似矩陣14. 對稱矩陣的對角化15. 二次型及其標準形11. 向量的內積…