影片狀態:已附影片。 影片來源與說明
這是台大陳縕儂 深度學習之應用 導讀的第 8 堂,依據 ADL Fall 2025(114-1,2025/09/01–12/15)10/13 那一週的教材。第 7 堂講怎麼調整模型本身。這一堂換一個方向,模型不動,回答兩個問題:模型不知道或記不清楚的事,怎麼讓它答對?要讓它先查資料再回答,「查」這一步要怎麼做才查得準?
官方材料:
- RAG 投影片(60 頁)
- 影片 8.1 大家都在用的 RAG 是甚麼呢?(27:32)、8.2 RAG Framework(39:52)、8.3 Advanced RAG(10:26)、8.4 RAG Roadmap(28:17)、8.5 RAG Pros & Cons(17:23)、8.6 RAG Q&A(24:19,課堂問答,沒有對應的投影片)
- HW3 說明影片(20:34)
8.1 到 8.5 有字幕。8.6 與 HW3 說明影片沒有字幕,本文用音訊轉成的逐字稿整理。標成「本文自編」的例子不是課堂內容。
讀完要能做五件事:說出只靠參數記憶的四個限制;畫出 RAG 的流程,說明切段大小的取捨;分清楚 sparse 與 dense retrieval、bi-encoder 與 cross-encoder,各用在哪個階段;用「檢索什麼、怎麼用、何時檢索」三個問題,把幾個代表方法放到對的位置;遇到一個需求,判斷該用 prompting、RAG 還是 fine-tuning。
為什麼要先查再答
有名的人答得對,沒那麼有名的人就開始編
老師用兩個問題開場(投影片第 2–3 頁)。問模型「你知道蔡英文嗎?」,它答得又長又正確。再問實驗室自己做的 Taiwan-LLM「你知道台大的陳縕儂嗎?」,它說她是電機系的教授、在史丹佛拿到博士、研究半導體元件。投影片把錯的地方一一劃掉。老師說,有些是對的,但滿大一部分是錯的。
差別在資訊有多常見。熱門的資訊在預訓練時反覆讀到,記得很清楚。冷門的資訊模型也許讀過,但沒有讀熟,被問到時吐不出正確的內容,就產生 hallucination。
這種情況叫 long tail(長尾)。把所有資訊依出現頻率由高到低排開:左邊少數幾項很高,右邊拖著一條很長的尾巴。熱門的資訊占比其實很少,大部分的資訊都落在尾巴上。老師用考試比喻:重點複習過很多遍,考出來一定會;偏門的題目雖然看過,太少出現,一考又不會了。偏偏偏門的占大多數。投影片的結論是 LLMs cannot memorize all details about long-tail information。
解法是把考試從 closed book 改成 open book。同一個模型、同一個問題,讓它先做 web search、讀過搜尋結果再回答(第 4 頁),答案就正確多了:資訊系教授、卡內基美隆的博士、研究語言理解與對話系統。
讓回答有外部資料可以對照,這件事叫 knowledge grounding。老師特別強調投影片上的用字是 reduce hallucination,不是 resolve。模型看了資料之後,還是會用自己原本的知識做判斷、推論與摘要,所以仍然可能出錯,只是比直接回答少。
知識會過時
第 5 頁問「台灣現任總統是誰?」,模型答的是它讀書時的那一位。它沒有忘記,是它讀到的內容已經過時。資訊一直在變,不可能期待模型每分每秒自己去讀最新的資料,只能在推論時另外給它更新的參考資料。
投影片提到另一條路 knowledge editing(Hsueh 等 2024):直接修改模型已經學到的知識。老師解釋它為什麼難:
- 最直覺的做法是拿新資料繼續訓練。但模型腦中會同時有「現任總統是 A」和「現任總統是 B」兩種內容,它沒有時間先後的概念,回答時而對、時而錯。
- 就算把「現任總統」這個事實改好了,問「現任總統的爸爸是誰」,還要連帶更新才會對。只改一處,它可能答成前任總統的爸爸。
這個方向這一堂沒有深入。
WebGPT:教模型用搜尋引擎
第 6–8 頁是 OpenAI 在 2021 年做的 WebGPT(Nakano 等),比 ChatGPT 還早一點。任務是回答需要查資料的問題,投影片的例子是:哈利波特系列和魔戒,哪一個字數比較多?這種題目模型很難背在腦子裡。
做法是在 GPT-3 上做監督式微調。GPT-3 只會接下一個 token,所以要把「搜尋」也變成接龍的一部分(第 7 頁):
- 產生搜尋關鍵字。看到問題「川普最新聲明是甚麼?」,模型要輸出
[SEARCH] Trump's latest post [END]。多出來的[SEARCH]是告訴系統:現在要呼叫外部搜尋。 - 點選參考文件。搜尋結果回來之後,模型要輸出
[CLICK] 1 [END],表示點開第一筆。
訓練資料從人來:記錄人看到問題之後搜了什麼關鍵字、點了哪一筆。投影片的結論是 Supervised learning of human actions。
老師說,產生搜尋字詞再呼叫外部搜尋,現在各家模型都內建了。她拿同一個問題問 Gemini,它判斷這是會變動的資訊,自己去做 Google Search,再依搜尋結果回答(第 8 頁)。
預訓練留下的先驗
第 9 頁補上原理。模型訓練時在做的事,是提高訓練資料裡下一個 token 的機率。一個資訊反覆出現,對應的機率就被反覆推高;只出現過一次的,推高一次就停了,之後被問到不一定叫得出來。投影片在兩個例子下面各放一句結論:Pre-training data is outdated,以及 Generation follows the distribution in the pre-training data。對應兩個問題:
- 過時。和時間有關的資訊會過期,但很難在預訓練時濾掉,因為同一篇文章裡還有很多值得學的事實。
- 偏誤。投影片的例子是「我好朋友是護士,」後面接「她對待病人很有耐心」的機率遠高於「他」。沒有人告訴模型這位護士的性別,但訓練資料裡的護士多半是女性,模型就帶著這個先驗。
只靠參數記憶的四個限制
模型把讀過的資料存在參數裡,這種記憶叫 parametric memory。第 10 頁整理它的四個限制:
- 記不住所有東西。長尾的資訊常常答錯。
- 世界會變。訓練完之後才發生的事,它不知道。
- 私有文件不在網路上。老師舉的例子是系上想做一個回答停修、選課規定的問答系統,這些規則模型在預訓練時根本沒看過。公司內部的文件也一樣。
- 黑盒子,難以查證。模型直接回答時,我們不知道它根據什麼。讓它先參考外部資料,它可以說出參考了哪幾篇,我們才有東西可以回頭確認。
RAG 的基本框架
第 12 頁的圖有四個元件:使用者的 query、外部的 documents(網路上的公開資料,或內部的資料庫)、indexing 與 retrieval、最後的 LLM。流程是:文件先處理好並建立索引 → query 進來,檢索出相關的段落 → 把段落和問題一起放進 prompt → LLM 產生回答。
圖上的 LLM 有一個雪花,表示它是凍結的。老師說明原因:模型很大,或者你用的是別人的 API,這一段通常動不了。所以實務上能下工夫的是前半段:索引做得好不好、檢索準不準。
老師也順帶解釋 indexing。它是搜尋引擎的基本技術,更早以前圖書館編目也是同一件事:先把資料整理好,查的時候才快。最簡單是每篇文件給一個編號;想更有效率,可以先依主題分群,查詢時先判斷主題,再只在那一群裡找。
切段:切多大
被檢索的單位通常不是整篇文章,是切過的小段,叫 chunk 或 passage(第 13 頁)。老師解釋為什麼要切:一篇文章很長,前面講 A、後面講 B、C、D。問題只和 A 有關時,整篇文章的相關度會被後面不相關的內容稀釋,反而找不到。切成小段,資訊比較集中。
切法沒有標準答案,她列了幾個實務上的細節:
- 常見的做法是設一個固定長度,例如 300 個 token 一段,並讓相鄰兩段有一部分重疊。
- 盡量切在句子結束的地方,不要讓一段的結尾多帶下一句的兩個 token。
- 切太細,資訊零碎,本來要一起看的兩段被拆開;而且段數變多,要比對的數量也變多。
- 切太粗,要比對的數量少,但一段裡混了好幾個主題,找到的「最相關」也沒有那麼相關。
怎麼選要看應用,也要看文件原本的樣子。一份文件只講一條法規,可以整份當一段;一份文件塞了很多條法規,就該切開。
Sparse retrieval:比對關鍵字
傳統搜尋引擎的做法叫 sparse retrieval(第 14 頁)。把 query 和每份文件各轉成一個 TF-IDF 向量:向量的每一維對應詞彙表裡的一個詞,值由這個詞出現的頻率算出來。兩個向量做內積,值越高代表共同出現的詞越多。
投影片的例子是 q =「what is nlp」,三份文件 d₁、d₂、d₃ 的內積分別是 0.165、0.0825、0.0413。
例子(投影片的數字,本文重算;老師在課堂上沒有講解這個例子,下面的解讀是本文的)。條件:向量的五個維度依序是 what、candy、nlp、is、language。q = (0.33, 0, 0.33, 0.33, 0),d₁ = (0.25, 0.125, 0, 0.25, 0),d₂ = (0, 0, 0.125, 0.125, 0),d₃ = (0, 0, 0.125, 0, 0)。
- 推理:q·d₁ = 0.33×0.25 + 0.33×0.25 = 0.165。q·d₂ = 0.33×0.125 + 0.33×0.125 = 0.0825。q·d₃ = 0.33×0.125 ≈ 0.0413。
- 結果與意義:d₁ 排第一。但看內容,d₁ 是「what is life? candy is life!」,和 NLP 無關,它只是剛好有 what 和 is 這兩個詞。d₂「nlp is an acronym for natural language processing」才是答案,卻排第二。只算重複的詞,常見詞也會貢獻分數。
它叫 sparse,是因為向量的維度等於詞彙表大小,絕大部分是 0。好處是算得快。缺點是一定要出現一樣的關鍵字:文件寫的是「大型語言模型」,你搜「LLM」,就找不到。老師說以前用搜尋引擎,大家都有過得想出剛好對得上的關鍵字的經驗。
TF-IDF 的進階版本是 BM25(投影片附了公式),一樣是用 TF 和 IDF 的概念,所以還是要有對得上的詞。
Dense retrieval:比對語意
反過來的做法是 dense retrieval(第 15 頁):用神經網路把一段文字編碼成一個維度少、每一維都有值的向量,query 也用同樣的方式編碼,再算兩個向量的 cosine similarity。
編碼器從哪裡來,投影片分兩類:
- 現成的 embedding。預訓練好的 BERT,取第一個
[CLS]token 位置的向量;或預訓練好的 GPT,取整段輸入讀完之後的那個向量。老師說她覺得後面這種以語言模型為底的 embedding 是近期最常用的,OpenAI 與 Google 都有直接提供 embedding 的 API。直接拿預訓練好的 embedding 來用,也是業界建 RAG 最常見的做法,因為不需要任何訓練資料。 - 用對比學習訓練出來的 embedding。投影片列了 DPR(Karpukhin 等 2020)與 Contriever(Izacard 等 2022)。
Bi-encoder 與 cross-encoder
老師接著講兩種常見的架構:
| Bi-encoder | Cross-encoder | |
|---|---|---|
| 做法 | query 和 passage 各自過一個編碼器,得到兩個向量,再算相似度 | 把 query 和 passage 接在一起,餵進同一個編碼器,直接輸出相關程度 |
| 效果 | 較差:query 和 passage 在編碼過程中看不到對方 | 較好:兩者可以直接互相做 attention |
| 成本 | 低:query 和 passage 不用兩兩組合,各自獨立編碼 | 高:每一組 query 和 passage 都要重新跑一次模型 |
| 用在哪 | 第一階段的檢索 | 重排序 |
Bi-encoder 的兩個編碼器可以共用權重,也可以分開。老師說分開的理由是:使用者的問題通常只有一句,passage 很長,兩者的形式差很多。
為什麼效果比較好的 cross-encoder 不拿來做檢索?因為檢索是從成千上萬、甚至百萬份文件裡挑,每一份都要和 query 接起來跑一次模型,成本太高。先用 bi-encoder 挑出一小批候選,例如 30 份,再用 cross-encoder 在這 30 份裡仔細排,成本就可以接受。除非文件本來就不多。
有成對資料時怎麼訓練
第 16 頁是訓練 dense retriever 的做法。query 是「美國哪一州面積最大?」,一份英文文件 The biggest state in the U.S.… 是正例(d⁺),兩份中文文件雖然也提到美國的州,但回答不了這個問題,是負例(d⁻)。訓練目標是:
L = −log [ e^s(q, d⁺) ÷ Σᵢ e^s(q, dᵢ) ]
s 是 query 與文件兩個向量的內積。分母是正例加上所有負例。老師補充負例通常用抽樣的,不會把所有不相關的文件都放進來,例如一個正例配五個負例。
例子(本文自編)。條件:一個正例、兩個負例。目前的分數是 s(q, d⁺) = 2,兩個負例都是 0。
- 推理:e² ≈ 7.39,e⁰ = 1。正例的機率是 7.39 ÷ (7.39 + 1 + 1) ≈ 0.79,損失是 −ln 0.79 ≈ 0.24。
- 對照:如果模型還分不出來,三個分數都是 0,正例的機率是 1/3,損失是 −ln(1/3) ≈ 1.10。
- 結果與意義:損失要變小,只有兩條路:把正例的分數拉高,或把負例的分數壓低。這就是「相關的拉近、不相關的推遠」寫成式子的樣子。
這種訓練需要成對的資料:每個 query 要知道哪份文件是正例。投影片的結論是 Paired training data is difficult to collect。老師說,手上有這種資料的是 Google、Microsoft 這些有搜尋引擎的公司,因為使用者搜尋之後點了哪一筆,就是現成的標記。其他人只能請人標,成本很高。
沒有成對資料時:query likelihood
第 17 頁的替代方案利用語言模型本來就會的事。語言模型能估計一段文字的機率,所以可以問它:讀了這份文件之後,產生這個 query 的機率 P(q | d) 是多少? 如果文件和問題相關,這個機率應該比較高。
所以只要收集 query 就好。對每個 query,把文件庫裡的候選文件各餵給語言模型算一次 P(q | d),機率高的當成正例,就得到一份由語言模型標出來的成對資料(pseudo label)。投影片註明這個做法出自 Sachan 等的 Improving Passage Retrieval with Zero-Shot Question Generation。
課堂問答(8.6)有同學問:一份文件可以對應無數種 query,機率怎麼算?老師澄清:不是對所有可能的 query 算,是對你收集來的那一批 query 算。算的方式和算 perplexity 一樣,把文件當輸入,把 query 的每個 token 的機率乘起來。所以限制是要先有 query,但不需要標註。
這個做法特別適合多語的情境(第 18–19 頁,Huang 與 Chen 2024)。人工標註很難跨語言:看得懂日文問題的人不一定看得懂英文文件。但我們希望模型用中文被問時,也能找到英文的文章再用中文回答。多語的語言模型可以直接替「日文問題配英文文件」算機率。
第 19 頁是 XOR-TyDi QA 上的結果:
| F1 | EM | BLEU | |
|---|---|---|---|
| MT+DPR | 7.2 | 3.3 | 6.3 |
| CORA | 43.5 | 33.5 | 31.1 |
| UMR(這篇的方法) | 44.9 | 34.7 | 32.5 |
本文補充(老師沒有解釋這三個指標):EM 是 exact match,看答案和標準答案是否完全相同;F1 與 BLEU 看答案和標準答案在用詞上重疊多少。三者都是越高越好。
老師的說明是:橘色(CORA)用人標的資料訓練,紅色(UMR)完全不用人工標註,表現差不多,還稍微高一點。投影片的結論是 Training with query likelihood outperforms training with paired data。
生成:把段落放進 prompt
檢索回來的段落和問題一起放進 prompt,交給凍結的 LLM(第 20–21 頁)。投影片給了一個 prompt 範例,有三個重點:
- 要模型用 context 裡的資訊回答 query。
- 如果 context 裡沒有相關資訊,就試著自己回答,但要告訴使用者這次沒有相關的 context 可以依據。
- 回答要精簡,少於 80 個 token。
老師解釋第二點:檢索有可能不準,拿回來的東西根本無關。這時不希望模型被無關的內容誤導,但要它明說,使用時才知道它到底有沒有用到檢索的內容。
RAG 會出什麼問題
第 23 頁把問題分成兩段:
檢索端
- 找到的段落對不上問題或不相關,會誤導後面的生成。
- 多個來源的內容重複,浪費 token;模型的 context window 不夠長時就成了問題。
生成端
- 仍然可能有檢索內容不支持的 hallucination。做了檢索不代表不會有。
- 輸出受到檢索內容裡不相關、有害或有偏誤的資訊影響。老師舉了攻擊的例子:有一類方法是要模型扮演遊戲裡的角色、描述抽到的物品怎麼製作,藉此繞過安全機制。如果檢索到的文件裡含有這類內容,模型也可能被帶著走。
- 太依賴檢索內容,原封不動貼出來。老師說這不一定是壞事,答案本來就很直接時,照抄沒問題。但如果你問「這條法規在這個情況下要怎麼判斷」,它把法規全文貼給你,沒有做後面的推論,就沒有回答到問題。
Advanced RAG:檢索前後各加一段
進階的框架在檢索的前後各加一些處理(第 24–25 頁):
Pre-retrieval
- Retrieval decision:決定要不要查。模型本來就知道的事,查了只是多花成本、變慢。
- Query rewriting:把問題改寫成適合檢索的形式。老師的說法是不要無腦把問題直接貼去搜尋,有時要拆成先搜 A、再搜 B。
- Context enrichment:擴充段落。檢索到的只有一段,單獨看資訊可能不完整,可以把前後的段落一起帶進來。
- Fusion retrieval/hybrid search:sparse 與 dense 一起用。投影片寫的是兩者平行進行;老師口述的是先用 sparse 縮小範圍,再用 dense 細找。
Post-retrieval
- Reranking:把最相關的內容排到前面。
- Context compressing:挑出必要的資訊、把 context 縮短。老師舉的對比是:檢索回五段就直接貼五段,還是先做摘要、濃縮重點,讓模型更專注。她也說,做了這些不保證效果一定更好。
重排序:pointwise 與 pairwise
第 26 頁比較兩種重排序的單位:
- Pointwise:一次看一份文件,問它和 query 有多相關,給 1 到 5 分。
- Pairwise:一次看兩份,問哪一份比較相關,回答 A 或 B。
投影片的結論是 pairwise 比較準。老師的理由是(和第 7 堂談 reward model 時是同一個道理,這個連結是本文加的):絕對分數沒有固定的基準,同一份文件這次給 3、下次可能給 4;兩份擺在一起比,有了比較的基準,排序比較精確。
例子(本文自編)。條件:第一階段檢索回 30 份候選,要重排序。
- 推理:pointwise 要評 30 次。pairwise 如果每一對都比一次,要比 30 × 29 ÷ 2 = 435 次。
- 結果與意義:候選數是 n 時,pointwise 的次數隨 n 成長,pairwise 隨 n² 成長。老師說這是 pairwise 一個比較大的缺點。這也是為什麼重排序只做在一小批候選上。
請人來評哪一份比較相關很困難,所以第 27–28 頁(Huang 與 Chen 2024)的做法是請語言模型來做:把上面兩種問法直接寫成指令,讓 LLM 回答,不需要任何標註、不需要訓練。結果以 NDCG@10 計。這是衡量前 10 名排序品質的指標,越高越好(這句說明是本文補充,老師只說這張表評的是搜尋得對不對):
| DL19 | DL20 | BEIR(平均) | |
|---|---|---|---|
| BM25 | 50.58 | 47.96 | 38.01 |
| MonoT5-3B(有標註資料訓練的 reranker) | 71.83 | 68.89 | 46.65 |
| InstUPR-pair(不用標註,pairwise) | 70.53 | 68.55 | 46.63 |
老師的解讀:不用標註的 pairwise 做法,和有標註資料訓練出來的 reranker 差不多;pointwise 的成本低一些,表現也低一點。
第 29 頁的 PairDistill(Huang 與 Chen 2024)再往前一步:既然重排序的分數是語言模型給的,可以把這些分數拿回去訓練 retriever。Retriever 變好之後找到更好的候選,再重排序、再訓練,反覆進行。投影片的損失函數是三項相加:L = L_CL + λ_KD·L_KD + λ_pair·L_pair。老師說這樣最後不需要真的留一個 LLM reranker,能力都蒸餾到 retriever 上了。
一次不夠就再查一次
有些問題要查不只一次。第 30 頁的 ITER-RETGEN(Shao 等 2023)把上一輪的輸出和問題接在一起,當成下一輪檢索的依據。投影片的例子是:贏得 2015 年 AFL Rising Star 的球員身高多少?
- 第一輪:檢索到這個獎由 Jesse Hogan 拿下,但沒有身高。模型自己接了「身高 198 公分」,答錯。
- 第二輪:用上一輪的輸出再檢索,找到 Jesse Hogan 身高 1.95 公尺,答對。
老師說這是 multi-hop 的問題:要先知道是誰,才能查他的身高。
RAG 的發展路線:檢索什麼、怎麼用、何時檢索
第 31–48 頁用三個問題整理 RAG 的演進,架構來自 ACL 2023 的一份 tutorial。把各頁的圖合起來是這張表:
| 檢索什麼 | 怎麼用 | 何時檢索 | 代表方法 |
|---|---|---|---|
| 文字段落 | 放在輸入 | 生成開始時查一次 | RAG(Lewis 等 2020) |
| 文字段落 | 放在中間層 | — | RETRO(Borgeaud 等 2022) |
| 文字段落 | 放在輸入 | 每 n 個 token 查一次 | Retrieval-in-context LM(Ram 等 2023;Shi 等 2023) |
| 文字段落 | 放在輸入 | 視情況決定 | FLARE(Jiang 等 2023);Search-R1、AdaSearch(Jin 等 2025;Lin 等 2025) |
| Token | 放在輸出層 | 每個 token | kNN-LM(Khandelwal 等 2020) |
| Token | 放在輸出層 | 視情況決定 | Efficient kNN-LM(He 等 2021) |
表中 kNN-LM 的「每個 token」不在 roadmap 圖上,出自第 47 頁的文字。
RAG(Lewis 等 2020)。RAG 這個詞出自這篇論文。老師說它和現在大家說的 RAG 只有一點點像:它是 end-to-end 的模型,retriever 和 generator 一起訓練,檢索到的文件不會變回文字,直接以向量的形式進入 generator。Retriever 學的是給對的文件比較高的權重,generator 學的是依這些文件把正確的 token 產生出來。課堂問答裡有同學問為什麼 modular 的 RAG 和一開始的 RAG 差這麼多,老師的回答是:那時還沒有大型語言模型,概念相似,做法不同;RAG 這個名字取得好,就流傳下來了。
RETRO(Borgeaud 等 2022)。把檢索到的內容注入模型的中間層:在 Transformer 的 attention 和全連接層之間多插一個 chunked cross-attention,讓模型去 attend 檢索回來的段落。投影片的結論是比放在輸入層有效率,但需要訓練。老師說這是它現在比較少用的原因:多數 RAG 系統沒有標註資料可以訓練這一層。
Retrieval-in-context LM(Ram 等 2023;Shi 等 2023)。每產生 n 個 token 就檢索一次,把結果放到輸入前面。老師的比喻是寫一篇長作文,寫一寫要停下來翻一下參考資料。第 38 頁的圖橫軸是 n,從 64 到 1,縱軸是 perplexity。最小的 GPT-2(117M)從 34.7 降到 29.5,最大的(1.5B)從 18.6 降到 16.4。老師指出兩件事:查得越頻繁表現越好,而且小模型進步得比大模型多,因為它自己記不了那麼多。代價寫在投影片上:推論成本更高、更慢。
FLARE(Jiang 等 2023)。模型先產生內容,看到自己不確定的地方才檢索。第 40 頁的例子是寫拜登的摘要:第一句(出生日期、第幾任總統)模型很確定,不用查。第二句寫他讀賓州大學,這一段的 token 機率偏低。於是去檢索,查到他畢業於德拉瓦大學,把這句改寫。老師說這種做法是用產生 token 的機率來代表信心。
Search-R1(Jin 等 2025)。把「要不要搜尋」變成強化學習的決策(第 42 頁)。一個小的語言模型當 policy,自己決定要不要搜、搜什麼,搜尋引擎是環境,reward 是最後的答案對不對。老師說它用 3B 的模型就做到和 GPT-4 差不多的表現。
AdaSearch(Lin 等 2025)。老師指出 Search-R1 的一個問題:只用答案對不對當 reward,只要搜了會對,就一直被鼓勵去搜。但有些題目不搜也會對,這時搜尋是多餘的,結果就是 oversearch。AdaSearch 在 reward 裡多加一項「這個決定做得對不對」(投影片:answer correctness + correct decision making),要模型先評估自己有沒有能力回答。投影片的說法是 knowing what you know。老師補充這樣的決策比較能適用到不同模型上:同一件事,8B 的模型不用查就知道,3B 的可能必須查。
kNN-LM(Khandelwal 等 2020)。檢索的單位換成 token。要接「Obama's birthplace is」的下一個詞時,先到訓練資料裡找最相近的 k 個前文,例如 Obama was born in、Obama is a native of,看它們後面接了什麼,把這些候選彙整成一個分布,再和語言模型自己的分布混合。第 45 頁的數字是:語言模型給 Hawaii 與 Illinois 都是 0.2;鄰居給 Hawaii 0.8、Illinois 0.2;混合之後 Hawaii 是 0.6。混合的式子寫成(固定的 λ 在第 45 頁的圖上):
P(y | x) = (1 − λ) P_LM(y | x) + λ P_kNN(y | x)
投影片的評語是更細、運算上有效率,但很占空間,因為所有訓練前文和它們的下一個詞都要存起來。
Efficient kNN-LM(He 等 2021)。不是每個 token 都需要查。老師的例子是 graduated 後面接 from,這是文法問題,和知識無關。所以改成視情況決定:需要知識的位置才檢索,其他位置直接用語言模型。第 47 頁的式子因此把 λ 換成隨輸入而變的 λ(x)。
檢索的來源不只文字
第 49 頁把來源分成三類:
- 非結構化:文字,來自網路或內部。
- 半結構化:文字加表格,例如 PDF。投影片列的問題是資料損毀、怎麼從表格裡找資訊;把表格轉成文字再用純文字的 RAG 可以做,但效果不理想。老師的解釋是表格原本有容易理解的結構,一列一列唸成文章之後,結構就沒了。
- 結構化:知識圖譜(knowledge graph)。節點是 entity,邊是關係,例如「陳縕儂」和「台大」之間有「任職於」的關係。前面「現任總統的父親是誰」這種題目,就可以在圖上一步一步推。
老師談了表格的三種用法:把問題轉成 SQL 直接查;表格不大時整張轉成文字貼進去;以及比較常見的混合做法,先從大表格篩出相關的子表格,再把子表格交給語言模型仔細看。她說這和 RAG 的概念很像:先篩選,再在篩過的資訊上做精細的判斷。
第 50 頁是 GraphRAG(Peng 等 2024)的三欄比較:直接問 LLM,答錯;檢索文字段落,還是錯;檢索圖上的三元組,答對。投影片的結論是 KG can better help reasoning-intensive tasks。
三種流程
第 51 頁(Gao 等 2023)把常見的 RAG 流程分成三類:
- Iterative:檢索 → 生成 → 判斷資訊夠不夠,不夠就再檢索。老師的比喻是搜尋結果第一頁沒有答案,就按下一頁。
- Recursive:差別在每一輪會改寫要查的問題。前面查身高的例子就是:第一輪查得獎的是誰,第二輪改查這個人的身高。
- Adaptive:在檢索之前先有一個判斷,決定要不要查。
老師說現在各家模型的產品多半是 adaptive:沒必要時直接回答,需要時才進入檢索,而檢索那一段多半用 recursive 的方式,把問題拆小、推論該查什麼、查到資訊足夠為止。
Prompting、RAG、Fine-tuning 怎麼選
第 52 頁(Gao 等 2023)的圖有兩個軸:橫軸是模型要調整多少,縱軸是需要多少外部知識。Prompt engineering 在左下角,模型不動、也不用外部知識。往上是 RAG:需要外部知識,但不動模型。往右是 fine-tuning:改模型的參數。
第 53 頁用一個時事當例子。問一個資工系的學生:「NVIDIA 總部和新壽的合約牽涉哪些法律規範?」
- Prompting:用他既有的知識直接回答。領域對不上,容易出錯。
- RAG:給他法律的教科書,讀了再回答。
- Fine-tuning:請他先去修一門法律相關的課,學完再回來回答。
老師的判斷原則:資料給了他就看得懂,用 RAG 就夠。如果法律名詞對他來說是天書,給教科書也沒用,就需要 fine-tuning。Prompt 能解決就用 prompt,RAG 能解決就不考慮 fine-tuning,因為一個比一個麻煩。但 fine-tuning 的好處是長期的,知識融進去了,不用每次重讀法條。
第 54 頁的整理:
| 優點 | 缺點 | |
|---|---|---|
| Prompting | 簡單、有效率 | 完全依賴模型內部的知識 |
| RAG | 適合會變動的資訊,可解釋性高 | 延遲較高,品質取決於檢索 |
| Fine-tuning | 能深度客製模型的行為與風格 | 要重新訓練,成本高 |
老師對 fine-tuning 舉的例子是說話風格:看少少幾句學不來,要內化在模型裡。投影片的結論是:選 RAG 還是 fine-tuning,取決於資料變動的程度、客製化的需求,以及有多少運算資源。
Retriever 和 LLM 要不要一起訓練
第 55–56 頁列了四種:
- Training-free:兩邊都不訓練,檢索完直接交給 LLM。
- Independent training:各訓練各的。Retriever 學怎麼找相關文件,LLM 學怎麼回答。
- Sequential training:先訓練一個,固定之後再訓練另一個。老師說比較實際的是 LLM 固定、訓練 retriever:多數人動不了 LLM。這時 retriever 的目標不只是找到相關的文件,是找到能讓這個固定的 LLM 產生好答案的文件。
- Joint training:兩個一起訓練。老師說兩者的目標相關但不衝突,所以可以。
應用與優點
第 57 頁列了 RAG 的用途:最適合的是知識密集的任務(問答、事實查核、對話);一般的生成任務(摘要、翻譯、寫程式與證明)和分類任務(NLI、情感分析、常識推理)也用得上。老師舉情感分析的例子:如果能查到「很多人在這個場合用這個詞是在諷刺」,判斷會更準。
第 58 頁整理六個優點:準確(減少 hallucination)、即時、可解釋與可查證、可客製、安全與隱私、成本低。老師說明隱私那一點:RAG 沒有微調模型,機密文件不會進到參數裡。用開源模型架在自己的機器上,就不用擔心別人從模型問出內容。
第 59 頁用一個問題收尾:什麼時候該用 RAG?投影片列了四種情況:要用到長尾知識、知識會更新、需要可解釋性、有安全或隱私的考量。老師對最後一項的說明是,不希望文件外洩時,就不要把它微調進模型裡。
課堂問答選錄
影片 8.6 是課堂上用 Slido 收到的問題,沒有投影片。下面是和這一堂有關的幾題,問題的文字經過本文改寫:
- ChatGPT 回答時附了引用,就是用了 RAG 嗎? 是。有引用代表它先搜尋、拿來參照。但點進去發現根本沒用到那個網頁,也是有可能的。
- 怎麼知道它檢索了幾次、看了幾頁? 不知道,它沒有告訴你,現在的產品怎麼做也不完全透明。自己建系統才能自己設定。
- Reasoning 和 RAG 是什麼關係? 完全獨立的兩件事。可以不查資料而做複雜的推論,也可以查了資料再推論,也可以都不做。
- 用外部搜尋引擎做 RAG,會受搜尋引擎排序影響嗎? 會。候選不好,後面怎麼重排序都沒用。你還能做的是改寫問題,或判斷搜到的都不相關、不要放進去。但搜尋引擎那一段你控制不了。老師舉了一個例子:Google 搜尋原本可以一次要 100 筆結果,後來這個參數不能用了,一次只給 10 筆,要 100 筆就得搜 10 次,成本高很多。
- 為什麼不幫每筆資料加上時間,讓模型學會時序? 有人這樣做,但每句話都要加時間很繁雜,時間要寫到多細也不確定。這牽涉到時間上的推論,沒有那麼容易解決,有相關的研究在進行。
HW3:訓練 retriever 與 reranker
8.5 的結尾公告當天釋出 HW3,要實作 RAG,包含 retriever 與 reranker。
說明影片是照著一份作業投影片講的,本文手上沒有那份投影片,下面整理自助教的口述。逐字稿的模型名稱與數字可能有聽錯,實際修課請以課程公告為準。
- 系統:retriever 把語料庫與 query 轉成 embedding 做初步檢索,reranker 把初步結果重新排序,最後用 prompt 讓 LLM 依檢索到的段落回答。
- 要做的事:微調 retriever 與 reranker,並設計 prompt。LLM 不能訓練,助教說這是考量每個人的運算資源不同。
- 模型:retriever 是 multilingual E5 small,reranker 是 MS MARCO 的 MiniLM 系列,LLM 是 Qwen3 1.7B(逐字稿聽作「QM3」,名稱是本文推定的)。Retriever 用 bi-encoder,reranker 把兩段文字一起餵進同一個模型,和這一堂講的分工一致。
- 資料:語料庫(每行一段 passage)、qrels(每個 query 對應的正例 passage)、訓練與測試資料。每筆資料有 query(欄位名稱是 rewrite)、一份用 BM25 抽出來的候選 passage 清單與對應的正負標記、以及期望的答案。答案可能是正例 passage 裡的一段文字,也可能是「無法回答」的固定字串:就算有對應的正例,如果裡面的資訊不足以回答,期望模型說無法回答。
- 訓練:retriever 要讓 query 的向量和正例接近、和負例遠離,損失函數自己選;reranker 要讓正例的分數高、負例的分數低。負例可以用附的清單,也可以自己抽。
- 評估:Recall@10 與 MRR@10,看 retriever 加 reranker 找回的前 10 段。前 10 段裡有正確的段落,Recall 就算命中;MRR 看正確的段落排在第幾名,越前面越好。另外還有 LLM 的答案與標準答案的句向量相似度。
- 不能做的事:使用額外的訓練資料、把測試資料拿來訓練、設法找出 private 測試資料。
- 加分題:用強化學習訓練一個小模型(助教舉的例子是多層感知器,reward 用 LLM 的回答與標準答案的相似度),動態決定要放幾段 passage 給 LLM。預設是放重排序後的前三段。助教的說明是:如果排第一的就是正確的段落,只放一段可以減少雜訊;如果正確的段落排得比較後面,就要多放幾段。
助教最後提醒,這次的 1.7B 模型和 HW2 的 4B 模型在行為上可能有些差異,prompt 要依手上的模型調整。
說明影片只說作業連結放在作業投影片裡,沒有提供公開的資料集連結。想練習的話,可以挑一個公開的問答資料集,先用 BM25 當基準,再用上面的對比損失微調一個 dense retriever,最後加一層 reranker,比較三個階段的 Recall@10 與 MRR@10。
常見的誤解
以下是本文的歸納,不是課堂上逐條列出的內容。
- 「用了 RAG 就不會有 hallucination。」 只是減少。模型還是會混入自己的知識與推論,檢索回來的內容本身也可能不相關或有錯。
- 「段落切得越細,檢索越準。」 太細會把本來要一起看的內容拆散,要比對的數量也變多。切多大要看應用和文件的樣子。
- 「Dense retrieval 一定要自己訓練。」 不用。直接用現成的 embedding 是業界最常見的做法,不需要訓練資料。
- 「Cross-encoder 比較準,所以檢索就該用它。」 它要把 query 和每一份文件接起來各跑一次模型,文件多時成本太高,所以放在重排序。
- 「訓練 retriever 一定要有人工標的 query 與文件配對。」 可以用語言模型算 P(q | d) 當標記,只需要 query。
- 「查得越多次越好。」 表現會變好,但推論更慢、成本更高;本來就會的題目去查是多餘的。
- 「RAG 和 reasoning 是同一件事。」 兩者獨立。一個是有沒有用外部資料,一個是有沒有做推論。
自我檢查
題目是本文自擬的,答案都能從上面的內容找到。
1. 只靠參數記憶有哪四個限制?
記不住所有東西(長尾)、世界會變(過時)、碰不到私有文件、黑盒子難以查證。
2. 文件寫的是「大型語言模型」,使用者搜「LLM」。Sparse 與 dense retrieval 各會怎樣?
Sparse 靠共同出現的詞計分,兩者沒有相同的詞,找不到。Dense 比的是語意向量,有機會找到。
3. Bi-encoder 和 cross-encoder 哪個效果好?為什麼檢索階段用的是另一個?
Cross-encoder 效果好,因為 query 和文件可以直接互相做 attention。但它對每一份文件都要跑一次模型,文件很多時太貴,所以檢索用 bi-encoder,重排序才用 cross-encoder。
4. 對比損失裡,正例的分數是 1,三個負例的分數都是 1。損失是多少?
四個分數相同,正例的機率是 1/4,損失是 −ln(1/4) ≈ 1.39。
5. 沒有 query 與文件配成對的標註資料時,怎麼訓練 dense retriever?需要先有什麼?
收集一批 query,用語言模型對每份候選文件算 P(q | d),機率高的當正例。需要 query,不需要人工標註。
6. 第一階段回來 20 份候選。Pointwise 與每對都比的 pairwise 各要評幾次?
20 次與 20 × 19 ÷ 2 = 190 次。
7. 「贏得某個獎的球員身高多少」為什麼查一次不夠?
這是 multi-hop 的問題。第一次只能查到得獎的是誰,要用這個結果再查一次才有身高。
8. Search-R1 只用答案正確當 reward 會有什麼問題?AdaSearch 怎麼改?
只要搜了會對就被鼓勵去搜,連不用搜也會對的題目都搜,造成 oversearch。AdaSearch 在 reward 裡加上「決定是否正確」,要模型先判斷自己會不會。
9. kNN-LM 和一般的 RAG 差在哪裡?它的缺點是什麼?
檢索的單位是 token,檢索結果用在輸出層,和語言模型的分布混合,而且每個 token 都查。缺點是所有訓練前文都要存,很占空間;每個 token 都查也沒有效率,所以後來改成視情況才查。
10. 你要讓模型學會某個人的說話風格,該用 RAG 還是 fine-tuning?如果是要它回答公司每週更新的內部規定呢?
風格要內化在模型裡,看幾句範例學不來,用 fine-tuning。每週更新的內部規定是會變動的私有資料,用 RAG。
延伸閱讀
- CS224N 第 10 堂:RAG 與 Language Agents 的六個元件
- RAG 系統模式完整指南:從 Naive 到 Multi-Agent 的十代演化與實戰導航
- RAG vs Fine-tuning:不是非此即彼
課程影片來源
以下影片已於 2026-10-10 對照官方課程頁與官方 YouTube 播放清單(講次編號與標題相符);不提供時間跳轉。
原始影片:ADL 8.1: Retrieval-Augmented Generation (RAG)(YouTube)、ADL 8.2: RAG Framework 基本設計流程(YouTube)、ADL 8.3: Advanced RAG 如何改進 RAG 效果呢?(YouTube)、ADL 8.4: RAG Roadmap RAG 發展與各種不同的嘗試(YouTube)、ADL 8.5: RAG Pros & Cons 多種RAG類型與優劣比較(YouTube)、ADL 8.6: RAG Q&A(YouTube)、ADL 2025 Fall Homework 3(YouTube)
課程與錄影入口:
查核日期:2026-10-13。
內容核對:已依字幕核對(2026-10-13):8.1 到 8.5 依字幕整理。8.6 與 HW3 說明影片沒有字幕,本文把音訊用語音辨識轉成逐字稿後整理,逐字稿可能有聽錯的專有名詞與數字。公式、表格與圖上的數字以講義頁面為準。
更新紀錄
- 2026-10-10:標註影片狀態,核對錄影來源與取得方式。
- 2026-10-13:依六支影片的課堂口述重寫,補上 8.3 到 8.6 與 HW3 說明影片的內容、三個例子、常見誤解與附答案的自我檢查。
參考資料
- ADL Fall 2025(114-1)課程頁 — 10/13 講次、影片、講義與 HW 3 連結
- RAG 講義(251013_RAG.pdf) — 本文頁碼來源
- ADL 2025 Fall Homework 3(YouTube)
- 2025 Fall 台大資訊 深度學習之應用 NTU CSIE ADL 播放清單
- ACL 2023 Tutorial: Retrieval-based Language Models and Applications — roadmap 的來源
- Nakano et al., WebGPT
- Lewis et al., Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks
- Karpukhin et al., Dense Passage Retrieval for Open-Domain Question Answering
- Izacard et al., Unsupervised Dense Information Retrieval with Contrastive Learning(Contriever)
- Borgeaud et al., Improving language models by retrieving from trillions of tokens(RETRO)
- Jiang et al., Active Retrieval Augmented Generation(FLARE)
- Jin et al., Search-R1
- Khandelwal et al., Generalization through Memorization: Nearest Neighbor Language Models
- Shao et al., Enhancing Retrieval-Augmented LLMs with Iterative Retrieval-Generation Synergy(ITER-RETGEN)
- Gao et al., Retrieval-Augmented Generation for Large Language Models: A Survey
- Peng et al., Graph Retrieval-Augmented Generation: A Survey
- Fan et al., A Survey on RAG Meeting LLMs