惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

TaoSecurity Blog
TaoSecurity Blog
L
LINUX DO - 最新话题
Help Net Security
Help Net Security
N
News | PayPal Newsroom
www.infosecurity-magazine.com
www.infosecurity-magazine.com
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
The Last Watchdog
The Last Watchdog
S
Security @ Cisco Blogs
W
WeLiveSecurity
C
CXSECURITY Database RSS Feed - CXSecurity.com
Webroot Blog
Webroot Blog
T
Troy Hunt's Blog
V
Vulnerabilities – Threatpost
Google Online Security Blog
Google Online Security Blog
N
News and Events Feed by Topic
T
Threat Research - Cisco Blogs
Security Archives - TechRepublic
Security Archives - TechRepublic
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tor Project blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
D
Darknet – Hacking Tools, Hacker News & Cyber Security
PCI Perspectives
PCI Perspectives
Google DeepMind News
Google DeepMind News
T
Tailwind CSS Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Apple Machine Learning Research
Apple Machine Learning Research
IT之家
IT之家
S
SegmentFault 最新的问题
J
Java Code Geeks
P
Privacy & Cybersecurity Law Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
博客园 - 【当耐特】
博客园_首页
H
Hacker News: Front Page
T
Threatpost
Jina AI
Jina AI
博客园 - Franky
月光博客
月光博客
L
LINUX DO - 热门话题
The Cloudflare Blog
H
Heimdal Security Blog
博客园 - 司徒正美
酷 壳 – CoolShell
酷 壳 – CoolShell
Cloudbric
Cloudbric
雷峰网
雷峰网
Hugging Face - Blog
Hugging Face - Blog
S
Secure Thoughts
T
Tenable Blog
I
Intezer
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻

博客园_首页

Plist 二进制格式 Milvus 和 PGVector,哪个更好? OpenClaw 已过时?在 VS Code 中运行 Hermes Agent! 第30篇文章:一个大三计科生的自白 Manim如何在数学公式中完美显示中文? Docker 部署 RocketMQ 5 并发编程核心概念辨析 C#事务处理最佳实践:别再让“主表存了、明细丢了”的破事发生 CLI 是什么?为什么大厂突然集体卷命令行? 【从0到1构建一个ClaudeAgent】协作-自主Agent UIImageView 设置图片不生效的原因排查 最小二乘问题详解20:无先验约束下的增量式SFM自由网平差 痞子衡嵌入式:大话双核i.MXRT1180之XIP应用里借助MU实现可靠Flash IAP的方法 AI Chat 封装, SemanticKerne.AiProvider.Unified 已发布 Windows下右键编辑js文件无法打开记事本——在注册表中使用环境变量 在后台服务中使用 Scoped 服务,为什么总是报错? H200 安装驱动并使用sglang启动模型 wireshark 抓包Trap上报告警内容 我用 AI 辅助开发了一系列小工具(2):图片压缩工具 [A Primer On MC and CC] 2.1 Memory Consistency 1 - 指令重排序和 SC 模型 Oracle数据库SCN推进技术详解与实践指南 玩转控件:封装个带图片的Label控件 Claude Code 4.7 真正该升级的不是模型,而是你的工作流 前端小白一句话,AI 帮我做了个颜值拉满的桌面媒体播放器。当代码不再是门槛,一句话编程就是现实。 5. WorkBuddy: 小龙虾的灵魂三件套,让你的小龙虾不只是工具 SQLite 分片方案实战:三种分片策略的深度对比 告别简陋 UI!一款基于 Fluent Design 和基于 WinUI 的开源免费、现代化的 Avalonia UI 控件库 关于二进制排列组合枚举的总结 AI开发-python-LangGraph框架(3-27-LangGraph从零实现大模型智能决策工作流) ElasticSearch主分片和副本分片概念详解 【002】HTTPS 粗解:证书、TLS 握手与对后端配置的影响 Hermes Agent 一周暴涨五万 Star,但我劝你别急着追 明明连接的是Redis的DB0,为什么能查到DB3的数据? 【从0到1构建一个ClaudeAgent】协作-Agent团队 熟悉电子元器件之后,电子小白下一步该怎么走? MAF快速入门(23)通过C#类定义Skills .NET 高级开发 | 手写一个对象映射框架 FastAPI数据库ORM怎么选?我肝了三个Demo后,终于不再纠结了 mysqldump 参数拾遗:在遗忘与铭记之间 C# .NET 周刊|2026年3月5期 Claude code入门 - 陈彦斌 一文学习入门 ThingsBoard 开源物联网平台 GitHub 热门项目 | 2026年04月16日 如何为GIT设置全局勾子,为每次提交追加信息 Number.isFinite和isFinite与isNaN()和Number.isNaN的区别 PortSwigger SQL注入LAB2 推荐一个测试人必备的Skills,从功能到性能全搞定(附详细实操和安装下载方式) 筑基期:掌握Odoo基础核心知识点02(Odoo XML 开发方式详解) GLM模型这么火,咱们用vllm也咧一个呗! 深入理解 AbortController:从底层原理到跨语言设计哲学 字符串学习笔记 多租户系统框架的基础模块设计和分析设计 Apache SeaTunnel Zeta 为什么能做到“又快又稳”? AI开发-python-LangGraph框架(3-26-LangGraph基本概念及第一个简单样例) Vue 3 组件通信,别只会用 Props 和 Emits 了,这几个狠活儿你得看看 ElasticSearch7.X版本配置密码 用Manim实现动态交点计算--从一个动点问题说起 团结引擎+Addressable+Instant Game打包抖音小游戏 function call 实战:让 LLM 自动判断 pod 异常、调用日志工具并完成故障分析 bubseek —— 让 Agent 的足迹,变成团队的洞察 通过 C# 读取并导出 PDF 书签 如何用 GitHub Actions 实现 Steam 自动化发布 【从0到1构建一个ClaudeAgent】并发-后台任务 .NET 高级开发 | 定制 ASP.NET Core 框架 电子小白:什么是运算放大器(运放) zero2Agent:面向大厂面试的 Agent 工程教程,从概念到生产的完整学习路线 堆上的ORW HC32F460 USB CDC通信异常:非对齐访问异常排查 20260413-Hyperbridge 攻击事件:发生在默克尔山上的验证绕过 那些喊着AI 要淘汰你的人,正在靠你的焦虑赚大钱! 深度学习进阶(八)Swin Transformer 最小二乘问题详解19:带先验约束的增量式SFM优化与实现 SnapTranslate 3.0 正式发布:全局划词翻译 + 完整英语学习闭环,一站式搞定查词、记词、复习 工作的意义、工作的困难认知再思考 .NET + AI 进阶实战:基于类的技能开发 - 打造可治理的 Agent 能力模块 【从0到1构建一个ClaudeAgent】规划与协调-技能 上周热点回顾(4.6-4.12) 电子小白的工具三件套:面包板、杜邦线、万能板 单表五亿数据的查询优化 | Mysql、StarRocks 2. WorkBuddy:从“我是谁”到“帮我干活” C# 如何减少代码运行时间:7 个实战技巧 基于HelixToolkit.SharpDX 渲染3D模型 - 笺上知微 从零开始的双臂具身VLA起源及现阶段发展综述 - SkyXZ 记对 xonsh shell 的使用, 脚本编写, 迁移及调优 - pluvium27 受够了Vibe Coding的失控?换个起点,让AI事半功倍 从开始配置漏洞环境到漏洞复现流程 - 難しい 关于10年工作经验的程序员对OpenClaw的实战经验分享以及看法 - 虚无境 Any metadata 的内存布局 C# .NET 周刊|2026年3月2期 - InCerry 我帮你测过了,测试圈排名第二的 Skill 依然很牛逼 Skill Discovery | 无监督技能发现的经典工作总结 - MoonOut 上下文工程是什么?过时了么?一文讲明白! - 一枫说码 开了 TUN 模式还是直连?90% 的人都踩过这个坑 AScript扩展多种脚本语言 - rockey627 AI 学习笔记:Agent 的记忆机制 你能被装进一个文件里吗?——7 万人把同事"蒸馏"成了 AI - 我没有三颗心脏 Claude Code 通关手册(七):给 AI 装上技能包——Skills 完全指南 - 暮色之狐 在浏览器中快速编辑代码:VSCode Web 集成实践 - Newbe36524 蒸馏自己 skill?基于 Deepseek 的蒸馏器,丐版蒸馏方式,简单便捷 - To_Carpe_Diem Spring AI Aliababa和AgentScope,哪个更好? - 苏三说技术
万字详解 RAG 向量索引算法和向量数据库
JavaGuide · 2026-04-20 · via 博客园_首页

⭐️AI 应用开发面试和 AI Coding 实战相关的内容目前正在持续更新中https://javaguide.cn/ai/

前段时间面某大厂的时候,面试官问我:“你们 RAG 系统的向量检索怎么做的?”,我说:“用 MySQL 存 Embedding,查询时遍历计算相似度。”

空气突然安静了五秒。我看到面试官的嘴角抽了一下,才意识到问题大了——当时我们知识库有 50 多万条 Chunk,每次查询都要全表扫描,平均响应时间 3 秒+,用户早就跑光了。

面试被挂后才懂:这叫“暴力搜索”,而生产级方案应该是向量数据库 + ANN 索引

段子归段子,向量数据库确实是当下 RAG 应用的基础设施,也是 AI 应用开发面试的高频考点。今天 Guide 分享几道向量数据库相关的面试题,希望对大家有帮助:

  1. ⭐️ RAG 场景为什么需要向量数据库?
  2. ⭐️ 什么是向量索引算法?
  3. 有哪些向量索引算法?
  4. ⭐️ 你的项目使用的什么向量索引算法?
  5. HNSW 索引和 IVFFLAT 索引的区别是什么?
  6. 有哪些向量数据库?
  7. ⭐️ 你为什么选择 PostgreSQL + pgvector?
  8. 为什么不选择 MySQL 搭配向量数据库呢?

⭐️ RAG 场景为什么需要向量数据库?

RAG(Retrieval-Augmented Generation)的核心是“语义检索”——把文档和用户问题都转成高维向量(Embedding),然后找最相似的 Top-K 片段作为 LLM 上下文。传统关系型数据库(MySQL、PostgreSQL 原生)或全文搜索引擎(ES 的 BM25)无法高效完成这件事,所以必须引入向量数据库(或带向量扩展的数据库)。

RAG 场景为什么需要向量数据库?

1. 高维向量相似度搜索

Embedding 通常是 768~3072 维的稠密向量,传统数据库只能用 =LIKE 做精确匹配,无法计算“余弦相似度 / 内积 / 欧氏距离”。

暴力搜索:如果强行用 SQL 遍历全表计算相似度,复杂度是 O(n)。以 100 万条 1024 维向量为例:

  • 单次查询计算:1,000,000 × 1,024 次乘法运算
  • 实际延迟:秒级(具体数值因硬件而异)

秒级延迟——对于需要实时响应的问答系统完全不可接受。

ANN 近似检索:向量数据库专为最近邻搜索(ANN, Approximate Nearest Neighbor)设计,通过图导航或空间划分大幅减少距离计算次数,将检索延迟降至毫秒级

指标 暴力搜索 ANN 索引检索
时间复杂度 O(n) 图索引 ≈ O(log n),聚类索引 ≈ O(nprobe × n/nlist)
100 万向量延迟 秒级 毫秒级
召回率 100% 95-99%
速度提升 基准 100-200 倍

注:上表延迟为数量级描述,实际性能因硬件规格、并发负载、索引参数(如 ef_searchnprobe)而异,建议参考 ann-benchmarks.com 在目标环境验证。

用不到 5% 的召回率损失,换来 100 倍以上的速度提升——这就是索引的价值。

2. 大规模数据承载能力

RAG 知识库动辄几十万 ~ 亿级 Chunk,向量数据库支持亿级向量持久化 + 增量更新 + 分片,而传统 DB 存向量后基本无法扩展。

3. 语义检索 vs 关键词检索的本质区别

检索方式 原理 局限性
BM25 关键词 字面匹配,基于词频统计 遇到同义词/改写就失效(“退货” vs “退款流程”)
向量语义搜索 Embedding 捕获语义相似性 理解同义词、上下文、隐含意图

文档的 Chunking 策略(切分规则与重叠度)与 Embedding 模型共同决定了语义召回的理论上限,而向量数据库负责在可接受的延迟内把这个上限兑现出来。

生产级必备能力

  • 支持元数据过滤(如 WHERE category='Java' AND version>='v2')+ 向量相似度联合查询
  • 混合检索(Hybrid Search):向量 + BM25 + RRF 融合(生产环境常用方案之一)
  • 动态更新:支持增量写入。但需注意:HNSW 在高频删除/更新场景下,被删除的向量以“标记删除”方式残留,积累的 dead nodes 会导致召回率随时间下滑,需定期通过 REINDEX 或 vacuuming 机制清理,并监控实际召回率
  • 权限/多租户隔离:企业级 RAG 必备

⭐️ 什么是向量索引算法?

向量索引算法是向量数据库的核心,它的核心任务是解决一个数学难题:如何在海量的高维向量中,极速地找到和给定查询向量最相似的那几个。

它的本质,是一种空间划分和数据组织的艺术。如果没有索引,我们要找一个相似向量,就必须把数据库里所有的向量都比较一遍,这叫暴力搜索。在百万、亿级的数据量下,这种方法的延迟是灾难性的。

向量索引的目标,就是通过预先组织好数据,让我们在查询时能够智能地跳过绝大部分不相关的向量,只在一个很小的候选集里进行精确比较。

用生活化的比喻来说:

  • 没有索引 = 在整个城市挨家挨户找一个人
  • 有索引 = 先确定在哪个区 → 哪条街 → 哪栋楼 → 快速定位

在实践中,向量索引算法主要分为两大类:

向量索引算法分类

当我们谈论向量索引时,绝大多数时候谈论的都是 ANN 算法

选择并调优一个合适的 ANN 索引,是决定 RAG 或向量搜索系统最终性能和成本的关键,带来的性能提升可以达到百倍甚至千倍以上。

1. 精确最近邻(Exact Nearest Neighbor,ENN)算法

  • 目标: 保证 100% 找到最相似的那个向量。
  • 代表: 像 KD-Tree、VP-Tree 这类传统的空间树结构。
  • 问题: 它们在低维空间(比如 10 维以内)效果很好,但在 AI 领域动辄几百上千维的高维空间中,它们的性能会急剧下降,遭遇维度灾难,最终退化成和暴力搜索差不多的效率。

2. 近似最近邻(Approximate Nearest Neighbor,ANN)算法

  • 目标: 这是现代向量检索的核心。它做出了一个非常聪明的工程权衡放弃 100% 的准确性,换取查询速度几个数量级的提升。它不保证一定能找到那个最相似的,但能保证以极大概率(比如 99%)找到的向量,也已经足够相似了。
  • 代表: 这类算法是现在的主流,主要有三大流派:
    • 基于图的(Graph-based):HNSW。它把向量组织成一个复杂的多层网络图,查询时像导航一样在图上行走,速度极快,召回率非常高,是目前综合表现最好的算法之一。
    • 基于量化的(Quantization-based):IVF_PQ。它通过聚类和压缩技术,把海量向量压缩成很小的数据,极大地降低了内存占用,非常适合超大规模的场景。
    • 基于哈希的(Hashing-based):LSH。它通过特殊的哈希函数,让相似的向量有很大概率落入同一个哈希桶,从而缩小搜索范围。

有哪些向量索引算法?

在向量数据库与 RAG(检索增强生成)应用中,索引算法直接决定了系统的召回率、响应延迟和资源消耗。

这里需要区分两个层级概念:

层级 示例 说明
向量数据库 Milvus、Qdrant、pgvector 负责向量存储、检索和管理的完整系统
其支持的索引算法 HNSW、IVF-PQ、IVFFLAT、Flat 决定检索性能与召回率的内部实现

主流索引算法一览

算法名称 原理机制 核心优势 主要劣势 适用数据规模
Flat(暴力搜索) 遍历所有向量计算距离 100% 准确无损 O(n) 复杂度,查询极慢 < 10 万
HNSW(图索引) 分层导航的小世界图 查询极快,召回率极高 内存消耗巨大,构建耗时 10 万 - 1000 万
IVFFLAT(倒排聚类) 聚类 + 倒排索引桶 内存效率高,构建快 需前置训练,召回率略低 1000 万 - 1 亿
IVF-PQ(乘积量化) 聚类 + 向量极致压缩 支持海量数据,开销极低 精度损失较大 > 1 亿
IVF_RABITQ 聚类 + 随机旋转比特量化 内存占用极低,召回率优于 PQ 较新算法,生态支持有限 > 1 亿

关于 IVF_RABITQ:这是 2024 年提出的新一代量化算法,核心创新是 Random Rotation(随机旋转)+ Bit Quantization(比特量化)。相比传统 PQ 将向量切成子向量再分别聚类,RABITQ 先对向量做随机旋转使各维度分布更均匀,再将每个维度量化为 1 bit(仅保留符号位)。这种设计在保持高召回率的同时,将内存占用压缩到原始向量的 1/32,且距离计算可高效使用位运算加速。在 Milvus 2.5+ 中已作为 IVF_RABITQ 索引类型提供。

⭐️ 你的项目使用的什么向量索引算法?

这里以 《SpringAI 智能面试平台+RAG 知识库》项目为例。

在我们的项目中,使用的是 PostgreSQL 的 pgvector 扩展,并配置了 HNSW 索引

为什么选择 HNSW? 因为在百万级数据规模下,HNSW 在检索速度、召回率和内存占用之间取得了最佳平衡。

我们可以把 HNSW 理解成一个多层高速公路网络

HNSW 索引架构

核心机制:

  1. 层次化构建: 节点的最高层级由公式 level = floor(-ln(random()) * mL) 决定,其中 mL 是层级乘数。这使得越高的层级节点数指数级递减,形成“金字塔”结构。
  2. 贪心搜索:检索从顶层开始,每层都贪心地移动至距离查询点最近的邻居节点。
  3. 由粗到精:上层用于快速定位语义区域,下层用于执行精确查找。

这种“由粗到精”的查找方式,能够极快地定位到最近邻向量,而不需要像暴力搜索那样比较每一个点。

HNSW 的本质是近似最近邻(ANN)算法,意味着它为了追求极致速度,无法保证 100% 的召回率。但在实践中,通过调整参数,召回率可以达到 99% 以上,对于 RAG 应用完全足够。

调优参数:

  • m:每个节点的最大连接数。m 值越大,图越密集,召回率越高,但会增加构建时间和内存消耗。
  • ef_construction:索引构建时的搜索范围。该值越大,索引质量越高,但构建越慢。
  • ef_search:查询时的搜索范围。这是最重要的运行时参数,直接影响查询速度和召回率的平衡

扩展性考虑:

HNSW 是非常耗内存的索引。如果未来数据规模增长到千万甚至亿级,或者对写入吞吐量有更高要求,HNSW 的内存占用和构建成本可能成为瓶颈。

届时可以考虑切换到 IVFFLAT 索引。IVFFLAT 基于倒排索引思想,通过将向量空间聚类成多个桶来缩小搜索范围。或者引入 Milvus 等专业向量数据库,它们在分布式、大规模场景下提供更专业的解决方案。

过滤行为注意:

pgvector 0.5+ 的 HNSW 索引在执行元数据过滤时,采用混合过滤策略:过滤条件在索引扫描期间并行评估,而非纯后过滤。但若过滤条件较严格,仍可能导致最终结果远少于 Top-K 预期。

例如,查询“返回 10 条相似文档中 category='Java' 的记录”,若候选集中只有 3 条满足条件,则仅返回 3 条。解决方案包括:

  1. 增大候选集:设置更大的 ef_searchLIMIT,让更多候选进入过滤阶段
  2. 预过滤(Pre-filtering):先按元数据过滤再执行向量搜索,但可能导致索引失效退化为暴力搜索
  3. 部分索引(Partial Index):PostgreSQL 支持带条件的 HNSW 索引,如 CREATE INDEX ... WHERE category = 'Java',但需为每个常见过滤条件创建独立索引

HNSW 索引和 IVFFLAT 索引的区别是什么?

这两者的核心区别在于:一个是利用“图”的连通性寻找邻居,一个是利用“聚类”缩小搜索范围。

HNSW(图索引)

  • 原理:构建多层图结构,查询像在“高速公路”上行驶,先大跨度跳跃,再局部精细搜索
  • 优点:检索速度极快,召回率非常稳定且高
  • 缺点:”内存消耗大”,除了原始向量,还要存储大量节点间的连接关系;索引构建非常慢

IVFFLAT(倒排聚类)

  • 原理:利用 K-Means 将向量空间切分成多个桶,查询时先找最近的几个桶,只在桶内进行暴力搜索
  • 优点:内存友好,结构简单,索引构建速度比 HNSW 快 4-32 倍(取决于 nlist 参数和硬件)
  • 缺点:检索速度略慢于 HNSW(在高精度要求下);如果数据分布改变,需要重新训练聚类中心
特性 HNSW(图索引) IVFFLAT(倒排聚类)
底层原理 层次化小世界图结构 聚类 + 倒排桶结构
查询速度 极快 中等
内存消耗 极高(原始向量 + 图连接指针) 中等(原始向量 + 质心),低于 HNSW
构建速度 慢(需逐个节点插入) 快 4-32 倍(依赖 K-Means 训练)
数据动态性 增量添加方便,但删除需定期 REINDEX 建议全量训练,否则精度下降
适用规模 10 万 - 1000 万 1000 万 - 1 亿

如何选择?

  • 选 HNSW:数据在百万级,追求毫秒级极速响应,且服务器内存充足
  • 选 IVFFLAT:数据达到千万甚至亿级,或内存资源受限,能接受稍长的查询延迟

有哪些向量数据库?

对于向量数据库的选型,适合项目的才是最好的,没有银弹!

第一类:传统数据库扩展

  • 代表: PostgreSQL + pgvector 插件(最成熟的选择,生产环境验证充分)、MongoDB Atlas Vector Search(NoSQL 领域的向量扩展)
  • 核心优势:
    • 统一技术栈: 无需引入新的数据库系统,降低运维复杂度
    • 事务一致性: 向量数据和业务数据可以在同一事务中管理,保证 ACID 特性
    • 学习成本低: 团队已有的 SQL 知识可以复用
    • 混合查询便利: 可以轻松结合 SQL 过滤条件进行向量搜索
  • 适用场景: 项目初期或中小型项目中的首选。特别是在业务数据(如文档元数据)和向量数据需要强一致性、能在同一个事务里管理时,它的优势巨大。它极大地降低了技术栈的复杂度和运维成本,对于已经在使用 PG 的团队来说,学习曲线几乎为零。

第二类:搜索引擎演进

  • 代表: Elasticsearch、OpenSearch(AWS 维护的 ES 分支,向量功能持续增强)。
  • 核心优势:
    • 混合搜索(Hybrid Search)能力强大: 可无缝结合 BM25 关键词搜索和向量语义搜索
    • 全文检索能力: 处理长文本、支持高亮、分词等传统搜索特性
    • 成熟的分布式架构: 横向扩展能力强
    • 丰富的聚合分析: 支持 facet、aggregation 等分析功能
  • 适用场景: 需要同时支持关键词和语义搜索;电商搜索、文档检索等复合查询场景;已有 ES 技术栈的团队;需要复杂过滤和聚合的场景。

第三类:原生专业向量数据库

  • 代表: Milvus(功能最全面、社区最庞大)、Weaviate(内置 AI 模块,支持 GraphQL 查询,易用性好)、Qdrant(Rust 编写,内存效率高,支持丰富的过滤器)。
  • 核心优势:
    • 专为向量优化: 支持多种索引算法(HNSW、IVF、LSH 等)
    • 规模化能力: 可处理十亿级向量
    • 性能极致: 专门的内存管理和索引优化
    • 功能丰富: 支持多种距离度量、动态更新、增量索引等
  • 适用场景: 当我们的向量数据规模达到亿级甚至更高,或者对 QPS 和延迟有非常苛刻的要求时,这些专业的向量数据库通常会提供比 pgvector 更好的性能和更丰富的功能(如更高级的索引算法、数据分区、多租户等)。当然,选择这条路也意味着我们需要投入更多的运维和学习成本

第四类:云托管的向量数据库服务

  • 代表: Pinecone(市场的开创者和领导者)、Zilliz Cloud(Milvus 的商业版)、Weaviate Cloud 等。
  • 核心优势:
    • 低运维: 全托管服务,自动扩缩容(仍需配置索引参数和监控召回率)
    • 高可用保证: SLA 通常 99.9%+
    • 快速上线: 几分钟即可开始使用
    • 弹性计费: 按实际使用量付费
  • 适用场景: 对于追求快速上线、希望降低运维负担、并且预算充足的团队,这是一个非常有吸引力的选择。它让我们能把所有精力都聚焦在 AI 应用本身的业务逻辑上,而无需关心底层数据库的运维细节。

⭐️ 你为什么选择 PostgreSQL + pgvector?

这里以 《SpringAI 智能面试平台+RAG 知识库》项目为例。本项目需要同时存储结构化数据(简历、面试记录)和向量数据(文档 Embedding)。

方案对比

方案 优点 缺点 适用规模
PostgreSQL + pgvector 一套数据库搞定,运维简单 百万级以上性能下降明显 < 100 万向量
PostgreSQL + Milvus 向量检索性能更好 多一个组件,运维复杂度增加 100 万 - 10 亿
Pinecone / Zilliz Cloud 全托管,低运维 成本高,数据在第三方 任意规模

选择 pgvector 的理由

  • 架构简单:不引入额外组件,降低部署和运维复杂度。
  • 性能够用:HNSW 索引支持毫秒级检索,百万级以下文档场景完全够用。
  • 事务一致性:向量数据和业务数据在同一数据库,天然支持事务。
  • SQL 查询:可以结合 WHERE 条件过滤(注意:过滤条件可能导致向量索引失效,需检查执行计划)。
-- pgvector 余弦相似度搜索示例
-- <=> 是余弦距离运算符(0 = 完全相同,2 = 完全相反)
-- 余弦相似度 = 1 - 余弦距离
SELECT content, 1 - (embedding <=> $1) as cosine_similarity
FROM vector_store
WHERE metadata->>'category' = 'Java'
ORDER BY embedding <=> $1  -- 按距离升序,越小越相似
LIMIT 5;

-- ⚠️ 关键前提:查询时使用的距离运算符必须与创建 HNSW 索引时指定的
-- operator class(例如 vector_cosine_ops)严格保持一致,否则查询将
-- 无法命中索引,直接退化为全表扫描。
-- 验证方式:EXPLAIN ANALYZE 检查执行计划是否包含 Index Scan。

为什么不选择 MySQL 搭配向量数据库呢?

PostgreSQL 最大的优势,也是它在 AI 时代甩开对手的“王牌”,就是其强大的可扩展性。开发者可以在不修改内核的情况下,为数据库安装各种功能插件:

  • AI 向量检索pgvector 扩展(官方推荐,性能在百万级场景下接近专业向量库)
  • 全文搜索:内置 tsvector(基础需求),或 pg_bm25 扩展(高级需求)
  • 时序数据TimescaleDB 扩展
  • 地理信息PostGIS 扩展(行业标准)

这种“一站式”解决能力意味着许多项目不再需要依赖 Elasticsearch、Milvus 等外部中间件,仅凭一个 PostgreSQL 即可满足多样化需求,从而简化技术栈。

注意:MySQL 8.x 系列(包括 8.4 LTS)无官方向量支持。MySQL 9.0(2024 年 7 月发布)才正式引入 VECTOR 数据类型及 STRING_TO_VECTORVECTOR_TO_STRING 等向量函数,但目前尚不支持向量索引(ANN),仅能做暴力计算。生态成熟度和生产验证案例远少于 pgvector。如果项目已深度绑定 MySQL 生态,可考虑 MySQL 9.0+ 基础方案(小规模)或 MySQL + 外部向量库的组合。

VECTOR 列不能用作任何类型的键,包括主键、外键、唯一键和分区键

关于 MySQL 和 PostgreSQL 的详细对比,可以参考我写的这篇文章:MySQL vs PostgreSQL,如何选择?

⭐️ 更多 RAG 高频面试题

上面的内容摘自我的星球实战项目教程: 《SpringAI 智能面试平台+RAG 知识库》。内容安排如下(已经更完,一共 13w+ 字)

配套教程内容概览

Spring AI 和 RAG 面试题两篇加起来就接近 60 道题目,主打一个全面!

RAG 面试题

项目地址 (欢迎 Star 鼓励):

完整代码完全免费开源,没有 Pro 版本或者付费版!

总结

向量数据库是 RAG 系统的核心基础设施,选择合适的向量索引算法和数据库方案,直接决定了系统的性能和成本。通过本文,我们系统梳理了向量数据库的核心知识:

核心要点回顾

  1. 为什么需要向量数据库:传统数据库无法高效处理高维向量相似度搜索,ANN 索引可将检索延迟从秒级降到毫秒级
  2. 主流索引算法
    • Flat:暴力搜索,100% 准确但慢
    • HNSW:图索引,查询极快,内存消耗大
    • IVFFLAT:倒排聚类,内存友好,构建快
    • IVF-PQ:乘积量化,支持海量数据,有精度损失
  3. HNSW vs IVFFLAT:HNSW 查询更快但内存大,IVFFLAT 内存友好适合大规模数据
  4. 数据库选型:PostgreSQL + pgvector 适合中小规模,Milvus/Pinecone 适合大规模场景

面试高频问题

  • RAG 场景为什么需要向量数据库?
  • 有哪些向量索引算法?各自的优缺点?
  • HNSW 和 IVFFLAT 的区别?
  • 为什么选择 PostgreSQL + pgvector?

学习建议

  1. 理解原理:HNSW 的图结构、IVF 的聚类原理,理解了才能做出正确选型
  2. 动手实践:用 pgvector 或 Milvus 搭建一个向量检索 Demo,感受不同索引的性能差异
  3. 关注调优:索引参数(ef_search、nprobe)对召回率和延迟的权衡,需要根据业务场景调优

向量数据库选型和索引调优,直接决定 RAG 系统能不能在生产环境站稳脚跟——选错了就是”检索慢、召回差、成本炸”三连。

AI Agent 知识体系