Skip to content

CS224U 資訊檢索:從 classical IR、IR 指標到 neural IR

2026年9月29日1 分鐘
TL;DRCS224U 2023 春季版花一整個單元講檢索,理由是 OpenQA 只給問題、證據要自己找,而大型語言模型會捏造來源。Potts 與 Omar Khattab 的投影片從 TF-IDF、BM25 講到 Success@K、MRR、average precision,再講 cross-encoder、DPR、ColBERT、SPLADE 四種 neural IR 在表達力與規模之間怎麼取捨,最後要你把延遲與成本也當成指標。

🌏 English version

版本說明:本文依據 CS224U 2023 春季版。主要材料是 Information retrieval 投影片(Christopher Potts 與 Omar Khattab,PDF 共 78 頁,投影片編號 62 張)與 XCS224U 播放清單 第 15–19 支錄影,事實皆於 2026-09-29 核對。存取等級 A3:投影片、錄影與相關作業 notebook 都公開;拿不到的是 Canvas quiz 與教室錄影。

系列位置:上一篇 作業一:多領域情感分析|下一篇 In-context learning|系列總覽

作業一是分類題:句子給你,你判斷它的情感。作業二換成另一種題型:只給你一個問題,回答所需的證據要自己去找。2023 年的講次表把這個單元叫「Retrieval augmented in-context learning」,拆成兩份投影片,先講資訊檢索(本篇),再講 in-context learning(下一篇),最後在作業二合起來。

這篇回答一個問題:為什麼一門自然語言理解的課,要花一整個單元講搜尋引擎的技術?

為什麼 NLU 課要講檢索

投影片第一節「Guiding ideas」給了兩個方向相反的理由。

檢索本身就是一個難的理解問題

Potts 在 IR 第 1 支錄影 舉的例子:查詢是「什麼化合物能保護消化系統對抗病毒」,相關的文件講的是「胃裡的胃酸與蛋白酶是對抗攝入病原體的強力化學防線」。

兩句話的關鍵詞沒有任何字串重疊。要把它們連起來,靠的完全是語意。所以 NLU 技術越強,檢索就做得越好,這是「NLP 正在改變 IR」的那一面。

檢索也在改變 NLP

另一面是 Potts 自己比較在意的:檢索讓 NLP 的任務變得更開放、更接近真實需求。投影片用問答對照:

標準 QA(如 SQuAD)OpenQA
訓練時給什麼標題、段落、問題、答案只有問題與答案
測試時給什麼標題、段落、問題只有問題
答案保證是段落裡的字面子字串沒有保證;段落要自己檢索

標準 QA 對現在的模型已經不難,但它跟真實世界脫節:現實裡很少有人把正確段落先遞給你。OpenQA 難得多,也更像實際在網路上查資料。

投影片接著列了一批「知識密集型任務」:問答、事實查核、常識推理、長篇閱讀理解、資訊尋求型對話,外加摘要與自然語言推論。後兩項通常被當成封閉任務,Potts 的主張是它們也能改寫成「先檢索再判斷」的版本,這是一個假設,他在錄影裡也這麼稱呼它。

三種搜尋範式,以及為什麼課程押第三種

flowchart LR
  Q[使用者查詢] --> A[Classical IR<br/>詞彙查表 + 文件打分]
  Q --> B[LLMs for everything<br/>模型直接生成答案]
  Q --> C[Neural IR<br/>稠密表徵 + 打分]
  A --> R1[排序好的文件清單]
  B --> R2[一段答案<br/>不知道從哪來]
  C --> R3[排序好的文件清單<br/>在語意空間裡比對]

投影片把搜尋分成三種:傳統的詞彙查表、「LLMs for everything」(查詢丟給大型語言模型,直接吐出答案),以及 neural IR。第二種的體驗最直接,Potts 卻明講他很擔心:模型會捏造證據,而你不知道答案從哪來。

錄影裡的例子很具體。他請 OpenAI 的模型替「職棒球員可不可以在帽子上黏小翅膀」這個問題附上證據,模型給的連結全是捏造的,點進去都是 404。他認為這比不給證據還糟,因為大家已經習慣把 URL 當成可信的依據。另一個例子是 Bing 回答 DSP 論文圖一裡的示範問題時,引用的證據正是那篇論文本身,而那張圖只是說明用的例子。

課程押的是第三種:保留傳統搜尋「回傳可檢查的文件」這個契約,只把比對搬進更豐富的語意空間。Khattab、Potts 與 Zaharia 在 2021 年的 SAIL 部落格文章(講次表上的 Khattab et al. 2021)把這個立場寫成三個好處:模型可以更小更快、答案附得出來源、知識更新只要改語料庫。

Classical IR:TF-IDF 與 BM25

第二節從詞彙—文件矩陣講起。

TF-IDF 由兩部分相乘:詞頻(這個詞在文件裡佔多少比例)與逆文件頻率(出現在越多文件裡的詞,權重越低)。投影片的小例子很好記:一個詞如果出現在全部四份文件裡,IDF 是 0,等於對排序毫無貢獻。

BM25(Best Match, Attempt #25,出自 Robertson & Zaragoza 2009)在 TF-IDF 上做了三件事,投影片各用一張圖說明:

  • 平滑過的 IDF,避免極端值。
  • 參數 b 控制文件長度懲罰:同樣的詞頻,長文件得分較低。
  • 參數 k 讓高詞頻的效益遞減:一個詞出現十次,不會比出現五次重要一倍。

投影片給的預設值是 k = 1.2、b = 0.75 左右。

BM25 公式(依投影片)
  • IDF_BM25(w, D) = log(1 + (|D| − df(w, D) + 0.5) / (df(w, D) + 0.5))
  • Score_BM25(w, doc) = TF(w, doc) · (k + 1) / (TF(w, doc) + k · (1 − b + b · |doc| / avgdoclen))
  • BM25(w, doc, D) = Score_BM25(w, doc) · IDF_BM25(w, D)

查詢與文件的相關分數,是查詢裡每個詞的權重加總。

實作上,這些分數會預先算好存在倒排索引裡:每個詞對應一串(文件, 分數)。查詢進來時查表、加總、排序,這就是我們熟悉的搜尋體驗。

投影片也列了詞彙比對之外的傳統手法(查詢與文件擴展、片語搜尋、詞彙相依、不同欄位、PageRank 這類連結分析、learning to rank),以及三個工具:Elasticsearch、Pyserini、PrimeQA。

IR 指標:沒有唯一答案

第三節先提醒指標有很多維度:準確度類指標之外,還有延遲、吞吐量、FLOPs、磁碟用量、記憶體用量與總成本。這一節的前半只講準確度類。

投影片用同一組三個排序(D1、D2、D3,各有三份相關文件)逐一算下面這些指標:

指標在量什麼
Success@K前 K 名裡有沒有至少一份相關文件(0 或 1)
RR@K/MRR@K第一份相關文件排第幾名,取倒數;MRR 是多個查詢的平均
Precision@K前 K 名裡相關文件的比例
Recall@K所有相關文件裡,有多少出現在前 K 名
Average precision在每個相關文件出現的位置算一次 precision,加總後除以相關文件數

同一組排序,換一個指標結論就可能換。例子裡 Success@2 認為 D1 與 D2 一樣好;改看 average precision,D3 反而略勝 D2,這是前面幾個指標在 K 取小值時看不出來的。

投影片給的選擇原則:

  • 使用者往下翻 K 筆的成本很低 → Success@K 可能就夠。
  • 每個查詢有多份相關文件 → Success 與 RR 太粗。
  • 找齊所有相關文件最重要 → 看 recall。
  • 只想看相關的、不想浪費時間審閱 → 看 precision。
  • Average precision 的區分最細,同時對排名、precision、recall 敏感。

準確度之外

這一節最後放了一張從各論文整理出的 MS MARCO 排行表(出自 Santhanam et al. 2022c)。準確度那一欄,PLAID ColBERTv2 的 MRR@10 是 39.4,BM25 只有 18.7;但 ColBERT 那幾列的硬體欄都列了多顆 GPU(表註說明其中一筆 PLAID 結果實際沒用到 GPU),而 BT-SPLADE 系列完全不用 GPU,分數也接近 ColBERT。

Potts 在 IR 第 3 支錄影 用成本對準確度的圖講 Pareto frontier:BM25 很便宜但效果差,幾乎同樣成本換成小型 BT-SPLADE,MRR 就大幅上升。哪個系統「最好」,取決於你把哪些維度算進來。

Neural IR:表達力與規模的取捨

第四節是這個單元的核心。背景設定是:拿一個預訓練的 BERT,把它微調成檢索模型。四種做法落在一條光譜上。

模型怎麼編碼優點代價
Cross-encoder查詢與文件串在一起進 BERT,取 [CLS] 上的表徵打分所有 token 之間都能互動,語意最豐富每份文件都要在查詢時跑一次;十億份文件就是十億次前向傳播
DPR查詢與文件分開編碼,各取 [CLS] 一個向量,內積打分文件向量可以離線算好,每份只存一個向量所有資訊要擠進單一向量,token 層級的互動全沒了
ColBERT分開編碼,但保留每個 token 的向量,用 MaxSim 打分可擴展,又保留 token 層級的延後互動索引要存 token 層級向量,體積大
SPLADE對整個詞彙表打分,得到詞彙表長度的稀疏向量,內積打分回到「詞彙比對」的傳統直覺,但在神經表徵裡做需要正則化項讓分數稀疏且平衡

前三種共用同一個損失函式:正例文件分數的負對數似然,分母是正例加上所有負例的分數總和。投影片特別把這點拉出來,說明這些模型差別只在「怎麼比較查詢與文件」。

ColBERT 怎麼變快

投影片給 ColBERT 的篇幅明顯最多(Potts 自己在錄影裡說他偏心 ColBERT)。它依序介紹三種用法:

  1. 當 reranker:先用 BM25 這類快速模型撈前 K 份,再用 ColBERT 重新打分。
  2. 直接檢索:對查詢的每個 token 向量,撈最相似的文件 token 向量,再對那些文件完整打分。
  3. 以 centroid 為基礎:先找離查詢向量最近的幾個 centroid,只在那附近找 token 向量,大幅縮小搜尋範圍。

IR 第 4 支錄影 講了 PLAID 的延遲分析:做完上述優化,ColBERT 的延遲仍有 287 毫秒,而可部署的目標大約是 50 毫秒。瓶頸不在 centroid,而在查大型索引與解壓縮低位元的 token 向量。PLAID 減掉這部分開銷後,延遲降到 58 毫秒。Potts 用這個例子說明:不追準確度、改追延遲,同樣是有價值的研究方向。

投影片最後列了一串近期發展,多數也跟 ColBERT 有關:CITADEL、更快的 SPLADE 變體、DESSERT、把 ColBERT 蒸餾成單向量模型、多語言蒸餾等。

資料集與這個單元沒講完的事

第五節列了幾個常用資料集:

  • TREC:每年的檢索競賽,強調仔細評估少量查詢(例如 50 個查詢、每個超過 100 份標注文件)。
  • MS MARCO:投影片說它是最大的公開 IR benchmark,超過 50 萬個 Bing 查詢;標籤很稀疏,大約每個查詢只有一個相關標籤,但很適合訓練。passage ranking 有 900 萬短段落,document ranking 有 300 萬長文件。
  • BEIR:跨領域的 zero-shot 評估。
  • LoTTE:ColBERTv2 論文一起釋出,主要取材自 StackExchange,也是 zero-shot 評估用。
  • XOR-TyDi:多語言的資訊尋求型 QA 與 OpenQA。

錄影裡另外點了三個沒展開的主題:負例怎麼取樣、弱監督(例如「段落裡含有答案字串就算相關」這種簡單啟發式,Potts 說效果出奇地好),以及用 Dynascores 把準確度、成本、延遲合成單一排行(課程後面的方法論單元會再講)。

投影片的結語只有一句:NLU 與 IR 又重新走在一起了。

自學怎麼用這個單元

  1. 先看 IR 第 1 支錄影(guiding ideas),它是整個單元的動機,也是作業二的橋。
  2. 拿投影片的 D1/D2/D3 例子,自己把五個指標算一遍,再對答案。這是最快確認你懂 average precision 的方法。
  3. Neural IR 那一節搭配 ColBERT 與 DPR 原論文的架構圖讀。
  4. 作業二(hw_openqa.ipynb)會用 ColBERTv2 當檢索器,需要的權重與索引檔大小見 系列總覽。

今晚可以做的一件事:拿你手邊任何一個搜尋功能(公司內部文件搜尋也行),寫下它最該看的是 Success@K、recall 還是 precision,理由用投影片那五條原則講。

延伸閱讀

參考資料