跳到主要内容

创建日期:2026-09-23 | 最近更新:2026-09-23 章节号与节标题均为逐字核对自原书官方目录(nlp.stanford.edu/IR-book/html/htmledition/irbook.html,抓取日期 2026-09-23,留档于 source/ir-book-outline/)。 习题是我自己设计的,不是原书习题的搬运;每题都接到本仓库 RAG 专题已有的实测与脚本上。

《信息检索导论》· RAG 相关章节:阅读提纲与习题

一句话:这本书 2008 年出版,比 RAG 早得多——所以读它的方式是「读思想,不读结论」。

书里没有 embedding、没有 RAG、没有 ANN,指望它教你「怎么做 RAG」会失望。但它把三件事讲透了,而这三件事恰好是 RAG 检索层最难自己悟出来的部分:

  1. 分数是怎么来的(tf-idf → BM25 的推导链)——你现在调的 k1、b 是从哪冒出来的;
  2. 怎么判断检索好坏——不是「感觉准了」,是 precision / recall / MAP / nDCG,以及它们的适用前提;
  3. 查询改写的经典方法——Rocchio、伪相关反馈,今天仍然是对「召回不出来」的有效手段。

(作者:Christopher D. Manning、Prabhakar Raghavan、Hinrich Schütze,Cambridge University Press 2008。作者本人把全书 HTML/PDF 放在斯坦福站点上供在线阅读,所以不用买也能读。)

0. 怎么用这份提纲​

全书 21 章,与 RAG 相关的只有 4 章必读 + 5 章略读,其余 12 章可以直接跳过。 别按书的顺序从第 1 章啃到尾——前 5 章是倒排索引的工程细节,现代向量库早就把它们封装掉了。

建议阅读顺序(不是书的自然顺序):

理由:先建立「分数」的直觉(第 6 章),再回头看它的理论出处(第 11 章,BM25 就在这里),然后才有资格谈「怎么评价」(第 8 章),最后才是「分数不好时怎么补救」(第 9 章)。先读第 8 章容易变成背指标名——你还没算过分数,评价什么?

做题优先于读书:§5 的 11 道题里,有 4 道能直接复用本仓库已有的脚本(source/rag-boundary-lab/retrievers.py 里已经有一个 BM25 实现),边跑边读比读完再跑有效得多。

1. 总表:读什么、跳什么​

章标题(逐字)对 RAG怎么读
1Boolean retrieval低只读「An example information retrieval problem」建立直觉;布尔检索本身对 RAG 无用
2The term vocabulary & postings lists中只读「Determining the vocabulary of terms」整节(分词/停用词/归一化/词干化)——见 §3
3Dictionaries and tolerant retrieval中只读「Spelling correction」整节——query 有错别字/变体时的经典解法
4Index construction无跳(倒排索引进阶工程)
5Index compression无跳
6Scoring, term weighting & the vector space model高必读,节级提纲见 §2.1
7Computing scores in a complete search system中只读「Inexact top K document retrieval」及其子节——这是「近似检索可接受」的经典论证
8Evaluation in information retrieval高必读,见 §2.2
9Relevance feedback & query expansion高必读,见 §2.3
10XML retrieval无跳
11Probabilistic information retrieval高必读(BM25 在这里),见 §2.4
12Language models for information retrieval低想理解「检索即生成概率」可略读;与 RAG 的生成端不是一回事
13–15Text classification / Vector space classification / SVM低跳——除非你要自己微调 reranker
16–17Flat clustering / Hierarchical clustering低跳——除非要做语料去重与主题组织
18Matrix decompositions & latent semantic indexing中只读「Latent semantic indexing」一节——稠密向量表示的思想前身,想理解 embedding 从哪来可看
19–21Web search basics / Web crawling / Link analysis无跳(PageRank 与 RAG 无关)

2. 必读四章:节级提纲​

下面每一节的标题都是从原书目录逐字抄下来的。★ = 对 RAG 直接有用;○ = 可跳。

2.1 Ch 6 · Scoring, term weighting and the vector space model​

节RAG 视角
★ Term frequency and weightingtf 与 idf 的由来。为什么高频词要「次线性」缩放(1 + log tf)——这解释了 BM25 里那个饱和项的设计动机
★ └ Inverse document frequencyidf 就是「稀有词更有信息量」的数学化。注意:稠密向量没有这个机制,这是 BM25 在精确串上仍然能赢的根源之一
★ └ Tf-idf weighting老一代检索的标准打分;今天的混合检索里 BM25 是它的进化版
★ The vector space model for scoring余弦相似度的出处。今天 embedding 检索用的还是这个度量
★ └ Queries as vectorsquery 也当成一个(很短的)向量——「短文本向量噪声大」的根源
★ Variant tf-idf functions长度归一化的各种变体,尤其 ○ 之外的「Pivoted normalized document length」:RAG 里 chunk 长短差异极大(一句话 vs 一整节),这里的讨论直接相关
○ Parametric and zone indexes / References可跳(字段加权与现代元数据过滤是同源思想,但书里讲的是老实现)

2.2 Ch 8 · Evaluation in information retrieval​

节RAG 视角
★ Evaluation of unranked retrieval setsprecision / recall / F-measure 的定义与权衡。RAG 里「召回块是否够多」与「上下文是否被噪声挤占」就是这一对
★ Evaluation of ranked retrieval resultsMAP、NDCG 等排序指标。关键认知:RAG 是排序问题,不是「检索到没有」的二分问题
★ Standard test collections黄金集是怎么被建出来的(Cranfield 范式)——建自己的评测集时照这个思路
★ Assessing relevance相关性是人的判断,不是客观量。这一节(含「Critiques and justifications of the concept of relevance」)能救命——我第 1 篇就是在这里栽的(见习题 8-3)
○ Information retrieval system evaluation / A broader perspective / Results snippets略读;「Refining a deployed system」对上线后调优有启发

2.3 Ch 9 · Relevance feedback and query expansion​

节RAG 视角
★ The Rocchio algorithm for relevance feedback把 query 向量往「相关文档质心」挪——纯向量操作,无需重训;RAG 里可实现为「用第一轮 top-k 的质心重检索」
★ Pseudo relevance feedback假设第一轮 top-k 就是相关的,直接用它做反馈。零人工成本,但会放大第一轮的错误(这是它的风险,也是它的边界)
★ When does relevance feedback work?这一节就是「边界」,读它比读方法更重要
★ Query expansion / Vocabulary tools for query reformulation同义词表、词形变体扩展——中文场景下要自己建词表
○ Probabilistic relevance feedback / Relevance feedback on the web / Automatic thesaurus generation略读

2.4 Ch 11 · Probabilistic information retrieval​

节RAG 视角
★ The Probability Ranking Principle「按相关性概率降序排」为什么是最优的——检索排序的理论地基
★ The Binary Independence ModelBM25 的直系祖先。看不懂 BIM 就不要去调 k1/b
★ └ Probability estimates in practice理论上的概率估计在现实中不可行 → 才需要 BM25 这种启发式。这一节解释了「为什么 BM25 是一个工程折中」
★★ Okapi BM25: a non-binary modelBM25 就在这里(在「An appraisal and some extensions」下)。很多人以为它单独成章或放在第 6 章——原书目录里它是 §11.4.3。你天天用的 k1、b 的出处就是这十几页
○ Bayesian network approaches / Tree-structured dependencies跳

⚠️ 一个容易踩的坑:BM25 在书里只是被作为一个「扩展」简短带过,不是重点章节。 所以「读原书学 BM25」的效率其实不高——更实在的做法是读原书的推导框架(§11.3 BIM)+ 直接看现代实现的公式(本仓库 source/rag-boundary-lab/retrievers.py 里那个实现就是按标准公式写的)。习题 11-1、11-3 就是干这个的。

3. 略读三章的要点​

  • Ch 2「Determining the vocabulary of terms」整节(Tokenization / Dropping common terms: stop words / Normalization / Stemming and lemmatization)——这一节对 RAG 的切片与向量化直接有用,而且解释了我第 2 篇实测到的怪事:PDF 抽出的康熙部首字符(⽹ U+2F79 而非 网 U+7F51)本质上就是归一化没做。中文还多一层:书里的 tokenization 假设有空格,中文没有——习题 2-1 就是处理这个。
  • Ch 3「Spelling correction」整节(含 Edit distance / k-gram indexes)——用户 query 有错别字时的经典解法。今天的做法(模糊匹配、同义词表)思想同源。
  • Ch 7「Inexact top K document retrieval」(Inexact top K / Index elimination / Champion lists / Cluster pruning)——「为了速度放弃精确 top-K 是可以接受的」这个判断的原始出处。理解 HNSW/IVF 为什么敢近似,读这几节最省事。
  • Ch 18「Latent semantic indexing」——把词-文档矩阵做 SVD 降维,得到「潜在语义」空间。这是稠密向量的思想前身(当然,今天的 embedding 不是这么训出来的,别把两者当同一件事)。

4. 习题​

每题给:目标 / 要求 / 验收标准 / 可复用的现成件。 注意:其中几道题会直接检验本仓库已有文章的结论,包括检验我写在文章里的判断对不对。做出来和我说的不一致,是本仓库欢迎的结果——请把不一致记下来。

Ch 6​

6-1 手算 tf-idf 与余弦

  • 目标:把「余弦相似度」从公式变成手感。
  • 要求:自造 3 篇短文档 + 1 条 query,手算 tf-idf 向量(写清你用哪个 tf 缩放、哪个 idf 变体、是否 L2 归一化),给出排序;再用 numpy 复现同一口径。
  • 验收:手算与代码结果逐位一致;如果对不上,能说出差异出在哪个口径上(对数底、平滑、归一化)。
  • 复用:source/rag-boundary-lab/ 的代码结构。

6-2 长度偏置 vs 向量稀释(两个方向相反的力)

  • 目标:分清两个经常被混为一谈的现象。
  • 要求:用第 2 篇的语料(长技术块 + 短表格句),比较「不做长度归一化」与「L2 归一化后」的 top-1 命中;然后回答:「长文档在 tf 上占便宜」和「长块向量被稀释」,是同一个现象吗?方向一致吗?
  • 验收:能用一句话说清两股力的方向,并指出第 2 篇实测的「块越大命中越低」主要是哪一股力造成的(或说明无法区分)。
  • 复用:source/rag-chunking-lab/chunkers.py。

Ch 8​

8-1 指标换血:hit@1 换成 MAP@10 / nDCG@10

  • 目标:看清「指标选择」如何影响结论。
  • 要求:用第 3 篇的 22 条 query 与四种组合,把指标从 hit@k 换成 MAP@10 与 nDCG@10,看四种组合的排名是否变化。
  • 验收:必须回答一个关键问题——用我现有的标注(只有「gold 块集合」,没有相关性分级)能不能算出真正的 NDCG?如果不能,需要补什么标注? (提示:nDCG 依赖分级相关性,而我标的是二值。这一题的正确答案包含「我的数据不足以算 NDCG」这个结论。)
  • 复用:source/rag-boundary-lab/bench_boundary.py。

8-2 要多少条 query 才敢下结论

  • 目标:把「样本量太小」这句话量化。
  • 要求:用二项分布(或自助法)估算:在 22 条 query 的规模下,两种检索组合相差 1~2 个命中,达到 p < 0.05 需要多少条 query 才能检测出来?
  • 验收:给出数字与计算过程,并解释为什么第 3 篇里写的是「只看趋势、不读单点」。
  • 复用:无需脚本,纯计算(几行 numpy 即可)。

8-3 重新裁决我第 1 篇的那个「重排翻车」

  • 目标:用书里的观点重审一个具体判断。
  • 要求:读「Assessing relevance」整节(含对相关性概念的批评),然后回到第 1 篇的用例 3——那条我把「重排把 gold 挤到第 2」归因为我自己的标注歧义。按这一节的观点重新裁决:它到底算不算重排的错误? 我的归因站得住吗?
  • 验收:给出你自己的裁决与理由;如果结论和我不同,把差异写清楚。

Ch 9​

9-1(最推荐)用伪相关反馈去救第 3 篇的 A 类

  • 目标:检验一个真实的开放问题——第 3 篇里 A 类(语义改写型)四种组合全灭(最好 2/6),第 9 章的方法能不能救?
  • 要求:对 A 类 6 条 query,实现伪相关反馈:取第一轮的 top-3 当「相关」,把 query 向量往它们的质心挪(Rocchio 的 α、β 自己定),再检索一次,报告 hit@1 变化。
  • 验收:必须讨论前提是否成立——PRF 假设「第一轮 top-3 是相关的」,而 A 类的问题恰恰是第一轮排得不好。如果 top-3 里根本没有正确答案,这个方法的边界在哪?
  • 复用:source/rag-boundary-lab/bench_boundary.py 的 A 类 query 与语料。
  • 加分:把结果与第 3 篇的 混合+重排(A 类 2/6)对比,判断这两条路是不是互补。

9-2 查询扩展的代价

  • 目标:体会「扩展能提召回,但也会引入噪声」。
  • 要求:手工给 3 条 A 类 query 各加 1~2 个同义词(中文要自己判断同义边界),报告命中变化;再故意加一个错词,看它怎么把结果带偏。
  • 验收:能指出「扩错了会怎样」,并给出一个判断「该不该扩」的可操作标准。

Ch 11​

11-1 手算 BM25 并推到极限

  • 目标:把 BM25 的公式变成手感,理解两个参数各管什么。
  • 要求:自造 3 篇文档 + 1 条 query,手算 k1=1.5, b=0.75 下的 BM25 分数;然后推导三种极限:k1 → ∞、b = 0、b = 1 时公式退化成什么。
  • 验收:手算与 retrievers.py 的实现一致;能用一句话说清 k1 管「词频饱和」、b 管「长度归一化强度」。
  • 复用:source/rag-boundary-lab/retrievers.py(BM25 实现,k1=1.5 / b=0.75)。

11-2 参数扫描:b=1 会不会坑了表格

  • 目标:把参数和语料特性挂上钩。
  • 要求:在第 3 篇的语料上扫 k1 ∈ {0.5, 1.2, 1.5, 2.0} × b ∈ {0, 0.3, 0.75, 1},看 B 类(精确串)与 C 类(数值表格)的 hit@1 怎么变。
  • 验收:必须回答:C 类的文档是「一格一句」的极短文本,b=1(完全按长度归一化)会把它怎么处理?这是好事还是坏事?
  • 复用:source/rag-boundary-lab/bench_boundary.py(把 BM25 的构造参数改成可扫的)。

11-3 从 BIM 到 BM25:不抄公式地讲清两个参数

  • 目标:读推导,不当公式的搬运工。
  • 要求:读 §11.2(The Binary Independence Model)到 §11.4.3(Okapi BM25),然后不许抄公式,用几句话说明:k1 与 b 分别对应模型里的什么假设?为什么要引入它们(BIM 缺了什么)?
  • 验收:如果你的解释里出现了「tf 饱和」「文档长度偏置」但说不清它们各自解决 BIM 的哪个缺陷,就算没过。

Ch 2​

2-1(推荐)中文 BM25 的分词选择——顺便结掉第 3 篇的一个疑点

  • 目标:检验我在第 3 篇留下的疑问。
  • 背景:第 3 篇里 BM25 在 B 类(精确串)上只有 2/6,我写了「这个结论要按『单字 + bigram、无词典』这个配置来读」——那换成正经分词会变好吗?
  • 要求:对同一份语料分别用三种切法建 BM25 索引:① 单字;② 单字 + 相邻 bigram(第 3 篇的做法);③ jieba 分词(或你手上的中文分词器),比较 B 类的 hit@1。
  • 验收:给出三种切法的数字对比,并回答:第 3 篇「BM25 不太行」的结论,有多少是分词造成的? 如果把 jieba 加上去仍然不行,那说明瓶颈在哪?
  • 复用:source/rag-boundary-lab/retrievers.py 的 tokenize_zh() 就是 ② 的实现,改起来只有几行。

5. 建议的做题顺序​

按「性价比」排(不是按章序):

顺序题为什么先做它
111-1 手算 BM25半小时以内,把最常用的公式变成手感;做完再看 11-3 的推导才读得进去
22-1 中文分词直接结掉第 3 篇的一个未解疑点,而且改动量极小
39-1 伪相关反馈唯一一道可能真正解决第 3 篇遗留问题的题(A 类 1/6);做不出来也是有价值的结论
48-2 样本量纯计算,但它决定你以后信不信前面所有实验的数字
5其余按兴趣

6. 来源与核对​

内容来源留档
全书 21 章标题与节级目录(逐字)https://nlp.stanford.edu/IR-book/html/htmledition/irbook.htmlofficial-irbook-full-toc.html
站点首页(在线版说明、作者与出版社信息)https://nlp.stanford.edu/IR-book/official-irbook-site-index.html
第 8 / 11 章的节索引页同上站点official-ch8-section-index.html、official-ch11-section-index.html

关于「BM25 在哪一章」的核对说明:这道题不能凭印象。我先取了站点首页(只有 21 个章标题),再取 irbook.html(含节级目录)才定位到 Okapi BM25: a non-binary model 属于第 11 章「An appraisal and some extensions」下的一个三级节。 中途还踩了一次坑:第 8 章页面的索引页只有标题没有节列表(LaTeX2HTML 生成的导航壳),换成 irbook.html 才拿到完整层次。