向量检索是怎么工作的?
现在一提到搜索,就离不开向量检索。但很多人只知道个大概,不清楚底层是怎么工作的。今天用大白话讲讲。
从文本到向量
传统搜索是匹配关键词,向量搜索是匹配语义。
比如搜"苹果手机",传统搜索只找包含这四个字的结果。向量搜索会找和"苹果手机"语义相近的内容,比如"iPhone"、"Apple手机"。
怎么做到的?
先把文本转成向量(一串数字)。这个过程叫 Embedding。
"苹果手机" → [0.1, 0.3, 0.5, 0.2, ...] (几百维的向量)
"iPhone" → [0.1, 0.3, 0.5, 0.2, ...] (和上面很接近)
"香蕉" → [0.8, 0.1, 0.2, 0.9, ...] (和上面差很远)
怎么找相似的向量?
最简单的方法是算距离。两个向量越近,语义越相似。
但问题是:数据量大了之后,挨个算距离太慢了。
假设有 1 亿个向量,每次查询都要算 1 亿次距离,这谁顶得住?
近似最近邻(ANN)
聪明的工程师想了个办法:不用精确找最近的,找个差不多的就行。
这就是近似最近邻(Approximate Nearest Neighbor)。
常用的算法有:
HNSW(分层导航小世界)
- 把向量建个图,相似的向量连上线
- 查询时从入口开始,一步步跳到最近的
- 像走迷宫,但有很多捷径
IVF(倒排文件索引)
- 先把向量聚类,分成很多组
- 查询时先找最近的组,再在这个组里找
- 像先找省份,再找城市
PQ(乘积量化)
- 把向量压缩,减少存储和计算量
- 牺牲一点精度,换来速度提升
实际应用中的权衡
| 算法 | 精度 | 速度 | 内存 | 适用场景 |
|---|---|---|---|---|
| HNSW | 高 | 快 | 大 | 小规模、高精度 |
| IVF | 中 | 很快 | 中 | 大规模 |
| PQ | 中 | 快 | 小 | 资源受限 |
实际项目中,经常是几种算法组合使用。
一个简单例子
用 Python 和 Faiss 实现向量检索:
import faiss
import numpy as np
# 生成 10000 个 128 维的向量
data = np.random.random((10000, 128)).astype('float32')
# 建索引(用 IVF)
index = faiss.IndexIVFFlat(faiss.IndexFlatL2(128), 128, 100)
index.train(data)
index.add(data)
# 查询
query = np.random.random((1, 128)).astype('float32')
distances, indices = index.search(query, 5)
print(f"最近的5个向量: {indices}")
总结
向量检索的核心就三点:
- 把文本/图片转成向量
- 用 ANN 算法快速找相似的
- 在精度和速度之间做权衡
理解了这个原理,用 Milvus、Pinecone 这些向量数据库时,就知道怎么调参数了。
有问题评论区交流。
[尊重社区原创,转载请保留或注明出处]
本文地址:http://searchkit.cn/article/15688
本文地址:http://searchkit.cn/article/15688