相似度搜索:如何找到相关内容
你问AI问题,它怎么知道去哪里找答案?
你有没有想过,当你问ChatGPT"怎么做番茄炒蛋"时,它是怎么知道要给你一个菜谱的?
或者当你在搜索引擎搜"最好的智能手机"时,它怎么知道要给你iPhone、华为、小米这些结果?
背后就是相似度搜索。它把你的问题变成向量,然后在海量信息中找到和你的问题最相似的内容。
这听起来简单,但做起来有很多技巧。让我给你讲讲。
1从关键词匹配到语义匹配
传统的搜索是关键词匹配:你搜"苹果",系统就找包含"苹果"这个词的文档。
🔍 关键词匹配
问题
"智能手机"
✓ 找到
"智能手机排行榜"
"智能手机推荐"
✗ 漏掉
"iPhone评测"(没"智能手机"关键词)
"安卓手机对比"(没"智能手机"关键词)
🎯 相似度搜索
问题向量
"智能手机" → [0.8, 0.6, ...]
✓ 全找到
"智能手机排行榜"(相似度 0.95)
"iPhone评测"(相似度 0.89)
"安卓手机对比"(相似度 0.87)
"手机选购指南"(相似度 0.82)
💡 核心区别
关键词匹配是字面匹配——只能找到包含关键词的文档。相似度搜索是语义匹配——能找到语义相关但字面不同的文档。这就是为什么相似度搜索更聪明。
2怎么衡量"相似"?
相似度搜索的核心是相似度计算。有几种常见方法:
📏 余弦相似度(Cosine Similarity)
计算两个向量的夹角余弦值
- • 范围:[-1, 1]
- • 1 = 完全相同方向
- • 0 = 垂直(无关)
- • -1 = 完全相反
特点
✓ 最常用
✓ 不受向量长度影响(只看方向)
✓ 适合文本语义相似度
适用场景
文本检索、推荐系统
📐 欧氏距离(Euclidean Distance)
计算两个向量的直线距离
- • 范围:[0, +∞)
- • 0 = 完全相同
- • 值越大越不相似
特点
✓ 直观(就是距离)
✓ 受向量长度影响
✓ 适合物理位置、图像特征
适用场景
图像检索、地理位置
🎯 点积(Dot Product)
计算两个向量的点积
- • 范围:(-∞, +∞)
- • 值越大越相似
- • 受向量长度影响
特点
✓ 计算最快(无需归一化)
✓ 结合长度信息
✓ 适合归一化向量
适用场景
大规模检索、推荐系统
📊 如何选择?
- • 文本语义相似度:余弦相似度(最常用)
- • 图像特征匹配:欧氏距离或余弦相似度
- • 推荐系统(归一化向量):点积(速度快)
- • 需要考虑向量长度:点积或欧氏距离
3如何在海量数据中快速搜索?
如果暴力搜索(计算查询向量和所有向量的相似度),在百万级数据上会非常慢。我们需要近似最近邻搜索(ANN)。
❌ 暴力搜索
计算所有向量相似度
时间复杂度:O(N)
N=100万时,太慢!
⚡ ANN思想
用空间换时间
预先构建索引
只搜索部分向量
✓ 效果
速度提升100-1000倍
召回率95%+
牺牲一点精度,换速度
🔍 召回率(Recall)
ANN找到的最近邻中,真正是最近邻的比例。
召回率 = 正确找到的数量 / 真正最近邻数量
召回率95% = 找到的Top-10中,平均有9.5个是真正的最近邻
⚡ 延迟(Latency)
从查询到返回结果的时间。
好的ANN:<10ms(百万级)
优秀的ANN:<1ms(百万级)
需要在召回率和延迟之间权衡
4向量搜索 + 关键词搜索 = 更好结果
相似度搜索虽然强大,但有时候也会出问题。比如你搜"苹果公司",它可能给你"苹果水果"的结果(因为向量相似)。
解决方案:混合搜索(Hybrid Search)——结合向量搜索和关键词搜索。
向量搜索
找语义相似的结果
"苹果公司" → [0.8, 0.6, ...] → 找相似向量
关键词搜索
找包含关键词的结果
"苹果公司" → 匹配"苹果" AND "公司"
• 倒数排名融合(RRF):把两个搜索结果的排名倒数相加
• 加权平均:给向量搜索和关键词搜索不同权重
• 重排序:用交叉编码器对结果重新打分
效果
✓ 既考虑语义相似,又保证关键词匹配
✓ 召回率更高、结果更准确
✓ 能处理歧义查询(如"苹果")
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 篇 · 第六阶段:检索与知识增强