Skip to content

向量数据库与语义检索

本页速览 向量数据库以 Embedding 为核心,按语义相似度做近似最近邻检索,是 RAG 系统的存储底座。本文覆盖向量原理、语义检索、相似度度量、ANN 索引、产品选型与工程陷阱。

本页含时效性内容,数据截止于 2025-06;JD、榜单、产品功能等信息可能已变化,引用前请核对原始出处。

向量数据库与语义检索 ​

向量数据库(Vector Database)是专为存储与检索高维向量(Embedding)而设计的数据库,支持按语义相似度进行近似最近邻(ANN)检索,是 RAG 系统的存储底座。

它解决的核心问题是传统数据库做不到的:存进去的不是"张三是谁"这种结构化记录,而是"这段文本/这张图/这段语音在语义上是什么"的高维坐标;查出来时也不靠 WHERE 精确匹配,而是问"和这段查询最像的 10 条是什么"。谁在用?几乎所有生产级 RAG 应用——从 Perplexity 这类 AI 搜索,到企业内部文档问答——底层都挂着向量数据库;推荐系统、多模态搜索、Agent 记忆也都是它的主场。在理解它之前,先理解它存的东西:向量(Embedding)。

一句话定位

如果说 RAG 是"给大模型配一个外挂知识库"的系统架构,那么向量数据库就是这个外挂知识库的存储与检索引擎——知识能不能被查到、查得准不准,很大程度取决于这一层。

一、前置概念:Embedding 与向量 ​

嵌入(Embedding)是把文本、图像、音频等非结构化数据映射为高维向量的过程,映射结果就是一个由几百到几千个浮点数组成的向量,例如 [0.13, -0.42, 0.87, ...]。它的核心性质是一条几何假设:语义相近的对象,其向量在空间中位置也相近。

  • 文本 Embedding:整句/整段编码为一个向量,由 Transformer 这类模型的编码器生成,常见维度如 768(BERT-base)、1024(BGE)、1536(OpenAI text-embedding-3-small)、3072(text-embedding-3-large)。
  • 图像 Embedding:图像经 CLIP 等模型的视觉分支编码为向量,可与文本向量放在同一空间(见多模态模型)。
  • 每个向量本质上是高维空间中的一个点,两个点"离得越近"(按某种距离度量),语义越接近。
概念一句话解释典型维度
词向量(Word2Vec)每个词一个向量,"国王−男人+女人≈女王"100–300
句向量/文本向量整句/整段一个向量,语义可比768–3072
多模态向量文本、图像映射到同一向量空间512–1024

一句话判断:Embedding 的质量决定检索质量的上限——向量数据库只是忠实地做近邻搜索,如果 Embedding 模型本身区分不开语义(比如分不清"苹果公司"和"苹果手机"),任何索引技巧都救不回来。

二、语义检索 vs 关键词检索 ​

传统搜索引擎的关键词检索以 BM25 为代表:把文档切成词,统计词频与逆文档频率,查询与文档按"共有词的权重"打分。它完全不知道词的意思。

对比维度BM25 关键词检索向量语义检索
匹配单位字面词(token)语义向量
是否理解同义词否("汽车"匹配不到"车")是(语义相近即命中)
多语言能力差(分词问题)强(同一向量空间直接比)
对查询的鲁棒性换种说法就搜不到表达不同但意思相同也能召回
精确度高(命中即相关)中(可能召回"像但不相关")
是否需要倒排索引是否(需要 ANN 索引)
典型延迟毫秒级毫秒级(近似的)
适合场景精确关键词、编号、日志自然语言问答、模糊语义

一个直观例子:用户问"怎么给花浇水",BM25 需要文档里真的出现"浇水"才可能命中;向量检索可以召回一篇写"植物的水分管理"的文章——因为它俩的向量离得近。

一句话判断:别迷信向量检索"万能"——查订单号、身份证、精确产品型号时 BM25 完胜;而开放域问答、语义模糊的场景向量检索完胜。所以成熟系统几乎都用混合检索(见第六节)把两者叠加,而不是二选一。

三、相似度度量:余弦相似度、内积、欧氏距离 ​

给定查询向量 q 与候选向量 d,判断"多像"有三种主流度量:

度量公式数值范围什么时候用
余弦相似度(Cosine)$\cos\theta=\frac{q\cdot d}{|q||d|}$[-1, 1](越高越像)最常用默认项;关心"方向"而非"模长",对 Embedding 的语义对比最稳
内积(Dot Product)$q\cdot d=\sum_i q_i d_i$无界已归一化或模型按内积训练时;适合显式建模"相关度分数"
欧氏距离(L2)$\sqrt{\sum_i (q_i-d_i)^2}$[0, +∞)(越小越近)需要物理距离语义时;L2 越小越相似,检索时按升序取最小

度量与索引的匹配坑

度量选错会导致召回结果莫名变差。比如索引按"余弦"构建,查询却传了"内积"分数;或者用了 L2 距离却忘记 Embedding 未归一化,让"模长大的向量"系统性占便宜。多数文本 Embedding 模型推荐先 L2 归一化再算内积/余弦——此时三者结果排序等价,也方便不同度量间切换。

经验结论:没特别理由就用余弦相似度(文本场景);图像/视频特征常用内积;需要严格"空间距离"语义时才用欧氏距离。选定后全链路保持一致,并在评估集上验证(见LLM 评估与基准)。

四、核心技术:ANN 索引 ​

朴素做法是暴力扫描(Brute Force):把查询向量和库里每一个向量算相似度再排序。数据量小时(万级)没问题;到了百万、亿级,一次查询要算几百万次点积,延迟无法接受。于是诞生了 近似最近邻(Approximate Nearest Neighbor, ANN) 索引:牺牲一点点召回率,换取数量级的速度提升。

检索方式速度召回率内存适用规模
精确检索(暴力扫描)慢(O(N))100%低< 10 万
ANN(HNSW/IVF/PQ)极快(毫秒级)90–99%中–高百万到十亿

三大主流 ANN 算法:

算法全称/思路优点缺点
HNSW分层可导航小世界图(Hierarchical Navigable Small World)召回率高、查询快、无需训练内存占用大、插入成本高
IVF倒排文件(Inverted File),先聚类分桶再桶内搜索内存可控、构建快桶边界的召回损失、参数敏感
PQ乘积量化(Product Quantization)大幅压缩向量(内存省 8–32 倍)精度损失、查询需查表较复杂
text
HNSW 检索过程(文字示意图):

 第4层  ──●────────────────────  入口点(最稀疏,长跳)
         │
 第3层  ──●──●──●──────────────
         │        │
 第2层  ──●──●──●──●──●────────  贪心搜索,逐步下探
         │     │     │
 第1层  ──●──●──●──●──●──●──●─  最底层(最稠密)
                                 
 查询从顶层入口进入 → 每层贪心走向最近的邻居 →
 到底层后用光束搜索(beam search)收集 Top-K 候选

文字图里发生了什么:HNSW 把向量组织成多层图——上层稀疏负责"远距离跳转"、底层稠密负责"精确定位"。查询向量从顶层入口出发,每层都走向"当前最近的邻居",逐层下探到最底层,再在底层收集一批候选并排序。整个过程是贪心的,所以理论上可能错过全局最近点——这就是"近似"的来源,实际工程中召回率损失通常 < 1%。

  • HNSW 是当前默认主力(Milvus、Qdrant、pgvector、FAISS 都支持),Rust/Go 实现下典型 p95 查询延迟在几毫秒到几十毫秒;
  • IVF + PQ 组合常被用于十亿级、内存吃紧的场景:先量化压缩再分桶检索;
  • 一句话判断:默认 HNSW,数据量上亿或内存受限再考虑 IVF/PQ;论文出处见文末参考资料(HNSW,arXiv:1603.09320)。

五、产品与选型对比 ​

截至 2025 年中,向量检索生态分两类:向量数据库(完整数据库产品)与向量检索库/扩展(嵌入到应用或现有数据库里)。主流选项如下:

产品类型核心特性ANN 支持部署形态
FAISS(Meta 开源)检索库最成熟的底层算法库,GPU 加速强,生态事实标准HNSW/IVF/PQ嵌入应用(需自管数据)
Milvus(Zilliz)分布式向量数据库云原生、十亿级扩展、GPU 索引(CAGRA)、强 FilterHNSW/IVF/PQ 等本地/自托管/云托管
Qdrant(开源)向量数据库Rust 实现、过滤与 Payload 极强、延迟低HNSW本地/自托管/云托管
Pinecone托管向量数据库全托管、免运维、Serverless内部优化索引仅云托管
Weaviate向量数据库内建 GraphQL、生成式模块、模块化HNSW本地/云托管
pgvectorPostgreSQL 扩展与现有 SQL 共存、事务一致、零新基建HNSW/IVF随 PostgreSQL
Chroma轻量向量数据库Python 原生、开发上手最快HNSW本地/嵌入式
Elasticsearch搜索引擎 + 向量与 BM25/倒排共用一套系统,dense_vector 字段HNSW本地/云托管

本地 vs 云托管的取舍:

维度本地/自托管云托管(Pinecone、云版 Milvus/Qdrant)
初始成本低(开源免费)高(按量计费)
运维负担高(索引调参、扩容、备份)低(平台负责)
数据合规数据在自己手里需评估数据出境与隐私条款
规模弹性需自己规划弹性扩缩容
适合学习、POC、私有化、已有 K8s 团队快速上线、波动负载、小团队

一句话判断:团队没有专门的检索工程师,就从托管服务起步;等规模与成本压力出现再迁回自托管。已有 PostgreSQL 业务且向量量在百万级以下,先试 pgvector——零新组件、事务与 SQL 天然可用,这是成本最低的起步路径。

六、在 RAG 流水线中的角色 ​

典型 RAG 流水线(详见从零搭建 RAG 应用)中,向量数据库承担存储与召回环节:

text
文档切片 → ① Embedding 编码 → ② 写入向量数据库(索引)
                                        │
用户问题 → ③ Embedding 编码 → ④ ANN 检索 Top-K → ⑤ 重排(Rerank)
                                        │
                        元数据过滤(时间/来源/权限)贯穿 ④
                                        ▼
                      检索结果拼入 Prompt → LLM 生成回答

三个关键实践:

  1. 索引 → 检索 → 重排:向量数据库只负责召回"宽"的候选(通常 Top-50~200),重排器(如 cross-encoder)再精排成 Top-5~10 喂给 LLM。召回宁多勿漏,精排宁精勿滥——这是提升答案质量性价比最高的一环;
  2. 元数据过滤:向量数据库几乎都支持在查询时叠加过滤条件(时间范围、文档来源、业务线、权限标签)。先过滤再 ANN 搜索能大幅减少候选集、提升准确率。权限过滤尤其重要——否则"能搜到但无权看"的文档会被检索出来;
  3. 混合检索(稠密向量 + 稀疏 BM25):把向量检索与 BM25 结果做加权合并(如 RRF 倒数排名融合),兼顾语义与精确匹配。这是 Perplexity 这类 AI 搜索产品的标准做法,能显著缓解向量检索"像但不相关"的毛病。

评估优先

给 RAG 配向量数据库前,先建立检索质量基线:准备一批"问题 → 期望文档"的标注集,量化召回率@k(想要的文档是否被召回)与命中率@k(召回的是否相关)。没有这个基线,索引参数、Embedding 模型、混合权重都只能靠感觉调。

七、高级话题 ​

7.1 向量 + 知识图谱:互补而非竞争 ​

向量擅长"模糊语义联想",但不懂"关系与规则";知识图谱擅长精确的多跳关系推理,但对自然语言表达脆弱。两者互补(详见知识图谱与知识注入):

场景向量数据库知识图谱
"有哪些文档讲微服务降级?"强(语义召回)弱
"A 服务依赖的 B 服务依赖了谁?"弱强(多跳推理)
事实一致性无法保证(向量是概率表示)可验证
权限/规则需自行实现过滤天然适合规则

实践模式:先向量检索召回候选实体,再用图谱对候选做关系验证与路径推理,最后拼装答案。

7.2 多模态向量:跨模态检索 ​

CLIP 类模型把文本与图像映射到同一向量空间,于是"上传一张图搜相似商品""用文字描述搜图片/视频片段"都变成一次向量近邻查询(见多模态模型)。向量数据库对多模态的唯一要求是:检索的 Embedding 来自同一模型家族——混用不同模型的向量等于用不同坐标系比距离,结果无意义。

7.3 向量数据库作为 Agent 的长期记忆 ​

AI 智能体(Agent)的上下文窗口有限,需要把历史交互、工具结果、用户偏好沉淀为"可查询的记忆"。常见方案:把每次交互编码为向量存入向量数据库,新任务到来时先按相关性召回过往经验,再拼进上下文(详见从零开发一个 Agent)。这与 RAG 在技术上几乎同构,区别在于写入的是过程记录而非知识文档,因此对写入频率、去重与时效(记忆过期)的要求更高。

八、工程陷阱 ​

维度灾难(Curse of Dimensionality) ​

向量维度越高,空间中任意两点距离越趋同,近邻区分度下降。缓解:选择与数据量匹配的 Embedding 维度(小数据集用 384 维就够)、对高维向量做 PCA/量化降维、用余弦而非欧氏距离。

冷启动(Cold Start) ​

新入库数据少、没有足够近邻,检索质量差;或 Embedding 模型换版本导致新旧向量空间不一致。缓解:冷启动期允许混合检索兜底;Embedding 模型升级时**全量重嵌入(re-embed)**并重建索引,绝不混用新旧向量。

数据更新与删除 ​

向量索引的"更新"通常是先删旧再加新,而非原地改值;高频增删会拖慢 HNSW(图结构需维护)。删除在分布式实现里常是"软删除 + 定期压缩"。缓解:批量化写入、评估吞吐需求再选架构(读写比例决定索引配置)。

成本 ​

向量检索的钱花在内存(HNSW 图全在内存)与 Embedding 计算上。百万条 1536 维向量约需 6GB 内存(不含索引开销)。缓解:用 PQ 量化压内存、为热点数据分温冷层、对每轮查询的嵌入复用缓存,并与推理优化与量化中的成本思维对齐。

向量数据库不是银弹

它解决"按语义找相似",不解决"答案是否正确、事实是否一致"。把公司全部数据塞进向量库、期望 LLM 引用全部正确,是把检索召回与事实核验两件事混为一谈——后者要靠评估、Rerank 与护栏。更多翻车现场见常见陷阱与反模式。

延伸阅读 ​

参考资料 ​