AI 互動教室 ‹ 生成式 AI 導論
下載 .py 單獨開啟實驗場 ↗ 留言回報
GENAI BASICS · 07 · 應用與檢索

RAG 與向量資料庫:
先查再答

同一個模型、同一個問題、同一個 temperature=0——唯一的差別是有沒有先查手冊。 下面是真實紀錄:一份模型絕不可能背過的虛構咖啡機手冊,四個問題, 紅色是它編出來的、綠色是手冊裡真有的。點問題切換:

實測紀錄(qwen3.5-2b,temperature=0,2026-08);「拿鐵大師 LM-500」手冊為本課虛構教材。

右邊的實驗場是真的 Python(在你的瀏覽器裡跑,不用安裝任何東西)。 首次載入約需 30–60 秒,正好夠你讀完第 1 節。手冊 12 段的真向量已打包在裡面, 檢索是現場算的——改壞了重新整理就復原。

01 · RAG

RAG:先檢索,再生成

一句話重點:RAG = 回答前先從你的資料庫檢索相關段落、塞進 prompt 再生成—— 企業落地最常見的 LLM 架構。

開場那四組對照值得各看一眼,它們是三種不同的失敗:

問題無 RAG 發生了什麼
Q1 首次使用/Q2 除垢整套流程都是編的(裝咖啡液體、倒白醋跑 15–30 分鐘)——語氣自信、格式漂亮,全錯。這叫幻覺
Q3 磨太細咖啡通識大多講對了——但答不出「防堵塞保護自動停機」這種只在你手冊裡的規格。
Q4 保固「2 年」矇對了(常見值),細節全編——矇對的和編造的長得一模一樣,你無法分辨哪句可信。

模型的知識來自訓練語料:有截止日期、沒看過你的私有資料、記憶又是模糊的統計。 要它回答「你家的事」,就得把資料在提問當下遞給它——這就是 RAG 解的問題。 有 RAG 的版本不只答對,還會指出處(「根據手冊段落【段落 3】…」), 答不了的說「手冊中沒有提到」——可信度是這樣來的。

02 · VECTOR DB

向量資料庫:存 embedding、查最近鄰

一句話重點:向量資料庫(Chroma、Qdrant…)專門存 embedding 向量、 做高速的「誰跟它最像」查詢——RAG 的檢索層。

第 1 課你算過 cosine 最近鄰;文件只有 12 段時用 numpy 就夠(右邊 1️⃣ 正是這樣做的)。 但文件變成十萬段,就需要專門的資料庫:建索引加速查詢、管理增刪、存 metadata。 入門首選 chromadb——兩行就能開始,內建預設 embedding 模型:

import chromadb client = chromadb.Client() manual = client.create_collection("lm500-manual") manual.add( documents=chunks, # 12 段手冊文字 ids=[f"c{i}" for i in range(len(chunks))], ) # 自動算好 embedding 存起來 hits = manual.query( query_texts=["除垢燈亮了該怎麼處理?"], n_results=3, # top-3 ) print(hits["documents"][0]) # 檢索到的段落

正式環境常見 Qdrant(獨立服務、支援過濾與分片)—— 本站 llm-apps 系列的 Qdrant 課有完整實作, 學完這課想動真格的可以接著上。

03 · PIPELINE

拆開管線:沒有魔法,只有五步

檢索到的段落是怎麼「進到」模型的?答案樸素到令人安心:貼進 prompt

步驟做什麼本課對應
1 切塊 chunking文件切成段,一段講一件事手冊 12 段
2 向量化 embed每段算 embedding 存入向量庫jina-embed 1024 維
3 檢索 retrieve問題算向量、cosine 排序取 top-k右邊 1️⃣
4 組裝 augmenttop-k 段落+規則貼進 prompt右邊 3️⃣ 印給你看
5 生成 generate模型照段落回答、查無則明說右邊 2️⃣ 的綠卡

其中第 4 步的 system prompt 有一句關鍵咒語:「手冊裡沒有的資訊, 要說『手冊中沒有提到』」——它把模型從「編一個答案」的預設行為扳成「承認查不到」。 右邊 3️⃣ 印出了實測時真正送給模型的完整 prompt,一個字都沒藏。

04 · BEYOND

進階流派:GraphRAG 與多模態 RAG

一句話重點:GraphRAG 把文件先建成知識圖譜再檢索、多模態 RAG 把圖片表格 也向量化——都是為了回答「單靠幾段文字接不起來」的問題。

基本 RAG 的弱點:問題的答案散在很多段、要先把關係接起來時 (「這家公司過去三年的策略轉變是什麼?」),top-k 段落各自為政、接不出全貌。 GraphRAG(微軟開源)先用 LLM 把文件抽成「實體-關係」圖譜+社群摘要, 檢索時沿著圖找、用摘要答全域問題:

pip install graphrag graphrag init --root ./my-project # 建設定 graphrag index --root ./my-project # 用 LLM 抽實體關係、建圖譜(要花錢,語料大時不便宜) graphrag query --root ./my-project \ --method global "這批文件的主要主題是什麼?"

多模態 RAG則是把「文件」的定義擴大:簡報的圖表、掃描的表格、產品照片 也用多模態 embedding 模型向量化,跟文字一起檢索。 兩者都屬「知道有這回事」的延伸——先把基本 RAG 做穩,真的撞到牆再升級。 想在真環境把 RAG 完整做一遍,本站 llm-apps 系列的 RAG 課是下一站。

05 · 速查

本課名詞速查卡

發講義用的濃縮版——一個名詞一句話:

RAG 先檢索再生成:回答前把相關段落塞進 prompt——企業落地最常見架構,治「編造」與「不知道你家的事」。
向量資料庫 Vector DB 存 embedding、查最近鄰的資料庫(Chroma/Qdrant)——RAG 的檢索層。
幻覺 Hallucination 模型自信地編造不存在的事實——RAG+「查無則明說」規則是最常用的解法。
GraphRAG / 多模態 RAG 融合知識圖譜圖像表格的進階檢索——答案散在多處、接得起關係才答得了時用。
06 · 實戰

換你動手

LEVEL 1

在右邊 1️⃣ 把 top-k 從 3 拉到 5,觀察第 4、5 名的相似度掉到多少、內容跟問題還有沒有關係。top-k 越大越好嗎?

LEVEL 2

把實驗區改成 MY_Q = 3(保固)、MY_K = 1——只給一段答得了嗎?什麼樣的問題只靠 top-1 就夠、什麼樣的一定不夠?

LEVEL 3

設計一個「檢索一定失敗」的問題(手冊沒寫的事,例如冰滴咖啡)。先猜:檢索會回什麼?靠什麼擋住模型開始編?

卡住了?三題在 notebook 最後一格都有折疊解答——先自己做,再打開對照。

07 · 驗收

情境測驗

離開前試試看:下面的情境都真的會遇到。每題選一個你認為的最佳做法,選了馬上看得到解釋。

Q1 情境題

公司要做內部規章問答機器人,試用時發現模型常把規定講錯、還講得很有自信。要讓回答可信,最該做的是?

可信要靠「有據」:RAG 讓每個回答都建立在當下檢索到的原文上,能指出處、能說查無,規章改了重新入庫即可——這正是它成為企業標配的原因。A 只是求它,擋不住本課 hero 那種自信編造(模型不知道自己在編);C 短期可行但貴又慢,而且塞進大量無關條文會稀釋重點、答錯率反而上升(第 1 課的 context window 教訓);D 成本高、更新慢(規章一改就要重練),而且微調改的是「行為風格」,對「精確記住條文」並不可靠——知識類需求先 RAG,是業界的預設順序。

Q2 錯誤診斷

同事看了無 RAG 的實測回答(節錄如下),說:「你看,連保固 2 年都答對了,模型本來就會,不用做 RAG。」他哪裡看錯了?

根據我們與您的合約,「拿鐵大師 LM-500」的保固期為 2 年。 若發生非人為因素(如電源斷電、水質過鹹、使用不當)造成的損壞, 我們將提供免費維修或更換零件服務。…… 【外部損傷】:例如機身被撞擊、受潮、或受到強光直射。

這段是實測紀錄:手冊只寫「2 年保固;人為損壞、摔落、未除垢的水垢堵塞不保固」——回答裡的「合約」「電源斷電」「水質過鹹」「強光直射」通通是生成的。危險不在錯,在對錯混在一起且語氣一致:使用者沒有手冊可對照,只能全信或全疑。B 無中生有,這個模型沒有上網能力,答對是因為「2 年」是家電保固的高頻值;D 是常見誤解——這次實測本來就是 temperature=0,決定性抽樣只是讓輸出穩定,穩定地編造還是編造。A 的結論建立在「恰好抽對的一個字」上。正解是讓回答有出處:RAG。

Q3 情境題

你把公司 200 頁的產品手冊做成 RAG,但偷懶把「整份 PDF 抽出來的全部文字」當成一個 chunk 存進向量庫。會發生什麼事、該怎麼切才對?

切塊(chunking)決定檢索的「解析度」:一個 chunk=一次只能整塊給。全文一塊時,任何問題都命中同一塊,等於退化成「每次把整份手冊塞進 prompt」——token 爆炸、無關內容稀釋重點,而且一個向量要代表 200 頁的語意,跟任何具體問題的相似度都變得模糊。本課手冊切成 12 段、一段講一件事,Q2 檢索才能精準地把「除垢」那段排到 0.7;這是 A 想不到的代價。C 過度信任工具——切塊策略(大小、重疊、按語意或章節)是你要做的設計決策,庫只存你給的東西;D 搞錯了主要傷害,慢是小事,答不準才是大事。

Python 環境載入中(首次約 30–60 秒)…讀完第 1 節它就好了