一文搞懂 RAG
一、 RAG 有什麼用
RAG 可以解決通用大模型存在的問題
通用的基礎大模型的侷限性
知識的侷限性
- 模型自身的知識完全源於它的訓練資料,而現有的主流大模型如 ChatGPT,文心一言等的訓練集基本都是構建於網路公開的資料,對於一些實時性的,非公開的或離線的資料是無法獲取到的,這部分知識也就無從具備。
- 規模越大(引數越多,tokens 越多),大模型訓練的成本越高,比如幫我看看今天晚上有什麼電影值得去看,這種任務是需要去淘票票、貓眼等網站先獲取最新電影資訊的,大模型本身無法完成這個任務
幻覺問題
- 所有的 AI 模型的底層原理都是基於數學機率,其模型輸出實質上是一系列數值運算,大模型也不例外,所以它有時候會一本正經胡說八道,尤其是在大模型自身不具備某一方面的知識或不擅長的場景。而這種幻覺問題的區分是比較困難的,因為它要求使用者自身具備相應領域的知識
- 大模型的底層原理是基於機率,在沒有答案的情況下經常會胡說八道,提供虛假資訊
資料安全性
- 對於企業來說,資料安全至關重要,沒有企業願意承擔資料洩漏的風險,將自身的私域資料上傳第三方平臺進行訓練,這也導致完全依賴通用大模型自身能力的應用方案不得不在資料安全和效果方面進行取捨
- openAI 已經遭遇過幾次隱私資料的投訴,對於企業來說,如果把自己的經營資料、合同檔案等機密檔案和資料上傳到網際網路上的大模型,那想想都可怕。既要保證安全,又要藉助 AI 能力,那麼最好的方式就是把資料全部放在本地,企業資料的業務計算全部在本地完成。而線上的大模型僅僅完成一個歸納的功能,甚至,LLM 都可以完全本地化部署。
二、 RAG 是什麼
概念
- RAG(Retrieval-Augemented Generation)檢索增強生成
- RAG 是一種 AI 框架,它將傳統資訊檢索系統(例如資料庫或私域資料)的優勢與生成式大語言模型 LLM 的功能結合在一起,LLM 透過將這些額外的知識與自己的語言技能相結合,可以得到更準確、更具時效性且更貼合具體需求的回答
檢索
- 檢索是 RAG 流程的第一步,從預先建立的知識庫中檢索與問題相關的資訊。這一步的目的是為後續的生成過程提供有用的上下文資訊和知識支撐
增強
- RAG 中增強是將檢索到的資訊用作生成模型(即大語言模型)的上下文輸入,以增強模型對特定問題的理解和回答能力。這一步的目的是將外部知識融入生成過程中,使生成的文字內容更加豐富、準確和符合使用者需求。透過增強步驟,LLM 模型能夠充分利用外部知識庫中的資訊
生成
- 生成是 RAG 流程的最後一步。這一步的目的是結合 LLM 生成符合使用者需求的回答。生成器會利用檢索到的資訊作為上下文輸入,並結合大語言模型來生成文字內容
三、 RAG 的工作原理
建立外部資料
- LLM 原始訓練資料集之外的新資料稱為外部資料。
- 它可以來自多個資料來源,例如 API、資料庫或文件儲存庫。資料可能以各種格式存在,例如檔案、資料庫記錄或長篇文字。
- 另一種稱為嵌入語言模型的 AI 技術將資料轉換為數字表示形式並將其儲存在向量資料庫中。這個過程會建立一個生成式人工智慧模型可以理解的知識庫。
檢索相關資訊
- 下一步是執行相關性搜尋。使用者查詢將轉換為向量表示形式,並與向量資料庫匹配。
- 例如,考慮一個可以回答組織的人力資源問題的智慧聊天機器人。如果員工搜尋:“我有多少年假?”,系統將檢索年假政策檔案以及員工個人過去的休假記錄。這些特定檔案將被退回,因為它們與員工輸入的內容高度相關。相關性是使用數學向量計算和表示法計算和建立的
增強 LLM 提示
- 接下來,RAG 模型透過在上下文中新增檢索到的相關資料來增強使用者輸入(或提示)。此步驟使用提示工程技術與 LLM 進行有效溝通。增強提示允許大型語言模型為使用者查詢生成準確的答案
更新外部資料
- 下一個問題可能是——如果外部資料過時了怎麼辦? 要維護當前資訊以供檢索,請非同步更新文件並更新文件的嵌入表示形式。您可以透過自動化實時流程或定期批處理來執行此操作。這是資料分析中常見的挑戰——可以使用不同的資料科學方法進行變更管理
四、 RAG 的工作流程
資料準備
資料提取
資料載入
- 將外部資料進行清理和提取,將 csv、pdf、html、word、markdown,甚至是圖片和影片等不同格式的檔案轉換成純文字
- 包括多格式資料載入、不同資料來源獲取等,根據資料自身情況,將資料處理為同一個正規化
- 使用專門的文件載入器例如 PDF 提取器或多模態模型如 OCR 技術,將這些豐富的知識源轉換為大語言模型可理解的純文字資料,對於圖片和影片,OCR 技術能夠識別並轉換其中的文字資訊
- 這裡可以藉助 langchain 內建的載入器來實現
資料處理
- 包括資料過濾、壓縮、格式化等
後設資料獲取
- 提取資料中關鍵資訊,例如檔名、Title、時間等
文字分割
分割原因
- 鑑於文件可能存在過長的問題,還需要進行一項關鍵步驟:文件切片,需要將長篇文件分割成多個文字塊,以便更高效地處理和檢索資訊
- 文字分割主要考慮兩個因素,embedding 模型的 Tokens 限制情況、語義完整性對整體的檢索效果的影響
分割方法
- 句分割:以句為粒度進行切分,保留一個句子的完整語義,常用切分符包括:句號、感嘆號、問號、換行符等
- 固定長度分割:根據 enbedding 模型的 token 長度限制,將文字分割為固定長度(例如 256/512 個 tokens),這種切分方式損失很多語義資訊,一般透過在頭尾增加一定冗餘量來緩解。只需要決定塊中的標記數量,以及可選地確定它們之間是否應該有重疊,它的計算成本低且易於使用,因為它不需要使用任何 NLP 庫。chunk size 塊大小,overlap size 重疊大小
- NLP 工具分塊:例如藉助 spaCy,它是一個用於 NLP 任務的強大 python 庫,它提供了複雜的句子分割功能,可以有效地將文字分割成單獨的句子,從而在生成的塊中更好地保留上下文,幫助建立更有意義的塊
- 遞迴分塊:使用一組分隔符以分層和迭代的方式輸入文字劃分為更小的塊,
向量化
簡要介紹
- 向量化是一個將文字資料轉化為向量矩陣的過程,該過程會直接影響到後續檢索的效果。目前常見的 embedding 模型如圖,這些 embedding 模型基本能滿足大部分需求,但對於特殊場景(例如涉及一些罕見專有詞或字等)或者想進一步最佳化效果,則可以選擇開源 Embedding 模型微調或直接訓練適合自己場景的 embedding 模型
為什麼要做嵌入
- 我們使用的日常語言中充滿歧義和對錶達詞意無用的助詞,而向量表示則更加密集、精確,能夠捕捉到句子的上下文關係和核心含義。這些轉換使得我們能夠透過簡單計算向量之間的差異來識別語義上相似的句子
什麼是文字嵌入
- 嵌入也叫向量化,就是將文字內容透過 embedding 嵌入模型轉化為多維向量的過程
- 雖然計算機並不能理解自然語言,但是藉助 LLM 技術的一個關鍵部分是翻譯器,它可以從人類文字語言翻譯成人工智慧數字語言。我們稱這種翻譯機為嵌入機,它輸入人類語言,輸出人工智慧理解的數字語言
- 嵌入模型的核心任務是將文字轉換為向量形式
建立索引
- 完成嵌入之後,下一步是建立索引,將原始語料塊和嵌入以鍵值對形式儲存,以便於未來進行快速且頻繁的搜尋。使用專業的向量資料庫進行儲存向量資料,常用的向量資料庫有 Chroma、FAISS、ES 等
資料入庫
簡要介紹
- 資料向量化後構建索引,並寫入資料庫的過程可以概述為資料入庫過程,適用於 RAG 場景的資料庫包括:FAISS、Chromadb、ES、milvus 等。一般可以根據業務場景、硬體、效能需求等多因素綜合考慮、選擇合適的資料庫
儲存方式
- 向量資料庫是專門設計用於儲存和檢索向量資料的資料庫系統
- 在 RAG 系統中,透過嵌入模型生成的所有向量都會被儲存在這樣的資料庫中
- 這種資料庫最佳化了處理和儲存大規模向量資料的效率,使得在面對海量知識向量時,我們能夠迅速檢索出和使用者查詢最相關的資訊
應用階段
資料檢索
簡要介紹
- 資料檢索是 RAG 框架中的重要組成部分,目標是根據使用者的查詢,快速檢索到與之最相關的知識,並將其融入提示 prompt 中
檢索步驟
- 根據使用者的輸入,採用與索引建立相同的編碼模型將查詢內容轉換為向量
- 系統會計算問題向量與語料庫中文件塊向量之間的相似性,並根據相似度水平選出最相關的前 K 個文件塊作為當前問題的補充背景資訊
檢索方法
- 相似性檢索:即計算查詢向量與所有儲存向量的相似性得分,返回得分高的記錄。常見的相似性檢索方法包括:餘弦相似性、歐式距離、曼哈頓距離等
- 全文檢索:全文檢索是一種比較經典的檢索方式,在資料存入時,透過關鍵詞構建倒排索引;在檢索時,透過關鍵詞進行全文檢索,找到對應的記錄
注入 prompt
簡要介紹
- prompt 作為大模型的直接輸入,是影響模型輸出準確率的關鍵因素之一。在 RAG 場景中,prompt 一般包括任務描述、背景知識(檢索得到),任務指令(一般是使用者提問)等,根據任務場景和大模型效能,也可以在 prompt 中適當加入其他指令最佳化大模型的輸出
舉例說明
- 一個簡單知識問答場景的 prompt 如下所示
- 任務描述:假如你是一個專業的客服機器人,請參考【背景知識】,
- 背景知識:{content} // 資料檢索得到的相關文字
- 問題:石頭掃地機器人 p10 的續航時間是多久
- prompt 的設計只有方法,沒有語法,比較依賴於個人經驗,在實際應用過程中,往往需要根據大模型的實際輸出進行針對性的 prompt 調優
生成
簡要介紹
- 是指將使用者的問題與知識庫被檢索出的文字塊相結合,用 prompt 的形式傳遞給大語言模型的上下文,使大模型更好理解使用者意圖,生成使用者想要的結果
五、 RAG 的體系結構
簡要介紹
- RAG 系統的體系結構由兩個主要模組和一個融合機制組成,它們協同工作,生成準確且上下文相關的輸出。RAG 模組可以進行端到端訓練,使演算法能夠聯合最佳化檢索和生成,從而生成更有依據、更可靠的結果
檢索器模組
- 檢索器模組可在大型資料集中進行搜尋,以查詢與查詢最相關的資訊片段
生成器模組
- 檢索完成後,生成器模組會將檢索到的資訊作為額外的上下文,生成一致且相關的回覆。通常,生成器模組是預先訓練好的語言模型,如生成式預訓練轉換器 (GPT) 或雙向自迴歸轉換器 (BART),這種模型經過微調後可以根據輸入和檢索到的資訊生成文字
融合機制
- 融合機制可確保在生成過程中有效結合檢索到的資訊。透過模組之間的這種互動,RAG 系統能夠以檢索到的知識為基礎進行生成,從而生成更有依據、更可靠的內容。
六、 RAG 的型別
開放域問題解答
- 用例:RAG 在 ODQA 系統中非常有效,使用者幾乎可以就任何主題提出問題。
- 示例:客戶支援聊天機器人使用 RAG 從大型知識庫或常見問題解答中檢索資訊,從而提供準確的答案。
特定領域的專用查詢
- 用例:對於法律行業而言,RAG 可以透過檢索相關文件,協助分析和生成案例法、判例和法規的摘要。
- 示例:法律助理工具可為特定目的檢索和彙總文件。
內容摘要
- 用例:透過檢索相關資訊並將其整合到生成的文字中,RAG 可以幫助生成高質量的內容,如虛擬助理的會議記錄,或文章、報告或部落格文章的摘要。
- 示例:記者使用 RAG 從各種來源獲取關鍵詳細資訊,生成近期新聞文章的摘要。
個性化推薦
- 用例:RAG 可以透過檢索特定於使用者的資訊並生成個性化建議來增強推薦系統。
- 示例:電子商務平臺使用 RAG 根據使用者的瀏覽歷史記錄和偏好推薦產品,並提供根據相關產品評論或描述生成的說明。
複雜場景分析和內容製作
- 用例:混合 RAG 模型可以透過從多個複雜源檢索相關資料、文件或新聞,用於生成併合成詳細的報告或分析。
- 示例:財務分析工具透過檢索和彙總最近的市場趨勢、歷史財務資料、股票表現、專家評論和經濟指標來生成投資預測、分析或報告。
研究資訊和合成
- 用例:研究人員可以使用 RAG 檢索併合成學術論文、報告或資料庫中的資訊,從而簡化審查過程並促進研究專案的進行。
- 示例:學術工具透過從各種研究中提取關鍵發現來生成相關研究論文的摘要。
多語言和跨語言應用
- 用例:RAG 可以在多語言環境中部署,以檢索不同語言的資訊並生成跨語言內容。
- 示例:翻譯工具在翻譯文字的同時也會檢索與文化相關的資訊,以確保翻譯在上下文中是恰當的。
參考
https://zhuanlan.zhihu.com/p/668082024
https://blog.csdn.net/m0_70486148/article/details/144883208
https://cloud.tencent.com/developer/article/2373282
https://aws.amazon.com/cn/what-is/retrieval-augmented-generation/
https://blog.csdn.net/2401_82452722/article/details/135934144
https://azure.microsoft.com/zh-cn/resources/cloud-computing-dictionary/what-is-retrieval-augmented-generation-rag
相關文章
- 一文搞懂 DevOpsdev
- 一文搞懂補碼
- 一文搞懂Zookeeper原理
- Flutter | 一文搞懂 BuildContextFlutterUIContext
- 一文搞懂字典樹
- 一文搞懂佇列佇列
- 一文搞懂RESTful APIRESTAPI
- 【DeepSeek】一文搞懂 deepseek
- 一文徹底搞懂BERT
- 一文搞懂 ARM 64: AUTIBSP
- 一文搞懂 MySQL 日誌MySql
- 一文帶你搞懂 SSR
- 一文帶你搞懂RPCRPC
- 一文搞懂 this、apply、call、bindAPP
- 一文搞懂 ARM 64 系列: ADCS
- 一文搞懂雙連結串列
- 一文搞懂Cookie,Session,Token,JWTCookieSessionJWT
- 一文搞懂 Cookie,Session,Token,JWTCookieSessionJWT
- 一文搞懂 ARM 64 系列: PACISB
- 一文搞懂直方圖均衡直方圖
- 一文搞懂動態規劃動態規劃
- 一文搞懂String的replace用法
- 一文搞懂 CGI, FastCGI, WSGI, uWSGI, uwsgiAST
- 棧和括號匹配,一文搞懂
- 一文搞懂 OTP 雙因素認證
- [轉帖]一文搞懂LSM-Tree
- 一文搞懂 Java8 reduce操作Java
- 一文搞懂得物前端監控前端
- 一文搞懂JavaScript陣列的特性JavaScript陣列
- 一文搞懂 Prometheus 的直方圖Prometheus直方圖
- 一文搞懂Java隨機數生成Java隨機
- 一文搞懂到底什麼是 AQSAQS
- 一文搞懂Go語言的pluginGoPlugin
- 一文搞懂js中的typeof用法JS
- 一文搞懂影片編解碼原理
- 瀏覽器渲染原理(一文搞懂)瀏覽器
- 一文搞懂MySQL體系架構!!MySql架構
- Java 基礎 一文搞懂泛型Java泛型