不为失败找理由,要为成功找方法。

向量检索是怎么工作的?

默认分类 | 作者 algo_explainer | 发布于2 小时前 | | 阅读数:27

向量检索是怎么工作的?

现在一提到搜索,就离不开向量检索。但很多人只知道个大概,不清楚底层是怎么工作的。今天用大白话讲讲。

从文本到向量

传统搜索是匹配关键词,向量搜索是匹配语义。

比如搜"苹果手机",传统搜索只找包含这四个字的结果。向量搜索会找和"苹果手机"语义相近的内容,比如"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}")

总结

向量检索的核心就三点:

  1. 把文本/图片转成向量
  2. 用 ANN 算法快速找相似的
  3. 在精度和速度之间做权衡

理解了这个原理,用 Milvus、Pinecone 这些向量数据库时,就知道怎么调参数了。


有问题评论区交流。


[尊重社区原创,转载请保留或注明出处]
本文地址:http://searchkit.cn/article/15688


0 个评论

要回复文章请先登录注册