模块二-信息检索与搜索基础

发布时间:2026/6/27 10:26:06
模块二-信息检索与搜索基础 模块二-信息检索与搜索基础系列导航本文是 RAG 技术教程 的第二篇。上一篇模块一RAG 概述前置知识需了解模块一中的 RAG 基本概念检索器、知识库、LLM 三大组件。版权声明本系列基于 DeepLearning.AI 课程Building and Evaluating Advanced RAG Applications讲师 An Hassan整理为学习笔记性质的二次创作。原始课程版权归 DeepLearning.AI 及讲师所有。1. RAG 检索器关键词、语义与混合搜索的技术选型1.1 1. 检索器的挑战检索器的任务描述起来很简单从知识库中找到与用户提示最相关的文档。但实现起来困难重重。用户不会提交规范的查询语句而是像聊天一样用自然语言描述需求。知识库里的文档——邮件、备忘录、期刊——是为人类阅读设计的不是为计算机检索准备的。检索器必须处理这种杂乱信息并在毫秒级返回结果。本模块介绍三种搜索技术关键词搜索、语义搜索、元数据过滤以及它们如何组合成混合搜索。1.2 2. 关键词搜索TF-IDF / BM251.2.1 词袋模型与稀疏向量关键词搜索的核心思想很朴素文档包含提示中越多的关键词越可能相关。第一步是把文本转换成计算机能处理的形式。方法是构建词袋Bag of Words——把文本中所有词语扔进一个袋子只数每个词出现了几次完全忽略词语顺序。“制作披萨无需烤箱” → 披萨出现 2 次“制作”、“无需”、烤箱各 1 次。然后把词袋转换成稀疏向量。假设系统词汇表有 10000 个词披萨排在第 500 位“制作排在第 1200 位那么这句话的向量在第 500 位是 2第 1200 位是 1其余 9998 个位置都是 0。向量很长但绝大部分是零所以叫稀疏”。1.2.2 术语-文档矩阵与倒排索引把所有文档的稀疏向量排列成一个网格就是术语-文档矩阵每一列代表一个文档每一行代表一个词。这个矩阵也叫倒排索引——因为可以从一个词出发快速找到包含该词的所有文档与通常从文档出发思考包含哪些词相反。倒排索引可以在搜索前预先构建一次搜索时直接查表。1.2.3 简单评分的问题最简单的评分方法提示中的每个词叫关键词用关键词在倒排索引中查找每个包含该关键词的文档得一分。这个方法有两个明显问题问题一不区分词频。文档 A 包含披萨1 次文档 B 包含披萨20 次两者都得 1 分。但文档 B 明显更相关。问题二所有关键词权重相同。the出现在几乎所有文档中和pizza这样的专业词权重一样导致大量无关文档因为包含the而获得高分。1.2.4 TF 解决词频问题TF词频的思路文档包含关键词的次数越多得分越高。在术语-文档矩阵中对每个关键词的出现次数直接赋分。但新问题出现了长文档天然包含更多词。一篇 10000 字的文章包含披萨5 次一篇 100 字的菜谱也包含披萨5 次两者 TF 相同但菜谱的相关性显然更高。解决方法是文档长度归一化——把每个文档的分数除以自身词数平衡长短文档的竞争。1.2.5 IDF 解决权重问题IDF逆文档频率的思路在越多文档中出现的词区分度越低权重应该越小。IDF 的计算公式IDF(词) log(总文档数 / 包含该词的文档数)‍举个例子知识库有 100 篇文档pizza出现在 5 篇中the出现在所有 100 篇中。IDF(pizza) log(100 / 5) log(20) ≈ 1.30 IDF(the) log(100 / 100) log(1) 0pizza获得高权重the权重为零。使用对数是为了缓和极端值——罕见词仍有更高权重但不会过于夸张。1.2.6 TF-IDF 完整计算案例把 TF 和 IDF 结合起来就是 TF-IDF。下面用一个完整案例演示从零构建的全过程假设知识库有 3 篇文档用户查询披萨制作。第一步构建词汇表对三篇文档分词得到去重后的词汇表词汇表披萨制作需要面粉番茄酱纽约风格很有名意大利面条美食第二步构建术语-文档矩阵词频统计每个词在每篇文档中出现的次数词doc1 披萨制作需要面粉和番茄酱doc2 纽约风格披萨很有名doc3 意大利面条也是经典美食披萨110制作100需要100面粉100番茄酱100纽约010风格010很有名010意大利001面条001美食001第三步计算 TF词频归一化每个词的出现次数除以文档总词数doc1 共 6 个词 → 披萨的 TF 1/6 ≈ 0.167doc2 共 4 个词 → 披萨的 TF 1/4 0.25doc3 共 6 个词 → 披萨的 TF 0/6 0doc2 的披萨TF 更高因为虽然都出现 1 次但 doc2 更短披萨的占比更大。第四步计算 IDF逆文档频率IDF log(总文档数 / 包含该词的文档数)共 3 篇文档词出现在几篇文档中IDF log(3 / 几)披萨2log(1.5) ≈ 0.405制作1log(3) ≈ 1.099纽约1log(3) ≈ 1.099意大利1log(3) ≈ 1.099面条1log(3) ≈ 1.099披萨出现在 2/3 篇文档中区分度低IDF 较小。制作只出现在 1 篇中区分度高IDF 较大。第五步计算 TF-IDF 并搜索查询披萨制作分别查找披萨和制作的 TF-IDF 值累加得到每篇文档的总分文档披萨 TF-IDF制作 TF-IDF总分doc10.167 × 0.405 0.0680.167 × 1.099 0.1830.251doc20.25 × 0.405 0.1010 × 1.099 00.101doc30 × 0.405 00 × 1.099 00.000doc1 得分最高同时包含披萨和制作doc2 只包含披萨所以得分较低doc3 不包含任何查询词得分为零。这就是 TF-IDF 比简单计数更合理的地方——它同时考虑了词频、文档长度和词的区分度。1.2.7 从 TF-IDF 到 BM25TF-IDF 已经比简单评分好很多了但还有改进空间。BM25 的第一个改进词频饱和。TF-IDF 中词频是线性增长的——出现 20 次就是出现 10 次的两倍得分。但直觉上出现 20 次的文档并不比出现 10 次的具有两倍相关性。BM25 通过参数 k1 控制饱和程度得分随词频增加而递减。BM25 的第二个改进文档长度归一化递减。TF-IDF 的长度归一化对长文档惩罚是固定的。BM25 通过参数 b 控制随着文档长度增加惩罚逐步减弱长文档只要关键词频率相对较高仍能获得高分。1.2.8 BM25 计算案例沿用上面的知识库用户查询披萨制作设 BM25 参数 k1 1.5b 0.75。BM25 的单个词评分公式得分 IDF(词) × (词频 × (k1 1)) / (词频 k1 × (1 - b b × 文档长度 / 平均文档长度))其中 IDF 沿用前面的计算结果平均文档长度 (6 4 6) / 3 5.33。doc1共 6 个词披萨出现 1 次制作出现 1 次计算披萨的得分分子1 × (1.5 1) 2.5分母1 1.5 × (1 - 0.75 0.75 × 6 / 5.33) 1 1.5 × 1.094 2.641得分0.405 × 2.5 / 2.641 0.384计算制作的得分分子1 × (1.5 1) 2.5分母1 1.5 × 1.094 2.641得分1.099 × 2.5 / 2.641 1.040doc1 总分0.384 1.040 1.424doc2共 4 个词披萨出现 1 次制作出现 0 次计算披萨的得分分子1 × (1.5 1) 2.5分母1 1.5 × (1 - 0.75 0.75 × 4 / 5.33) 1 1.5 × 0.844 2.266得分0.405 × 2.5 / 2.266 0.447doc2 总分0.447 0 0.447doc3共 6 个词不含任何查询词总分 0.000最终排名文档BM25 总分doc1 披萨制作需要面粉和番茄酱1.424doc2 纽约风格披萨很有名0.447doc3 意大利面条也是经典美食0.000BM25 vs TF-IDF 的对比文档TF-IDF 得分BM25 得分doc10.2511.424doc20.1010.447doc30.0000.000doc1 和 doc2 的分差在 BM25 中被放大了0.251 vs 0.101 → 1.424 vs 0.447。原因在于 BM25 的词频饱和机制——doc2 更短但只包含披萨一个查询词doc1 更长却包含两个查询词BM25 通过文档长度归一化更精细地反映了这种差异。当文档长度偏离平均值时BM25 的惩罚/奖励比 TF-IDF 更温和长文档不会因为长度而被过度惩罚。1.2.9 关键词搜索的优势与局限关键词搜索的优势在于简单可靠。它确保检索到的文档包含用户提示中的精确关键词在用户使用技术术语或产品名称时尤为重要。而且它的性能通常能独立设定竞争基准更先进的技术有时难以超越。局限也很明显最终取决于查询是否包含与文档完全匹配的关键词。如果用户用的词和文档用的词不同但含义相似关键词搜索就找不到。这正是语义搜索要解决的问题。1.3 3. 语义搜索嵌入模型1.3.1 嵌入模型原理语义搜索根据含义的相似性匹配文档而非精确的词汇重合。它能捕捉关键词搜索遗漏的细微差别——快乐和高兴含义相同但关键词搜索无法匹配Python可能指编程语言也可能指蟒蛇但关键词搜索无法区分。核心工具是嵌入模型。嵌入模型将文本转换为密集向量通常数百到数千维语义相似的文本被映射到向量空间中邻近的位置。食物和美食会靠近“长号和猫会远离。实际的向量空间维度很高不存在简单的食物轴或动物轴”但数学原理不变向量提供了空间中位置的坐标。嵌入模型适用于多种输入单个单词、句子、甚至整个文档。不同类型的输入都会输出一个指定空间点的单个向量向量彼此接近就意味着文本含义相似。1.3.2 向量距离度量计算两个向量的相似度有三种常用方法度量衡量什么特点欧几里得距离两点间的直线距离直观但受向量长度影响余弦相似度两个向量方向的相似性不受长度影响范围 [-1, 1]点积一个向量在另一个上的投影同时考虑方向和长度用一个二维向量的例子说明三种度量的计算方式。假设查询向量 Q (3, 4)文档向量 D1 (3, 4)文档向量 D2 (6, 8)文档向量 D3 (-3, -4)。欧几里得距离就是两个点之间的直线距离公式是各维度差值的平方和再开根号。Q 到 D1√[(3-3)² (4-4)²] √0 0完全相同Q 到 D2√[(3-6)² (4-8)²] √(916) √25 5Q 到 D3√[(3-(-3))² (4-(-4))²] √(3664) √100 10D2 和 D1 方向相同但更远欧几里得距离会给出 5 而非 0——它只看有多远不看方向是否一致。余弦相似度衡量两个向量方向的夹角与长度无关。公式是两个向量的点积除以各自模长的乘积。Q 和 D1点积 3×3 4×4 25|Q| 5|D1| 5余弦 25 / (5×5) 1方向完全一致Q 和 D2点积 3×6 4×8 50|Q| 5|D2| 10余弦 50 / (5×10) 1方向相同长度不同但不影响Q 和 D3点积 3×(-3) 4×(-4) -25|Q| 5|D3| 5余弦 -25 / (5×5) -1方向完全相反D1 和 D2 方向一致余弦相似度都是 1。D3 方向相反余弦相似度为 -1。余弦相似度只关心方向不关心长度。点积一个向量在另一个向量上的投影长度。公式就是各维度对应相乘再求和。Q · D1 3×3 4×4 25Q · D2 3×6 4×8 50Q · D3 3×(-3) 4×(-4) -25D2 的点积比 D1 大因为 D2 更长。点积同时考虑方向和长度——方向一致且越长点积越大。在语义搜索中通常用余弦相似度只看方向因为文档长度不应该影响语义匹配的判断。1.3.3 语义搜索的工作流程所有文档嵌入模型文档向量空间用户提示嵌入模型提示向量计算距离按距离排序返回最近文档嵌入模型将所有文档投射到向量空间语义相近的文档自然靠近。收到提示后同样将提示嵌入为向量计算与每个文档向量的距离按距离排序返回最近的文档。1.3.4 对比训练嵌入模型通过对比训练学习语义关系。训练需要大量正负对正对两段相似文本“早上好和你好”→ 应嵌入靠近负对两段不相似文本“早上好和嘈杂的小号声”→ 应嵌入远离训练过程从单个文本片段的视角看它与正例拉近与负例推远。经过百万级正负对的反复训练模型学会将语义相近的文本嵌入邻近位置。用数百甚至数千维向量来反映训练数据中的细微关系。1.3.5 不同模型的向量不可比较一个关键限制只能比较同一模型生成的向量。不同模型使用不同训练数据、不同维度、不同初始随机值即使训练过程相同向量空间的簇也会出现在不同位置。跨模型比较向量只会得到无意义结果。实际应用中通常选定一个嵌入模型并全程使用。1.3.6 语义搜索的局限比关键词搜索更慢计算量更大。嵌入模型需要处理整个文本生成向量而关键词搜索只需查倒排索引。这是混合搜索中需要平衡的因素。1.4 4. 元数据过滤元数据过滤通过文档属性中的严格标准缩小检索范围。典型场景包括访问控制仅付费用户查看付费文章、地域过滤仅返回用户所在地区文章、时间过滤仅返回特定时间段文档。元数据过滤有几个明确的优势概念简单、速度快、高度优化。它是唯一能让系统根据严格标准决定是否检索文档的方法——如果你需要硬性排除某些文档只能靠它。但它不是真正的搜索技术更多是用于优化其他两种技术的检索结果。它忽略文档内容不能对通过过滤的文档排序。仅依赖元数据过滤的检索器几乎毫无用处必须与关键词或语义搜索结合。1.5 5. 混合搜索三者融合单一技术各有局限生产级检索器将三者组合使用。1.5.1 混合搜索完整流程用户提示关键词搜索 BM25语义搜索 嵌入模型关键词排名列表语义排名列表元数据过滤元数据过滤RRF 融合最终排序 Top-K返回给 LLM并行执行关键词搜索和语义搜索各返回 20-50 个文档。两个列表分别应用元数据过滤然后用互惠排名融合RRF合并为一个综合排名。1.5.2 互惠排名融合RRFRRF 的完整公式K 参数的作用两个关键参数控制融合行为β 参数的作用1.5.3 混合搜索完整案例假设一个新闻知识库有 5 篇文章每篇带有元数据文档内容元数据分类doc1披萨制作需要面粉和番茄酱美食doc2纽约风格披萨很有名美食doc3意大利面条也是经典美食美食doc4纽约地铁系统正在升级交通doc5面粉价格今年上涨了两成财经用户查询披萨用户属于美食分类。第一步关键词搜索BM25在倒排索引中查找披萨doc1 和 doc2 包含披萨doc3 包含面条但不含披萨doc4 和 doc5 不含。假设 BM25 得分doc1 1.4doc2 0.9其余为 0。关键词排名doc1 → doc2。第二步语义搜索嵌入模型将披萨嵌入为向量与所有文档的向量计算余弦相似度。语义相近的文档即使不含披萨也可能排名靠前。假设余弦相似度得分doc1 0.92doc2 0.88doc3 0.71面条和披萨都是美食doc5 0.35面粉和披萨有关联doc4 0.05。语义排名doc1 → doc2 → doc3 → doc5 → doc4。注意 doc3 在语义搜索中排名第三因为它虽然不含披萨但意大利面条和披萨在语义上相近。这就是语义搜索相比关键词搜索的优势。第三步元数据过滤用户属于美食分类过滤掉 doc4交通和 doc5财经。两个列表各自过滤后关键词过滤后doc1、doc2语义过滤后doc1、doc2、doc3第四步RRF 融合设 K50默认值两个列表等权重β0.5文档关键词排名语义排名关键词得分 1/(rank50)语义得分 1/(rank50)总分doc1111/51 0.01961/51 0.01960.0392doc2221/52 0.01921/52 0.01920.0385doc3未进入301/53 0.01890.0189最终返回doc1、doc2、doc3Top-3。doc3 虽然关键词搜索完全没找到它不含披萨但语义搜索发现了它经过 RRF 融合后仍然进入最终结果。这就是混合搜索的价值——关键词搜索保证精确匹配语义搜索补充语义相关但用词不同的文档元数据过滤确保结果与用户相关。1.5.4 可调空间混合搜索提供了丰富的调优维度BM25 的 k1 和 b 参数、元数据过滤字段的选择、关键词与语义搜索的权重比例。设计高性能检索器需要理解这些技术的相对优势然后调整平衡以匹配项目需求。1.6 6. 检索质量评估1.6.1 四大核心指标指标公式衡量什么通俗理解精确率相关文档数 / 检索文档数结果的纯净度搜了 10 个结果7 个有用 → 70%召回率相关文档数 / 总相关文档数检索的全面性一共有 10 个有用文档找到了 8 个 → 80%MAP各查询的平均精度的均值排序质量相关文档是否排在前面MRR1 / 首个相关文档排名首次命中的速度第一个有用结果排在第几精确率与召回率的权衡多返回文档召回率上升但精确率下降少返回文档精确率上升但召回率下降。具体取值取决于场景——医疗诊断更看重召回率不能遗漏关键信息电商推荐更看重精确率不能推荐不相关商品。Top-K 的影响评估指标通常以返回的前 K 个文档标准化。Top-1/Top-2 评估核心排名能力Top-5/Top-10 提供更全面的视角Top-15 评估广泛覆盖能力。MAP 的特点奖励将相关文档排在高排名位置的检索器。无关文档窜入高排名位置会降低其下方所有相关文档的精度拉低整体平均值。MRR 的特点强调至少包含一个相关文档尽可能靠前排名的重要性。1.6.2 评估的局限所有评估指标都依赖人工标注的真相——需要人工准备包含提示和预期相关文档的测试集。这可能耗时且成本高但一旦建好就可以在开发阶段和上线后持续监控。1.7 7. 三种技术速查对比维度关键词搜索语义搜索元数据过滤工作原理匹配精确词汇匹配语义相似按属性筛选向量类型稀疏向量词频密集向量含义不使用向量优点简单快速、精确匹配匹配同义词、理解语义严格标准、唯一硬筛选缺点无法匹配同义词较慢、计算量大忽略内容、不能独立使用典型应用产品名称搜索开放式问答访问控制在混合搜索中的角色确保精确词汇敏感提供语义灵活性排除不相关文档关键算法/模型BM25生产标准嵌入模型 余弦相似度SQL 式查询可调参数k1、b嵌入模型选择元数据字段选择来源吴恩达 RAG 课程模块二讲9-讲18讲师 An Hassan。1.8 思考题BM25 中的 k1 和 b 参数分别控制什么如果你的知识库文档都很短应该把 b 调大还是调小为什么语义搜索中通常使用余弦相似度而不是欧几里得距离混合搜索中什么场景下应该把 β 调高更重视语义搜索什么场景下应该调低下一篇模块三向量数据库与信息检索