前言
在之前的文章中,我们主要围绕基于关键词的全文搜索进行了介绍。 当用户能够输入合适的关键词时,全文搜索非常有效。 然而,对于”不知道该用什么关键词搜索”或”希望回答概念性问题”这类需求,仅靠关键词搜索有时难以满足。
本文将梳理搜索技术的谱系,并介绍从关键词搜索到语义搜索的演进过程。
目标读者
对 AI 搜索感兴趣,但希望梳理相关概念的用户
正在考虑引入语义搜索的用户
希望了解 Fess AI 相关功能的用户
搜索技术的谱系
搜索技术从简单到高级,形成了如下谱系。
| 技术 | 机制 | 特点 |
|---|---|---|
| 关键词搜索 | 将输入词与文档中的词进行匹配 | 快速且可靠。需要词语匹配 |
| 模糊搜索 | 也匹配拼写相似的词 | 应对拼写错误 |
| 同义词搜索 | 扩展同义词进行匹配 | 应对表述差异(手动配置) |
| 语义搜索 | 基于语义相似度进行匹配 | 即使词语不匹配也能发现相关文档 |
| 混合搜索 | 关键词 + 语义搜索的组合 | 兼具两者的优势 |
关键词搜索的局限性
关键词搜索在很多场景下是有效的,但在以下场景中会暴露出局限性。
词汇不匹配
用户使用的词语与文档中使用的词语不同的情况。
例如:即使用户搜索”想更改工资转账目的地”,但如果公司内部文档中使用的是”工资账户变更手续”这一表述,关键词就可能无法匹配。
可以通过同义词(参见第8回)部分地解决这一问题,但要预先注册所有词汇组合并不现实。
概念性搜索
如”关于远程办公的公司内部规定”这类情况,用户希望按概念而非特定关键词进行搜索。 此时,”在家办公”、”远程工作”、”出勤规则”、”考勤管理”等各种相关文档都可能成为搜索目标。
语义搜索的工作原理
向量表示(Embedding)
语义搜索的基础是将文本转换为”向量(数字数组)”。 该向量是文本”含义”的数学表示。
含义相近的文本在向量空间中会被放置在相近的位置。 例如,”狗”和”宠物”的向量距离较近,而”狗”和”汽车”的向量距离较远。
搜索时的运作方式
用户输入搜索查询
将查询转换为向量
计算与索引中文档向量的相似度
按相似度从高到低返回文档
由此,即使关键词不完全匹配,也能找到语义上相关的文档。
Fess 中的语义搜索
Fess 可以通过语义搜索插件实现基于向量的搜索。
启用语义搜索
安装语义搜索插件
配置 Embedding 模型
重建索引(对现有文档进行向量化)
Embedding 模型的选择
选择用于将文本转换为向量的模型(Embedding 模型)。
选择时需考虑以下方面:
语言支持:是否能够妥善处理目标语言
精度:向量的质量(语义捕捉的准确性)
速度:转换所需的时间
成本:API 使用费、硬件要求
混合搜索:Rank Fusion
语义搜索虽然强大,但并非万能。 在搜索专有名词或需要精确匹配的场景下,关键词搜索更为合适。
混合搜索的理念
混合搜索同时执行关键词搜索和语义搜索,然后整合结果。
Fess 使用 Rank Fusion(排名融合)来合并不同搜索方法的结果。 具体而言,通过 RRF(Reciprocal Rank Fusion)算法,在两种搜索结果中均排名靠前的文档最终会被排在最前面。
混合搜索的优势
兼顾关键词搜索的”确定性”与语义搜索的”灵活性”
专有名词由关键词搜索覆盖
概念性搜索由语义搜索覆盖
相比仅使用其中一种方法,综合搜索质量得到提升
引入判断标准
语义搜索并不一定需要在所有环境中引入。
应考虑引入的情况
搜索日志中有大量”零命中查询”
用户反馈”不知道该用什么关键词”
希望支持自然语言提问(第19回 RAG 的前提)
希望加强多语言文档的跨语言搜索
暂时不需要的情况
关键词搜索 + 同义词已能获得足够的搜索质量
文档数量较少,且用户了解合适的关键词
计算资源(GPU 或云 API 费用)有限
分阶段引入
首先通过关键词搜索 + 同义词(第8回)改善质量
如果零命中仍然较多,则考虑引入语义搜索
通过混合搜索获得两种方法的优势
总结
本文梳理了从关键词搜索到语义搜索的演进路径。
搜索技术的谱系(关键词 -> 模糊 -> 同义词 -> 语义 -> 混合)
语义搜索的工作原理(向量表示与相似度计算)
Fess 中的语义搜索与混合搜索(Rank Fusion)
引入判断标准与分阶段方法
下一篇将在语义搜索的基础上进一步扩展,构建基于 RAG 的 AI 助手。