几十年来,搜索意味着匹配词语。您输入一个术语,引擎就会返回包含该精确术语的页面。基于 AI 的检索工作原理则有所不同。它不再询问“该页面是否包含这些词”,而是询问“该段落是否与问题具有相同的含义”。它是通过将文本转换成对含义进行编码的数字(称为 embeddings),然后比较这些数字在空间里的接近程度来实现的。理解这种转变是被 AI 系统发现的基础,因为用不同的词语阐述正确内容现在可以胜出,而充斥着关键词却缺乏实质意义的内容极易落败。
关键词匹配寻找的是字词;embeddings 寻找的是含义
传统的关键词搜索通常由名为 BM25 的算法驱动,它根据查询的精确词项出现的频率来为页面评分,并根据这些词项的稀有度进行加权。它的弱点是词义鸿沟:如果搜索者询问“automobile”(轿车),而您的页面仅写着“car”(汽车),那么纯关键词系统极有可能完全错过该匹配。基于 Embedding 的检索机制专为弥合这一鸿沟而构建,其通过对比含义而非表层文字,实现同义词和改写句在词汇零重合的情况下依然能够匹配。这是稠密检索模型有据可查的行为,并非臆测。
embedding 是一串数字,用于在语义地图上为文本定位
embedding 模型(通常是像 BERT 风格编码器这样的 transformer)会将一段文本转换为固定长度的数字列表,称为稠密向量(dense vector)。含义相似的文本会产生相似的向量,因此这些数字就像是巨型地图上的坐标,相关的概念在此聚集。具体的维度对人类来说不可读,也没有任何一个数字能映射到单一的概念;相反,语义是分布在整个向量中的。这就是为什么针对同一主题、表述却不同的两句话,即使不包含任何共同的关键词,在地图上的位置也会非常接近。
相似度是通过距离来衡量的,通常是余弦相似度
为了回答问题,系统会将查询进行 embedding 转换为向量,然后寻找与其最接近的存储内容向量。接近度最常通过余弦相似度(cosine similarity)来衡量,它比较的是两个向量之间的夹角而不是它们的长度,或者使用与之相关的点积(dot product)。由于与数百万个向量进行逐一比对极慢,生产系统会使用 Approximate Nearest Neighbor (ANN) 检索,这能比精确扫描更快地找到几乎最接近的向量。这种权衡是以微小、通常可接受的精确度损失换取显著的速度提升。
匹配发生在 chunk 级别,而不是整个网页
AI 检索系统通常不会将整个网页作为一个整体来进行 embedding。它们首先会将文档拆分为更小的 chunk,通常在几百个 token 左右,且不同 chunk 之间往往有一定的重叠,以免在边界处切断语义。每个 chunk 都有自己独立的 embedding,而检索时是以 chunk 为单位进行竞争的。这意味着,即使页面上其他内容并不相关,一段逻辑清晰、内容完备的文章段落也可能被 AI 提取为答案。正因如此,结构良好、主题专注的内容版块,其效果远胜于未做区分的冗长文本。
大多数实际系统结合使用这两种方法,而不仅仅依靠 embedding
Embeddings 擅长语义表达,但在精确匹配(如特定产品代码、型号或专有名词)上表现较弱。因此,大多数生产环境下的检索系统都会使用混合检索,将关键词检索(BM25)与稠密向量检索相结合,并合并两份排序列表,通常采用一种名为 Reciprocal Rank Fusion 的方法按排名而非不具可比性的分数来合并结果。许多工作流在此之后还会加入重排步骤,利用更高昂的模型对候选热门结果进行重新评分。实践层面的启示在于:在追求语义清晰的同时,精确的词汇依然不可或缺;这绝非是非此即彼的选择。
- AI 检索匹配的是语义,而不仅仅是精确的词汇,因此,只要内容能清晰地回答问题,即使使用了与搜索者不同的词汇,依然能被检索到。
- embedding 是一种稠密向量(即一个数字列表),其中相似的语义会产生相近的向量;接近度通常通过余弦相似度来衡量,并通过 Approximate Nearest Neighbor 检索来加速。
- 检索匹配通常发生在 chunk 层面,因此与未经结构划分的冗长文本相比,主题专注、内容完备且字数在几百字左右的版块更容易被 AI 系统检索和引用。
- 大多数生产系统都采用混合检索(关键词加 embeddings),并通常包含一个重排(reranking)步骤,因此,在清晰的语义基础之上,诸如名称和型号等精准的词汇依然非常重要。
- 对可见性的实际启示:针对实际概念进行自然通顺的写作,将内容组织为结构清晰的 chunk,并保留精确的标识符信息,而不是依赖单调的关键词重复。
