在 LLM 应用遍地开花的今天,检索增强生成(RAG)几乎成了知识库问答的标配。但很多人忽略了:关键词搜索并没有过时。理解两者的区别与联系,是做好检索系统的第一步。
一、一句话讲清区别
简单讲,关键词搜索适用于精确匹配,RAG 检索适用于语义模糊匹配。
这是两者最本质的分野。关键词搜索盯着"字"看,RAG 检索盯着"意"看。前者要求查询词和文档词高度一致,后者允许表达方式不同但含义相近。
二、一个例子看懂差异
假设用户搜索 "手机耗电快",而知识库中有一条文档写的是 "电池续航能力差"。
- 关键词搜索:在”手机耗电快”和”电池续航能力差”之间找不到任何共同词汇,匹配失败,这条文档不会被返回。
- RAG 检索:通过语义理解,能识别出”耗电快”和”续航能力差”表达的是同一个问题,从而成功检索到这条文档。
这个例子虽然简单,却揭示了两种检索范式在根本思路上的不同。
三、背后的原理
背后的原理在于:
- 关键词搜索是基于词汇进行字面匹配。它将查询和文档都视为词的集合,通过统计词频、词的重要性等指标来计算相关性。
- RAG 检索是基于语义理解,通过 Embedding 向量将查询和文档映射到语义空间,然后用向量相似度来匹配语义相近的文档。即使两个文档用词完全不同,只要它们在向量空间中距离足够近,就能被检索到。
可以这样理解:关键词搜索像是在图书馆里按书名精确查找——你必须知道书名才能找到;RAG 检索则像是向图书管理员描述你的需求——即使你不知道确切的书名,管理员也能根据你的意图推荐相关的书。
四、关键词搜索的核心技术
关键词搜索虽然历史悠久,但其背后的技术体系非常成熟,至今仍是搜索引擎和检索系统的基石。
TF-IDF
TF-IDF 是一种用于衡量一个词对一篇文档的重要程度的统计方法。
它由两部分组成:
- TF(Term Frequency,词频):衡量词
t在文档中出现的频次。一个词在文档中出现次数越多,通常说明它对该文档越重要。 - IDF(Inverse Document Frequency,逆文档频率):衡量词
t在整个语料库中的”稀有程度”。如果一个词在很多文档中都出现(比如”的””是””在”这类常用词),那么它对区分文档的贡献就小。
所以,高 TF-IDF 值 = 在本文档中高频 + 在全局中稀有 = 对本文档很重要。
TF-IDF 虽然是相对"古老"的技术,但因其简单、高效、可解释的特点,在关键词搜索、文本分类等场景中仍然是重要的基线方法,也是理解现代语义检索技术的重要起点。很多现代检索系统的评测基准,仍然会用 TF-IDF 作为对照。
BM25
BM25 是 TF-IDF 的改进版,是目前最主流的搜索算法,主要用于文档相关性的打分算法。
TF-IDF 有一个明显缺陷:词频越高,得分越高,没有上限。举个极端的例子:
文档A:"猫猫猫猫猫猫猫猫猫猫猫猫猫猫猫猫猫猫猫猫"(出现100次)
文档B:"我家养了一只猫,它很可爱"
→ TF-IDF 会认为文档A更相关,但这显然不合理
BM25 针对这个缺陷,主要做了以下改进:
- TF 饱和机制:给词的出现频率加了一个上限,超过这个上限后,该词对重要程度的贡献会大幅减小。本质上,是把原来的线性增长改成了非线性曲线——词频从 1 到 2 的提升很大,但从 50 到 51 的提升微乎其微。
- 文档长度归一化:对文档长度进行了归一化处理。长文档天然包含更多词,词频会偏高,因此需要”惩罚”长文档、”奖励”短文档,让不同长度的文档在同一个标准下比较。
这两个改进让 BM25 在实际搜索场景中的表现远超朴素 TF-IDF,Elasticsearch 的默认评分算法也正是基于 BM25。
倒排索引
正常索引是以文章为索引,可以快速查到文章中有哪些词。倒排索引则是反过来——以词为索引,可以快速查到某个词出现在哪些文章里。
搜索的本质是"根据词找文档",所以倒排索引才是搜索引擎真正需要的结构。倒排索引也是 Elasticsearch 的默认索引结构。
它的工作原理大致是:为语料库中每个出现过的词维护一个倒排列表(posting list),列表中记录了包含该词的所有文档 ID 以及位置信息。查询时,直接根据查询词查找倒排列表,再对结果做交集、并集等运算,就能快速定位相关文档。
当然,倒排索引的缺点也很明显:索引条目非常多,占用内存和磁盘空间比较大,构建索引的时间也较长。特别是面对大规模文本时,索引膨胀和更新成本是需要认真评估的。
五、RAG 检索的核心技术
RAG 检索主要用到的技术就是 Embedding 向量化。整个流程可以分为文档向量化和查询两个阶段。
文档向量化
文档向量化,就是把一篇文档写入向量数据库。通常包括以下步骤:
- 文档预处理:把文档的格式整理一下,去除特殊字符、重复字符等。这一步看似简单,但直接影响后续切分和向量化的质量——格式混乱的文档切出来的 chunk 往往也支离破碎。
- 文档切分:将文档切分成一个个的 chunk。切分策略直接影响检索效果:切太大,语义不够聚焦;切太小,上下文信息丢失。具体的文档切分策略和方法可以参考这篇文章。
- 保留元数据:元数据要留档,方便后续更新、版本检查和溯源。比如文档来源、切分时间、chunk 序号等信息,在排查检索问题时非常关键。
- Embedding:将每个 chunk 的文本通过 Embedding 模型将文本转换为向量表示,然后存储到向量数据库中。在选择 Embedding 模型时应该考虑什么因素、常见的 Embedding 模型有哪些,可以参考这篇文章。
查询阶段
查询阶段简单讲就是将查询内容 Embedding 后,去向量数据库中查询匹配,找到最相似的 chunk。
具体涉及向量数据库的查询算法。常见的向量数据库有 Milvus、Qdrant、Pinecone 等。向量数据库使用近似最近邻(ANN)算法通过向量相似度来匹配查询。之所以用"近似"而非"精确"最近邻,是因为在高维向量空间中,精确搜索的计算成本极高,ANN 在可接受的精度损失下换来了数量级的性能提升。
从实践上来讲,检索一般涉及召回和重排两个步骤:
- 召回:从向量数据库中检索出相关的候选 chunk,这个阶段追求的是”快”和”全”,宁可多召回一些,也不能漏掉。
- 重排:对召回结果进行筛选和精排,通过更精细的模型(如 Cross-Encoder)对候选集重新打分,提高最终结果的准确性。
完成检索后,下一步就是将文本拼接到 LLM 的 prompt 中进行答案生成。
六、最佳实践:混合检索才是正解
虽然关键词检索是较为"古老"的技术,但关键词搜索和 RAG 并非对立的,反而是两者互补才能发挥最大的功效。
在实际生产实践中,检索通常都采用混合检索方案。也就是在查询召回阶段,用多路召回的方案,将向量检索的内容和关键词搜索的内容合并后,统一重排,再生成更精确的答案。
这种方案结合了两者的优势:
- 关键词搜索保证精确匹配能力——当用户搜索专有名词、产品型号、代码片段等时,关键词匹配比语义匹配更可靠。
- 向量检索提供语义理解能力——当用户的查询和文档表述不同但含义相同时,向量检索能填补关键词搜索的盲区。
- Reranker 进行精排,将两路召回的结果统一打分排序,提升最终质量。
打个比方:关键词搜索是精确制导,指哪打哪;向量检索是广角雷达,覆盖语义范围。一个好的检索系统,需要两者协同工作。
总结
关键词搜索和 RAG 检索代表了两种不同的匹配哲学:字面匹配 vs 语义理解。它们各自的技术栈截然不同——前者依赖 TF-IDF、BM25 和倒排索引,后者依赖 Embedding、向量数据库和 ANN 算法——但两者并非二选一的关系。
理解它们的差异是基础,而将两者有机结合的混合检索,才是当前生产环境中真正经得起考验的实践方案。
