第 51 篇 · 检索与知识增强

相似度搜索:如何找到相关内容

你问AI问题,它怎么知道去哪里找答案?

你有没有想过,当你问ChatGPT"怎么做番茄炒蛋"时,它是怎么知道要给你一个菜谱的?

或者当你在搜索引擎搜"最好的智能手机"时,它怎么知道要给你iPhone、华为、小米这些结果?

背后就是相似度搜索。它把你的问题变成向量,然后在海量信息中找到和你的问题最相似的内容。

这听起来简单,但做起来有很多技巧。让我给你讲讲。

相似度搜索是什么?

1
从关键词匹配到语义匹配

传统的搜索是关键词匹配:你搜"苹果",系统就找包含"苹果"这个词的文档。

关键词匹配 vs 相似度搜索

🔍 关键词匹配

问题

"智能手机"

↓ 匹配关键词

✓ 找到

"智能手机排行榜"

"智能手机推荐"

✗ 漏掉

"iPhone评测"(没"智能手机"关键词)

"安卓手机对比"(没"智能手机"关键词)

🎯 相似度搜索

问题向量

"智能手机" → [0.8, 0.6, ...]

↓ 找相似向量

✓ 全找到

"智能手机排行榜"(相似度 0.95)

"iPhone评测"(相似度 0.89)

"安卓手机对比"(相似度 0.87)

"手机选购指南"(相似度 0.82)

💡 核心区别

关键词匹配是字面匹配——只能找到包含关键词的文档。相似度搜索是语义匹配——能找到语义相关但字面不同的文档。这就是为什么相似度搜索更聪明。

相似度计算方法

2
怎么衡量"相似"?

相似度搜索的核心是相似度计算。有几种常见方法:

三种相似度计算方法

📏 余弦相似度(Cosine Similarity)

计算两个向量的夹角余弦值

cos(θ) = (A · B) / (|A| × |B|)
  • • 范围:[-1, 1]
  • • 1 = 完全相同方向
  • • 0 = 垂直(无关)
  • • -1 = 完全相反

特点

✓ 最常用

✓ 不受向量长度影响(只看方向)

✓ 适合文本语义相似度

适用场景

文本检索、推荐系统

📐 欧氏距离(Euclidean Distance)

计算两个向量的直线距离

d = √(Σ(Ai - Bi)²)
  • • 范围:[0, +∞)
  • • 0 = 完全相同
  • • 值越大越不相似

特点

✓ 直观(就是距离)

✓ 受向量长度影响

✓ 适合物理位置、图像特征

适用场景

图像检索、地理位置

🎯 点积(Dot Product)

计算两个向量的点积

A · B = Σ(Ai × Bi)
  • • 范围:(-∞, +∞)
  • • 值越大越相似
  • • 受向量长度影响

特点

✓ 计算最快(无需归一化)

✓ 结合长度信息

✓ 适合归一化向量

适用场景

大规模检索、推荐系统

📊 如何选择?

  • 文本语义相似度:余弦相似度(最常用)
  • 图像特征匹配:欧氏距离或余弦相似度
  • 推荐系统(归一化向量):点积(速度快)
  • 需要考虑向量长度:点积或欧氏距离
近似最近邻搜索

3
如何在海量数据中快速搜索?

如果暴力搜索(计算查询向量和所有向量的相似度),在百万级数据上会非常慢。我们需要近似最近邻搜索(ANN)。

ANN的核心思想

❌ 暴力搜索

计算所有向量相似度

时间复杂度:O(N)

N=100万时,太慢!

⚡ ANN思想

用空间换时间

预先构建索引

只搜索部分向量

✓ 效果

速度提升100-1000倍

召回率95%+

牺牲一点精度,换速度

🔍 召回率(Recall)

ANN找到的最近邻中,真正是最近邻的比例。

召回率 = 正确找到的数量 / 真正最近邻数量

召回率95% = 找到的Top-10中,平均有9.5个是真正的最近邻

⚡ 延迟(Latency)

从查询到返回结果的时间。

好的ANN:<10ms(百万级)

优秀的ANN:<1ms(百万级)

需要在召回率和延迟之间权衡

混合搜索

4
向量搜索 + 关键词搜索 = 更好结果

相似度搜索虽然强大,但有时候也会出问题。比如你搜"苹果公司",它可能给你"苹果水果"的结果(因为向量相似)。

解决方案:混合搜索(Hybrid Search)——结合向量搜索和关键词搜索。

混合搜索的工作方式
Step 1并行搜索

向量搜索

找语义相似的结果

"苹果公司" → [0.8, 0.6, ...] → 找相似向量

关键词搜索

找包含关键词的结果

"苹果公司" → 匹配"苹果" AND "公司"

Step 2结果融合

倒数排名融合(RRF):把两个搜索结果的排名倒数相加

加权平均:给向量搜索和关键词搜索不同权重

重排序:用交叉编码器对结果重新打分

Step 3返回最佳结果

效果

✓ 既考虑语义相似,又保证关键词匹配

✓ 召回率更高、结果更准确

✓ 能处理歧义查询(如"苹果")

实际应用技巧

5
如何让相似度搜索更好?

🏷️ 元数据过滤

在搜索时加上条件过滤,比如:

  • • 只搜索某个类别的文档
  • • 只搜索某个时间段的内容
  • • 只搜索某个作者的文章

效果:更精准、更快速

🔄 重排序(Reranking)

先用ANN快速找到Top-100,再用更精确(但慢)的方法重排序

  • • ANN召回率高但精度一般
  • • 重排序用交叉编码器,精度高
  • • 只对Top-K重排序,不影响速度

效果:精度更高

📊 向量归一化

把所有向量归一化到单位长度

  • • 点积 = 余弦相似度
  • • 计算更快
  • • 不受向量长度影响

效果:速度更快、结果更稳定

🎯 多向量查询

把查询拆成多个子查询,分别搜索再合并

  • • "便宜的智能手机推荐"
  • • → "便宜手机" + "智能手机" + "推荐"
  • • 分别搜索,合并结果

效果:召回率更高

常见误区

6
别掉进这些坑

❌ 误区1:召回率越高越好

不是的。召回率越高,延迟通常也越高。需要在召回率和延迟之间找到平衡点。

✓ 实际:召回率95%通常是很好的平衡点

❌ 误区2:只看相似度分数

相似度分数本身意义不大。重要的是相对排序和业务效果。要结合用户反馈、点击率等指标评估。

✓ 实际:用A/B测试看实际效果

❌ 误区3:向量搜索完全取代关键词搜索

不是的。关键词搜索在某些场景下仍然很有用(比如精确匹配)。最好的方法是混合搜索。

✓ 实际:向量 + 关键词 = 最佳效果

总结

核心总结

🎓 一句话总结

  • 定义:相似度搜索通过向量相似度找相关内容,比关键词匹配更智能
  • 方法:余弦相似度(最常用)、欧氏距离、点积——各有优劣
  • 加速:ANN用空间换时间,召回率95%+,延迟<10ms
  • 优化:混合搜索、元数据过滤、重排序、多向量查询——让搜索更精准

下一篇预告

相似度搜索很强大,但AI还是会编故事

即使有了相似度搜索,AI仍然可能给你一个听起来很真实但其实是编的答案。怎么办?

答案是RAG(检索增强生成):让AI先"查资料",再回答问题。下一篇我们就讲这个改变一切的魔法。

✏️ 手绘图解 · AI Catch 出品

第 51 篇 / 共 84 篇 · 第六阶段:检索与知识增强