01

定位:RAG 到底是什麼

把「檢索」接在「生成」前面,讓模型用外部知識回答——而不是只靠參數裡記得的東西。

RAG(Retrieval-Augmented Generation)是一種系統模式:使用者提問時,先從外部知識庫檢索相關片段,再把這些片段與問題一起組成 prompt,交給 LLM 生成答案。模型不必把公司手冊、最新規章、產品規格全部「背進權重」;它只要在推理當下拿到對的上下文。

核心生成仍靠 LLM,知識來源改成可更新的外部庫

RAG 不取代模型,也不等於「再訓練一次」。它把知識更新從「重訓/微調」改成「更新索引」——文件改了,重建或增量寫入向量索引即可,不必動模型權重。

為什麼幾乎每個企業 LLM 應用都會碰到它?因為純參數模型有三個結構性痛點:

幻覺(Hallucination)
模型會「合理編造」。沒有可引用的依據時,仍可能產出看起來正確、其實錯的句子——尤其在數字、條款、人名上。
知識過時
訓練截止日之後的政策、價格、API 變更,模型天然不知道。等下一輪訓練太慢、成本也太高。
私有資料進不了模型
內部 Wiki、客服工單、合約全文不能也不該塞進公開模型權重。需要「查得到、控得住」的外掛知識層。

RAG 對這三點的共同策略是:把答案所需的事實,從「模型記憶」改為「檢索結果」。模型負責理解問題、組織語言、遵守指令;事實來源則交給可審計、可更新、可權限控管的知識庫。

邊界本篇是地基,不是全套 RAG 工程手冊

切塊策略留給 Chunking 篇,混合檢索與 Reranking 留給混合檢索篇,評測指標留給 RAG 評估篇;Agent loop、MCP/A2A、Runtime 分別留給 Agent 編排篇、MCP 篇與 A2A 篇、Agent Runtime 篇。本篇只把「端到端 pipeline 與核心痛點」講清楚。

一句話答法RAG=先檢索外部知識再生成;用來壓幻覺、補過時知識、接入私有資料,而不靠重訓模型。
02

端到端 Pipeline

離線建庫與線上問答是兩條時間軸;面試時要能完整走一遍切塊 → embedding → 索引 → 檢索 → 組 prompt → 呼叫 LLM。

離線 Ingest
切塊
長文切成可檢索片段
→
Embedding
片段轉成向量
→
索引
寫入:向量 + metadata
線上 Query
索引
讀出:Top-k 相似片段
→
檢索
問題也做 embedding,取 Top-k
→
組 Prompt
指令 + 上下文 + 問題
→
呼叫 LLM
在給定上下文下生成

兩條時間軸唯一的交會點是索引(兩列各出現一次的同一個東西):離線每份文件寫進去一次,線上每次提問讀出來一次。面試時先講清楚這兩條的觸發時機不同,再談 Top-k,才不會被追問打亂。

離線(Ingest)
文件 → 可搜尋的知識庫
  • 切塊(Chunking):把長文切成可嵌入、可檢索的片段;太大則噪音多,太小則失去語境。
  • Embedding:用同一套 embedding 模型把 chunk 變成向量。
  • 建索引:寫入向量庫(或混合關鍵字索引),附上來源、標題、權限等 metadata。
線上(Query)
問題 → 帶依據的回答
  • 檢索:問題也做 embedding,取 Top-k 相似 chunk(或再加關鍵字/重排,見混合檢索篇)。
  • 組 Prompt:系統指令 + 檢索到的上下文 + 使用者問題,組成一次 LLM 呼叫。
  • 呼叫 LLM:模型在「給定上下文」下生成;理想情況是引用片段、少發明。

一個最小可用的 prompt 骨架長這樣(示意):

System: 只根據「上下文」回答;上下文不足就說不知道。 Context: [1] …chunk A… [2] …chunk B… User: …使用者問題…

實務上還會加引用格式、來源 URL、多輪對話歷史——但地基不變:檢索結果是生成的條件輸入,不是可選裝飾。

一句話答法RAG pipeline=離線切塊/嵌入/建庫+線上檢索/組 prompt/生成;索引是兩條時間軸的交會點。
03

架構座標:各元件分工

把「文件進系統」到「答案出系統」拆成幾個可替換的積木,方便和 Vector DB、搜尋引擎、LLM Gateway 對上號。

Parser / Chunker
PDF、HTML、Wiki → chunks
→
Embedder
text → vector
→
Vector Index
ANN 近鄰檢索
Retriever
query → Top-k chunks
→
Prompt Builder
拼上下文與指令
→
LLM
生成最終回答
元件職責常見落點本手冊相關篇
Chunker 決定「一筆知識」的粒度與重疊 ingest pipeline / ETL 後續《Chunking 與檢索策略》
Embedder 語義空間映射;query 與 doc 必須同一模型族 模型 API / 自架 embedding 服務 與 LLM Serving 線相關
Vector Index 近似最近鄰(ANN)、過濾 metadata 專用 Vector DB 或搜尋引擎向量欄 《向量資料庫基礎》
Retriever + Prompt 取 k、排序、塞進 context window 應用後端 / Orchestration 層 本篇;進階見 Hybrid/Rerank
LLM 在約束下生成;不負責「記住公司知識」 供應商 API 或自架推論 LLM Gateway/Inference Serving

積木可替換:換 Vector DB 不必換 LLM;換 embedding 模型通常要整庫重嵌。

關鍵Query 與 Document 必須在同一 embedding 空間

用模型 A 建庫、用模型 B 嵌問題,相似度數字沒有可比意義。換 embedding 模型=視為新索引,而不是「熱更新一個參數」。

一句話答法RAG 架構=Chunker+Embedder+向量索引+Retriever/Prompt Builder+LLM;換 embedding 通常要整庫重嵌。
04

何時用 RAG:與微調、長上下文對照

面試常問「為什麼不 fine-tune?為什麼不把文件全塞進 context?」——用目標差異回答,而不是口號。

手段擅長不擅長更新成本
純 Prompt / 長 Context 單次任務、少量文件、原型 知識量大、要權限過濾、要引用來源 每次請求重送全文;token 貴
RAG 大量可變知識、私有語料、可引用 改變模型「風格/格式習慣」本身 更新索引即可;相對便宜
Fine-tune 語氣、格式、領域用語、特定推理習慣 把整庫事實塞進權重當百科 重訓/再對齊;慢且貴

實務常是組合拳:用 RAG 管事實,用輕量 fine-tune 或 system prompt 管口吻與輸出格式。

陷阱RAG 不是幻覺疫苗

檢索錯了、Top-k 塞了矛盾片段、或 prompt 沒要求「依上下文/否則不知道」,模型一樣會編。RAG 把「可引用依據」送進窗口,但檢索品質與提示約束決定上限——這也是 Chunking 篇、混合檢索篇與 RAG 評估篇各自獨立成篇的原因。

選型口訣可以記成三問:

  1. 知識會不會常改、要不要權限與出處?→ 偏 RAG。
  2. 要不要改變模型說話方式或固定 JSON schema 遵從度?→ 偏 prompt/fine-tune。
  3. 單次就能塞完、且很少重複查同一批文件?→ 先試 長上下文,再決定要不要上索引。
一句話答法事實與可更新知識用 RAG;風格與格式用 prompt/fine-tune;少量一次用完的文件可先長上下文。
05

互動 · 切塊與 Top-k 如何決定召回

同一個問題、同一份知識庫,只改切塊長度、重疊率、Top-k、分數門檻與 context 上限,看召回與「答案要件有沒有進到窗口」如何改變。

第 2 節講的是 pipeline 的順序,這一節講的是它的參數。下面的知識庫是五份固定的中文文件(退貨政策、換貨作業、會員權益、配送 FAQ、舊促銷公告),其中退貨政策裡有兩個句子是回答問題的必要事實:一句寫期限、一句寫包裝要求,而且兩句相鄰。切塊邊界落在什麼位置,決定了它們是被完整包在某一塊裡、還是被切成兩半——這正是 chunking 最常見的失敗模式。

互動 · Chunking 與檢索參數 拖任一個滑桿,切塊、分數、召回與 context 全部重算
USER QUERY
退貨期限是幾天?需要保留原廠包裝嗎?
切塊長度160 字元
重疊率 overlap0%
Top-k3
分數門檻0.15
context 上限600 tok
文件座標 × 檢索分數
Context window 填充

左圖的縱軸是文件字元位置(五份文件由上往下接續)、橫軸是檢索分數,每個 chunk 是一條橫條:它的高度=這一塊涵蓋的字元範圍,所以拉高重疊率時相鄰橫條會在縱軸上互相疊住;虛線是分數門檻。最右側兩條粗標記是「答案要件」所在的字元區間——看它是被某一條橫條完整涵蓋,還是剛好騎在兩條的交界上。右圖是同一次檢索的另一面:選中的塊依序堆進 context window,越過上限線的以斜紋畫在外面,代表它被截掉了。分數是以查詢詞權重 × 詞頻 × 由本次切塊算出的 IDF 當作相似度的教學代理,不是真的 embedding 餘弦相似度。

進 context 召回但被截掉 未被召回 答案要件未涵蓋

值得停下來看的是重疊率那一格:把它從 0% 拉到 40%,塊數只多幾塊、token 成本幾乎沒變,但原本被邊界切斷的那個要件會突然被某一塊完整包住。這就是 overlap 存在的理由——它不是為了提高分數,而是為了讓「事實不被切在接縫上」。

一句話答法Chunking 與 Top-k 不是兩個獨立旋鈕:切塊決定事實會不會被切斷、k 與門檻決定它會不會被撈出來、context 上限決定它會不會被截掉——三關都過,答案才有依據。
06

地基之上:刻意不展開的後續

知道邊界,才不會在面試或設計時把整座冰山塞進一篇「綜合手冊」。

主題本篇只點到深入篇會做什麼
Chunking / 檢索策略 塊太大/太小會傷召回 固定長度 vs 語意切塊、overlap、parent-child
Hybrid + Reranking 純向量可能漏關鍵字命中 BM25+向量、RRF、cross-encoder 二階段
RAG Evaluation 「感覺變好」不夠 召回/忠實度、離線集、LLM-as-judge
Agents / MCP / A2A RAG 是「讀知識」;Agent 還會「做動作」 工具呼叫、多 Agent 委派、Runtime
視角RAG 是讀取面;Agent 是行動面

把內部文件檢索進 prompt,屬於 RAG。若還要「開單、改庫存、打外部 API」,那是工具/Agent 編排——協定層見 MCP/A2A,不要把兩條線混成一個黑盒。

一句話答法本篇把 pipeline 講清;品質靠切塊、混合檢索/Rerank 與評測,行動能力靠 Agent 編排——分層才好設計與面試。
07

面試折衷與實務清單

能畫 pipeline、能說痛點、能講清與 fine-tune 的分工,就已經是合格的 RAG 地基答案。

面試常問的不是「唯一正解」,而是你能否說出每個決策點的兩端折衷。下表每一列是一個決策軸:左欄/右欄是該軸上的兩個對立做法(各列含義不同,以儲存格文字為準),最右欄是答題時要主動補上的風險。

決策點一端做法另一端做法留意
Top-k 小 k:噪音少、省 token 大 k:召回高、易塞爆窗口 無 rerank 時盲目加大 k 常變差
更新頻率 批次重建:簡單一致 增量 upsert:新鮮度高 刪改文件要同步刪舊向量,避免幽靈依據
權限 檢索前依 ACL 過濾 生成後再檢查 應在檢索側過濾,避免敏感 chunk 進 prompt
引用 強制列出 chunk id/URL 自由生成 要可稽核就強制引用格式
實務上線前至少準備的三件事

(1)一小撮「標準問答+應命中文件」當回歸集;(2)prompt 寫明「僅依上下文/否則不知道」;(3)索引與來源系統的刪改同步策略。沒有這三樣,RAG 很容易變成「會說話的錯資料管線」。

一句話答法RAG 面試答:痛點三件套、六步 pipeline、與 fine-tune 分工,再加上 Top-k/更新/權限三個折衷。