语义检索完整梳理(对比关键词检索 + 核心原理拆解)
我们刚刚学习了向量检索,现在来深入理解语义检索。 关键词检索存在一个核心短板:如果文档中不存在和你输入完全一致的关键词,检索就会匹配失败。 举个例子:文档里写的是 “报销(reimbursement)”,但你搜索 “津贴(allowance)” 时,关键词检索只会机械查找单词 allowance 本身; 如果用户搜索 “居家办公(work from home)”,但文档里只用了 “家庭办公工位(home office)”,关键词检索也完全找不到相关内容。 这类同义替换的关键词组合不会在文档中匹配到字面字符,对应的文档就会被直接漏掉。 拿我们之前的示例代码举例:假如你搜 “办公桌(desk)”,但文档里只写了 “家具(furniture)”,关键词检索算出来的相似度分数会全部为 0,找不到任何匹配文档。 这就是关键词检索的局限性,而语义检索恰好能解决这个问题。 语义检索会基于文字内在含义检索文档,因此更有机会根据用户输入找到真正相关的内容,这也是我们接下来要重点讲解的内容。 那么语义检索到底是什么?你可以把它理解成:能读懂语义,而非只识别文字本身的检索方式。 当你搜索 “津贴” 时,语义检索可以找出所有和津贴、报销,或是语义相近概念相关的文档,哪怕文档里根本没出现 allowance 这个精确单词。 同理,无论你搜 “家庭办公工位” 还是 “居家办公”,它都能匹配到所有和远程工作相关的文档。 实现这种效果的核心技术叫做嵌入向量(embeddings)。 我们会把用户的查询语句、全部文档文本,统一转换成数学向量,你可以将这些向量想象成高维空间里的坐标点。 语义相近的文档,在这个高维空间里对应的坐标点距离会非常近。 因此执行检索时,系统会根据语义距离寻找最相近的内容,不再只看文字是否重合。 我们可以通过计算两个文本向量之间的距离,衡量两段文字的语义相似度:向量距离越近,代表两段文字表达的含义越接近。 所以即便 reimbursement(报销)和 allowance(津贴)是两个完全不同的单词,它们对应的向量坐标也会挨在一起,能够被检索匹配到。
语义检索完整梳理(对比关键词检索 + 核心原理拆解)
一、关键词检索的致命缺陷:字面匹配,不懂含义
核心逻辑:只做字符串精准匹配,只认完全一样的文字,无法理解词语、句子背后的语义关系。
典型失效场景
- 同义词 / 近义词不匹配文档:报销 (reimbursement),搜索:津贴 (allowance) 关键词检索找不到,两个词字面完全不同,无重合字符。
- 同义不同表述不匹配文档:家庭办公工位 (home office),搜索:居家办公 (work from home) 用词不一样,关键词检索判定无关。
- 上下位概念不匹配文档:家具 (furniture),搜索:办公桌 (desk) 没有相同关键词,相似度直接为 0,完全漏检。
总结痛点:只要没有完全相同的字符,哪怕语义高度相关,都会检索失败。
二、语义检索:基于含义匹配,突破字面限制
定义
不依赖文字表层字符,理解文本内在语义进行检索的技术。
优势举例
- 搜「津贴」,能召回含报销、补贴、补助等相关内容的文档;
- 搜「居家办公」,不管文档写 home office、远程办公、居家工位,全部匹配;
- 上位词、下位词、近义词、不同句式描述,均可识别关联。
三、核心底层技术:嵌入向量 Embedding
工作流程
- 统一向量化使用预训练语言模型,把查询语句、全部文档全部转换成固定维度的数字向量(高维空间坐标)。
- 语义决定空间距离高维向量空间规则: 语义越相近的两段文本 → 向量坐标距离越近; 语义完全无关 → 向量距离很远。
- 检索逻辑替换关键词检索:比对字符串是否重合; 语义检索:计算向量间距离,返回距离最近的 Top-N 文档。
案例解释
reimbursement(报销)和allowance(津贴)拼写、单词完全不同,但语义高度相关; 经过 Embedding 编码后,二者向量在高维空间距离很近,检索时会被识别为相似内容,成功召回。
四、两者核心对比表
表格
| 维度 | 关键词检索 | 语义检索(向量检索) |
|---|---|---|
| 匹配依据 | 文字字面、关键词重合度 | 文本深层语义含义 |
| 近义词处理 | 完全失效,漏检 | 自动识别,正常召回 |
| 不同句式同义描述 | 无法匹配 | 精准关联 |
| 概念上下位关系 | 相似度为 0 | 存在相似度,可检索 |
| 底层计算 | 字符匹配、词频统计(TF-IDF 等) | 文本 Embedding + 向量距离计算(余弦相似度等) |
五、一句话总结
关键词检索 “认字不认意”,极易丢失高相关文档; 语义检索依靠 Embedding 将文本转为语义向量,用空间距离衡量含义相似度,实现 “认意不认字”,解决同义、近义、多表述场景下的检索漏检问题。
