Skip to main content

AI 基礎知識

RAG 檢索增強生成:讓 AI 先找資料再回答

RAG 是什麼?為什麼它是提升 AI 回答品質的核心方法?從檢索、增強、生成三步驟,到資料怎麼準備、問題怎麼問、結果怎麼排序,非工程師也能看懂。

—Kevin Wu

RAG 是一種將「找資料」與「寫回答」結合的生成方式,全名為 Retrieval-Augmented Generation(檢索增強生成)。這類系統在回答問題時,會經過三個關鍵步驟:

  • 檢索(Retrieval):
    模型收到你的提問後,會先到指定的資料庫(如企業內部文件、FAQ、知識庫)中尋找最相關的資訊片段。
  • 增強(Augmentation):
    找到的資訊會與你的原始提問一起組成新的上下文,變成語言模型的輸入,也就是「幫它補上它本來不知道的資訊」。
  • 生成(Generation):
    最後再由語言模型根據這些補充過的上下文,來生成最終回答。

這種方式的好處是:

不需要重新訓練模型(如 Fine-tuning),卻能做到針對性更強的回應,也能即時更新知識、控制資訊來源。

RAG 流程:檢索、增強、生成

雖然 ChatGPT 本身已經具備一定的 RAG 概念(像是文件引用或上網搜尋),但如果希望回答內容更精準、更可信、更符合任務需求,通常會進一步搭配其他模型來分工協作,並細化每個步驟中的參數與行為邏輯,建構屬於 AI 自己的工作流程。

例如,一個完整的 RAG 架構可以長這樣:

  1. 使用者提問
    使用自然語言輸入一個問題。
  2. 向量化(Embedding)
    將提問轉換成向量,由專門的**內嵌模型(Embedding Model)**負責,把文字轉換為可比較的數字特徵格式。
  3. 資料檢索(Retrieval)
    使用轉換後的向量,在**向量資料庫(Vector Database)**中比對出前 N 筆最相似的內容。
  4. 排序強化(Re-ranking)
    對這些相似內容進行第二層排序,可能依據語意深度、來源可信度、任務適配性等,由重排序模型(Rerank Model)來判斷哪些資料應該優先被放入上下文。
  5. 上下文補強(Augmentation)
    根據排序結果選定最有價值的幾筆資料,組合成補充上下文。
  6. 回答生成(Generation)
    將補強後的上下文與原始問題一併餵給大型語言模型(LLM),進行回答生成。

透過這樣的細緻流程,每一個環節都可以獨立優化,從向量模型的選擇、資料庫建構邏輯、排序策略、生成模型,每一層都會影響最終回答的品質。

增強向量化(Vectorization)的品質

不論是「使用者的提問」或是 RAG 所利用的「資料庫內容」,都需要轉換成向量,才能讓模型進行比對並產生回答。因此,

讓文字被更準確地轉換為向量,是決定回答品質的第一步。

而想要做好向量化,會有兩個關鍵重點:

  1. 讓內容本身更適合轉換成向量
  2. 使用更強的向量轉換工具(也就是 Embedding 模型)

對大多數人來說,第二項比較難改變——我們能做的,主要是選擇一個品質較高、較適合我們內容的 Embedding 模型(如 OpenAI、Cohere、BGE 等),但選擇本身仍需經過測試與驗證。

而第一項,「如何準備內容」,則是每個人都能主動做好的點。

在〈聽說GPT很強,為什麼別人用起來感覺比較好?〉提到:「要讓 AI 更好的回答問題,打字要打完整,並用常使用的語句,不然容易預測錯誤(拆字拆錯)」

上述只是一個簡化的概念,要能更好的進行向量化,還有很多種方式,例如:

項目 建議做法 說明
資料格式 避免 PDF,改用 Markdown、純文字、JSON PDF 雖然好閱讀,但需要進行辨識、重新分段,常導致模型誤讀。
Markdown、JSON 等資料型態,層級清晰,更容易形成語意一致的段落向量。
(其他常見資料型態:docx、txt、xlsx…等都是)
文字分段 每一段文字控制在 300~500 tokens 左右,並語意連貫、不要硬切句 分段太長會讓模型無法聚焦,太短又缺乏足夠訊息,亂切則容易讓回答跑偏。
適當的進行文字分段,會讓模型理解品質更好。
層級分類 使用標題、子標題…等,或是把同一類別的資料集中在同一份文檔、文字區域 段落上下文會影響語意建構,明確的層級與組織能幫助模型建立更準確的語意分層。
例如 Word 文件裡面就有分段的工具,Markdown 則是用「#」來表示大小標題。
統一語言、標準詞彙 統一用詞(如:「會員登入」不要有「使用者登入」「登入平台」混用),甚至建立特殊名詞的一覽表 向量是語意空間的表示。
不同詞會被分配不同向量,用詞混亂會讓相似內容無法正確比對。
統一用詞並搭配適當的詞彙說明,會讓品質更好。
資料清洗 移除空白欄位、多餘格式、極端值或與任務無關的段落 噪音太多會干擾語意建構,讓重要內容在向量空間中被「稀釋」或「偏移」。

檢索 Retrieval:讓 AI 找到對的資料

RAG 中的「檢索」階段,是指系統根據使用者的提問,從資料庫中找出最相關的段落,放進語言模型的上下文中作為回答依據。

這裡的「比對」並不是看哪些字重複多次、或單純關鍵字搜尋。(當然,也會混合使用)

主要的方法是將問題與資料都轉換成數字向量,計算這些數字(向量)之間的距離,距離越近,代表語意越接近。這樣的語意比對,是可以透過程式語言(例如 Python)實作的,也是目前多數 AI 應用中常見的做法。

向量距離:語意越接近的文字,向量之間的距離越近

雖然我們不一定能學會如何進行比對、設計資料庫、調整向量模型,但仍可以從兩個實務層面著手,來進一步優化檢索效果:

  • 檢索前的準備策略
  • 檢索後的排序優化

檢索前:讓問題更容易被「命中」

方法 說明 具體案例
拆解問題再合併 複合式提問會導致語意分散,拆成單一目標更容易比對成功 問題:「我們的退款流程與規則是什麼?」
拆成:① 退款流程是什麼?② 退款條件有哪些?
用拆解後足夠小、精細的問題檢索,等 LLM 回答前再整合
多次提問取交集 同一意圖用不同表達法提問,取多次檢索結果中重複出現的內容以提高準確率 想問「報帳流程」,可改為:①「報帳需要哪些步驟?」②「請款流程是什麼?」③「我完成消費後,要怎麼報帳?」
三組提問可能各自抓到不同段落,同一資訊在多個檢索結果中重複出現,就可以作為更可信的共識依據,然後才選擇資料回答。
加入關鍵詞限制 向量檢索可能忽略關鍵詞,增加關鍵字搜尋的條件,確保包含必要字詞(如:法規、技術用語) 查「預付費的方案」,但向量檢索只返回含「付款機制」的模糊內容。
改成查詢:「請列出方案,內容中包含 '預付費' 或 '先付款' 關鍵字」進行檢索。

檢索後:用模型排序出「真正最相關的」

即使向量比對最接近的結果,排名結果也未必最合理。因為:

  • 向量是壓縮過的語意表示,本身就有損失、誤差
  • 相似度排序只是數值相近,不等於語義最貼合

這時就可以使用 Rerank 模型,根據使用者提問的上下文,重新判斷多個候選段落的相關性,排序出更貼近語意的結果。例如一開始檢索結果排序如下:

提問:「猜我喜歡的水果」→ 檢索得到以下結果:

1. 蘋果醋
2. 香蕉汁
3. 榴槤

(向量排序結果)

這三者看似都合理,但實際上「榴槤」才是水果,卻因為關鍵詞罕見之類的原因,排名較後面。

透過 Rerank 模型重新排序後,AI 就有機會把「榴槤」放在第一順位,給出正確的答案。

從「回答問題」到「完成任務」

到這裡,我們學會了許多讓 AI 給出好答案的方法,但很快會碰到兩個實際問題:

  1. 為了一個答案,要分成好幾步驟來做,太麻煩了!
  2. 我們真正要的,其實不只有「答案」,而是「完成某件事」
    • 問怎麼寫報表,是為了完成這季的營收報表
    • 問怎麼寫程式,是為了做出一個網站
    • 問怎麼寫 Email,是為了發出一批廣告郵件

AI 的角色也因此從「內容回答者」轉向「任務完成者」,邁向下一個階段:「流程化 + AI Agent」