向量数据库与语义检索入门
传统搜索靠关键词匹配:“苹果手机”必须包含”苹果”或”手机”这些字。但用户搜”iPhone”时可能也想要它。语义检索的目标,就是让搜索”理解意思”而不只是”对字”。它的基石是向量与向量数据库。
embedding:把意思变成一串数字
embedding(嵌入)是一个把文本、图片等内容转成定长向量的过程。这个向量可以理解为内容在一个高维”语义空间”里的坐标。训练得当时,意思相近的内容,坐标也彼此靠近——“猫”和”小猫”很近,“猫”和”汽车”很远。
于是”判断两段内容意思像不像”就变成了”计算两个向量距离近不近”。这正是语义检索能跨越具体用词、抓住含义的原因。
相似度:用余弦衡量”方向是否一致”
衡量两个向量有多相似,最常用的是余弦相似度——比较它们的”方向”,值越接近 1 越相似。直觉上,方向一致代表语义一致,而向量的长度(模)则被忽略。
用伪代码表示非常简单:
function cosine(a, b):
dot = sum(a[i] * b[i] for i in range(len(a))) # 点积
na = sqrt(sum(x * x for x in a)) # a 的模
nb = sqrt(sum(x * x for x in b)) # b 的模
return dot / (na * nb) # 越接近 1 越相似
实践中向量常被提前归一化(模为 1),这样余弦相似度就退化成简单的点积,计算更快。
ANN:在海量向量里快速找近邻
如果库里有上千万条向量,逐一算余弦再排序会非常慢。于是工程上用”近似最近邻”(ANN, Approximate Nearest Neighbor):牺牲一点点精度,换取数量级的速度提升。
主流算法之一是 HNSW(分层可导航小世界图)。它把向量组织成多层的图结构:上层稀疏、用于”大步跳跃”快速逼近目标区域,下层密集、用于”精细搜索”。检索时从顶层入口出发逐层下沉,像查地图先看省、再看市、再看街道,从而在对数级的步数内找到足够好的近邻。
向量数据库:把这一切产品化
把”存向量 + 建索引 + 高效检索 + 过滤元数据”打包成一个系统,就是向量数据库。常见的有 Qdrant、Milvus、pgvector(PostgreSQL 扩展)等。选型时通常关注几点:
- 检索性能与召回率:速度和准确度的平衡。
- 过滤能力:能否在向量检索的同时按标签、时间等结构化条件筛选。
- 可运维性:增量更新、持久化、水平扩展是否方便。
- 接入成本:已有 PostgreSQL 的团队,pgvector 可能比独立部署一套更省事。
在 RAG 中的角色
回到实际应用,向量数据库是 RAG 的”记忆中枢”:文档被切块、向量化后存入;用户提问时检索出最相关的片段交给大模型。可以说,检索的质量直接决定了 RAG 回答的质量——再强的模型,喂错了材料也答不好。
小结
语义检索的链条其实很清晰:用 embedding 把内容变成向量,用余弦相似度衡量语义距离,用 HNSW 这类 ANN 算法在海量数据里快速找近邻,再由向量数据库把整套能力工程化。理解了它,你也就理解了现代 AI 应用”记忆”与”检索”的底座。
← 返回首页