导论:从关键词到语义——信息检索的范式转移 / Introduction: From Keywords to Semantics
第 1 章 导论:从关键词到语义——信息检索的范式转移
Introduction: From Keywords to Semantics
当用户在搜索框中键入"如何学习深度学习"时,他们真正想要的并不是若干恰好包含这六个字的网页,而是一份关于学习路径、教材选择、课程推荐、踩坑经验的综合回答。然而,自 1990 年代起主导整个互联网检索行业的关键词匹配系统(Keyword-based Retrieval),却长期把"理解用户意图"这件事排除在系统设计之外。它所做的事情,本质上只有一件:在索引中找到包含用户所输入字符序列的文档,并把出现频率当作相关性的主要证据。这种做法在文本规模有限、用户预期不高的早期网络中尚可应付,可在 2020 年代之后——面对以亿计的网页、对话式问答、跨语种检索与生成式 AI——它的失效已经不再是技术细节问题,而是范式层面的危机。本章正是要回答一个看似简单实则根本的问题:什么是语义搜索(Semantic Search)?它与传统关键词搜索的本质差异究竟在哪里? 我们将从历史脉络、技术原理、对比实验和现代应用四个维度,建立起"语义即向量(Semantics as Vectors)"这一贯穿全书的核心隐喻。
---
1.1 信息检索发展简史与三次范式跃迁
1.1.1 第一次跃迁:从人工目录到布尔检索
在 Web 出现之前,信息系统规模有限,主要以书目检索(Bibliographic Retrieval)为主。图书馆员使用规范化主题词表(Controlled Vocabulary),配合 AND / OR / NOT 三种布尔运算符(Boolean Operators)在倒排索引(Inverted Index)上完成检索。这套体系的代表系统包括 MEDLINE 和 Dialog 系统,其优势是精确、可解释、可控——用户一旦掌握词表和语法,就能复现检索过程。然而其劣势同样明显:第一,词表维护成本极高;第二,词表之外的新概念无法被检索;第三,系统无法处理"recall vs. precision"这一两难——召回率(Recall)上不去时用户会漏掉关键文档,精确率(Precision)上不去时用户会被无关信息淹没。
1.1.2 第二次跃迁:统计语言模型与向量空间模型
进入 1990 年代,伴随大规模 Web 文本的出现和倒排索引技术的成熟,统计驱动的信息检索(Statistical Information Retrieval) 成为主流。其代表方法包括:
- **TF-IDF(Term Frequency–Inverse Document Frequency)**:词频(TF)刻画"某词在本文档中多重要",逆文档频率(IDF)刻画"该词在整个语料中有多稀有",二者相乘作为权重。该方法的核心假设是:**罕见词比常见词更能区分文档**。数学化地,对词项 $t$ 在文档 $d$ 中的权重可写作:
$$ \text{tf-idf}(t, d) = \text{tf}(t, d) \cdot \log \frac{N}{\text{df}(t)} $$
其中 $N$ 为语料库文档总数,$\text{df}(t)$ 为包含词项 $t$ 的文档数。
- **BM25(Best Matching 25)**:在 TF-IDF 基础上引入了文档长度归一化和词频饱和函数,是过去二十年间 Lucene、Elasticsearch 等工业级搜索引擎的事实标准(de facto standard)。
- **向量空间模型(Vector Space Model, VSM)**:把每篇文档和每个查询都表示为词项空间(Term Space)中的一个稀疏向量(绝大多数维度为 0),相关度通过余弦相似度(Cosine Similarity)刻画:
$$ \text{sim}(q, d) = \frac{q \cdot d}{\|q\| \, \|d\|} = \frac{\sum_{i} q_i d_i}{\sqrt{\sum_i q_i^2} \sqrt{\sum_i d_i^2}} $$
这一阶段的范式特征可以概括为"统计胜过语法(Statistics over Syntax)"——系统不再要求用户构造布尔表达式,而是自动学习词项与文档的相关性。然而,无论 TF-IDF 还是 BM25,其底层逻辑仍是"字面匹配(Literal Matching)":只有真正出现在文本中的词才会被赋予非零权重,未登录词(Out-of-Vocabulary, OOV)问题、同义词(Synonymy)问题、多义词(Polysemy)问题始终无法从机制上解决。
1.1.3 第三次跃迁:从字面匹配到语义向量
2013 年前后,Word2Vec(Word Embeddings) 等分布式表示(Distributed Representation)方法问世,其核心思想是:"一个词的意思,取决于它在上下文中常常和哪些词共现"。2017 年 Transformer 架构与 2018 年 BERT 模型的出现,将这一思想推向新高度:整个句子乃至段落都可以被映射为一个稠密向量(Dense Vector),使得语义可以直接以数学距离(Mathematical Distance)的形式被度量。这构成了信息检索史上的第三次范式跃迁——从"字面(Literal)"到"语义(Semantic)",从"稀疏(Sparse)"到"稠密(Dense)",从"词项匹配(Token Matching)"到"向量相似度(Vector Similarity)"。
可以把三次跃迁简明地总结为下面这张表:
| 跃迁 | 时间窗口 | 核心方法 | 表示方式 | 相似度度量 | |------|----------|----------|----------|------------| | 第一次 | 1960s–1980s | 布尔检索、主题词表 | 文档-词项二元关系 | 真/假匹配 | | 第二次 | 1990s–2010s | TF-IDF / BM25 / VSM | 稀疏高维向量 | 余弦 / 内积 | | 第三次 | 2018s 至今 | BERT / 向量嵌入 | 稠密低维向量(如 768 维) | 余弦 / 点积 / 欧氏距离 |
这张表本身就是一个微缩的历史叙事:从离散到连续,从精确到模糊,从可解释到可学习。每一次跃迁都伴随着"老问题被解决、新问题被提出"的辩证过程——布尔时代无法处理扩展检索(Query Expansion),统计时代无法处理语义对等,而向量时代则需要面对召回可控性、可解释性、长文档建模等新挑战。
---
1.2 关键词匹配的局限性:同义词、上下文与意图
1.2.1 同义鸿沟(Synonym Gap)——检索失败的第一种范式
假设用户搜索 `"machine learning"`(机器学习),而文档中只使用 `"ML"`、`"统计学习"`、`"统计机器学习"`、`"机器学习算法"`、`"machine intelligence"` 等变体形式。基于关键词的系统会因词面不匹配而将这些相关文档排除在结果之外。这种"意义相同但表述不同"的现象被称为同义鸿沟。在中文环境下,由于一义多词、缩略语、行业术语并存,该问题更为突出:用户搜索 `"电脑"` 时,`"计算机"`、`"PC"`、`"笔记本"` 等近义词都应当被纳入候选结果。
工程上的早期应对包括同义词扩展(Synonym Expansion) 或查询改写(Query Rewriting),但需要人工维护词表,远不能跟上自然语言里指数级增长的表达方式。
1.2.2 多义陷阱(Polysemy Trap)——检索失败的第二种范式
另一个相反方向的失败是多义陷阱。`"苹果"` 一词既可能指水果,也可能指 Apple 公司。用户搜索 `"苹果发布财报"` 时,传统系统返回的前几条结果可能是一篇农业科普——只因文档中"苹果"二字共现频率高。这种错误源于系统无法区分同一字面在不同语境下的不同语义(Context-Dependent Semantics)。
更深一层,多义陷阱揭示了一个本质问题:关键词检索是一种"无上下文建模(Context-Free Modeling)"。它把每个文档、每个查询都视为"词袋(Bag-of-Words, BoW)",丢失了词序和上下文结构。换言之,传统检索模型是一个"结构盲(Structure-Blind)"的系统——它认识每一个字,但不理解它们之间的关系。
1.2.3 意图鸿沟(Intent Gap)——检索失败的第三种范式
最后一种范式失败可能是最难处理的:意图鸿沟(Intent Gap)。考虑以下三组自然语言查询:
``` Q1: "苹果公司发布了新手机" ← 陈述句,目的通常是寻求确认 Q2: "iPhone 制造商推出新品" ← 名词短语,目的通常是信息浏览 Q3: "新款 iPhone 16 值得买吗" ← 疑问句,目的是寻求对比建议 ```
这三句话在字面上毫无重叠,但如果用户希望得到的是"`Apple 公司新发布 iPhone 16 的评测`"这篇文档,那么从用户意图(User Intent) 角度它们是高度相关的——一个真正的智能检索系统应当能够识别这种跨形式、跨措辞的语义等价。而关键词系统对这种"形异义同"的查询几乎无能为力。
需要强调的是,这三种局限不是"补丁式(Patch-Style)"缺陷,而是结构性缺陷——它们来自词袋假设(Bag-of-Words Assumption)本身的局限。词袋假设把语言视为"无序词项的集合",这意味着系统放弃了所有关于句法(Syntax)、语境(Context)、意图(Intent) 的建模能力。要从根本上突破,必须放弃"文档—词项"这一传统表示,转向能够编码这些高阶信息的表示——这正是下一节的核心议题。
---
1.3 语义检索的基本思想:将文本映射到高维向量空间
1.3.1 什么是"语义向量"——一个直觉式建模
想象一个高维空间(High-Dimensional Space),比如 768 维或 1024 维。在这个空间里,每一个点对应一段文本——一个词、一个句子、一个段落、一篇文档。我们期待以下事情成立:
1. 意义相似的文本在空间中彼此靠近——`"机器学习"` 与 `"深度学习"` 的向量距离应小于 `"机器学习"` 与 `"香蕉"` 的距离。 2. 意义相反或无关的文本彼此远离。 3. 语义关系可以通过向量运算捕获——经典案例:`"国王" - "男人" + "女人" ≈ "女王"`(Word2Vec 时代著名的 "King − Man + Woman ≈ Queen" 例子)。
这种空间叫做嵌入空间(Embedding Space),其中的点称为嵌入向量(Embedding Vector) 或语义向量(Semantic Vector)。所谓"语义",在这一范式下被重新定义为"在嵌入空间中的几何关系(Geometric Relationship)"——这是本书反复强调的核心隐喻。
1.3.2 从稀疏向量到稠密向量——表示范式的根本转变
在 1.1.2 节提到的 TF-IDF / BM25 中,文本对应的也是一个向量:词项表有 $|V|$ 个词,向量就有 $|V|$ 维(往往达到数十万维),且绝大多数维度为 0。这种向量称为稀疏向量(Sparse Vector),其几何意义更接近"多个布尔属性的集合"。而 BERT 等模型生成的向量通常是 768 维或 1024 维,绝大多数维度为非零实数,故称稠密向量(Dense Vector)。
两者的关键差异可以总结为:
| 维度 | 稀疏向量(TF-IDF / BM25) | 稠密向量(BERT / Sentence-BERT) | |------|----------------------------|-----------------------------------| | 维度数 | 数十万 | 数百至数千 | | 非零元素比 | < 1% | > 99% | | 语义信息 | 词项是否出现 | 上下文、句法、语义的联合编码 | | 训练方式 | 统计共现 | 大规模自监督 / 有监督学习 | | 相似度计算 | 内积或余弦 | 余弦 / 点积 / 欧氏距离 |
这种差异绝非仅仅"工程量级"上的,它实际上意味着表示的"压缩率(Compression Ratio)"和"信息密度(Information Density)"发生了质变。稀疏向量本质上是一份"词项出现记录表",稠密向量则是"一段语言的意义压缩码(Semantic Compressed Code)"——可以把它想象成:稀疏向量告诉你"这篇文章有 '苹果'、'公司'、'手机' 三个词";稠密向量则告诉你"这篇文章的核心语义是 Apple 公司发布了新的智能手机产品"。
1.3.3 数学形式:相似度的几何化
给定两个语义向量 $u, v \in \mathbb{R}^d$,其相似度可以通过多种方式度量:
余弦相似度(Cosine Similarity):
$$ \text{sim}_{\cos}(u, v) = \frac{u \cdot v}{\|u\| \|v\|} $$
取值范围 $[-1, 1]$,1 表示完全同向,0 表示正交(无关),-1 表示完全反向。
欧氏距离(Euclidean Distance):
$$ \text{dist}(u, v) = \|u - v\|_2 = \sqrt{\sum_{i=1}^d (u_i - v_i)^2} $$
距离越小代表越相似。
点积(Dot Product):
$$ \text{sim}_{\text{dot}}(u, v) = \sum_{i=1}^d u_i v_i = u^\top v $$
当向量被归一化为单位向量时,点积等价于余弦相似度。
余弦相似度之所以在文本语义匹配中广泛使用,是因为它对向量模长(Magnitude)不敏感:长文档和短查询即使在词频分布上有很大差异,只要"方向一致"(语义相似),它们也会得到较高的相似度分数。
1.3.4 向量从何而来——嵌入模型与编码器
要把一段自然语言变成语义向量,需要一个编码器(Encoder)或嵌入模型(Embedding Model)。其本质是一个参数化的函数 $f_\theta: \mathcal{T} \to \mathbb{R}^d$,其中 $\mathcal{T}$ 是文本空间,$\theta$ 是通过大规模语料训练得到的参数。
从 2013 年的 Word2Vec(GloVe、fastText)到 2018 年的 BERT(RoBERTa、ALBERT),再到 2020 年代兴起的 Sentence-BERT、Instructor、SBERT、OpenAI text-embedding-3、E5、BGE、M3E 等专用嵌入模型,嵌入技术的发展呈现出两个明显趋势:第一,从词级表示(Word-Level Representation)向句子级、文档级表示跃迁;第二,从单一语言(Monolingual)走向多语言(Multilingual)甚至跨模态(Cross-Modal)。
需要指出,一个向量是否"语义好"完全取决于编码器的训练目标(Training Objective)与训练语料。同样的文本喂给不同的编码器,得到的向量可能差异极大——这意味着相似度比较必须建立在"同一向量空间(Same Vector Space)"的假设之上。这是后续向量数据库章节中会反复出现的工程原则。
---
1.4 向量数据库与语义搜索的关系及现代应用场景
1.4.1 向量数据库(Vector Database)解决的是什么问题
有了嵌入模型,把每一篇文档都映射成向量之后,新问题随之而来:如何在亿级、十亿级的向量集合中快速找到与查询向量最相似的 Top-K 个向量? 这一操作在数学上叫近似最近邻搜索(Approximate Nearest Neighbor, ANN),在工程上叫向量检索(Vector Retrieval)。
朴素做法是暴力搜索(Brute-Force Search):逐一计算查询向量与库中每个向量的相似度,时间复杂度为 $O(N d)$。当 $N$ 达到百万级以上,这种做法的延迟和算力消耗就难以接受。因此工业级系统必须依赖一些索引结构(Indexing Structures):
- **倒排文件索引风格的方法(IVF, Inverted File Index)**:先聚类(Clustering),检索时只搜索与查询最近的若干个聚类中心对应桶。代表:Faiss 中的 `IVFFlat`。
- **基于图的方法(HNSW, Hierarchical Navigable Small World)**:构建一张多层图,节点之间通过近邻关系链接,检索时从粗到细跳转。代表:HNSW、HNSWlib、DiskANN。
- **乘积量化(Product Quantization, PQ)**:把向量切成若干段,对每段分别做聚类编码,从而压缩存储、提升 I/O 效率。
- **混合索引(Hybrid Index)**:将上述方法与基于关键词的倒排索引结合,提供"语义 + 字面"的双路召回。
把这些工程化方案封装为可独立部署的、提供 CRUD 与查询接口的系统,就是向量数据库(Vector Database)。其代表产品包括 Milvus、Weaviate、Qdrant、Chroma、Pinecone,以及在传统关系数据库上叠加向量检索能力的 PostgreSQL + pgvector、Elasticsearch 8+ 等。
判断"是否需要向量数据库"可以从以下三个信号出发:
1. 候选集合大于 10 万 条文档; 2. 业务对召回语义相关而非字面相关有明确诉求; 3. 召回规模要求在 毫秒级到秒级 延迟内完成。
当上述三条同时满足时,向量数据库就从"可选"变为"必需"。
1.4.2 现代应用场景:从搜索到对话到推荐
应用一:智能文档问答(Document QA / RAG)
把企