15.向量数据库和普通数据库的选型

10 阅读9分钟

【核心主旨】:系统性梳理向量数据库的本质定义、高维近邻索引核心算法(HNSW 与 IVFFlat)、元数据混合检索机制,对比传统数据库扩展(PostgreSQL + pgvector)与原生专用向量库的选型边界,并沉淀 LangGraph 状态检查点(Checkpoint)与 PostgreSQL 多合一落地实践。


一、 向量数据库的本质定义:能存向量就是向量数据库吗?

  • 一句话结论:普通数据库存向量相当于“仓库里堆了一箱写满数字的纸条”,而向量数据库相当于“给整个高维几何空间装上了毫秒级 GPS 导航仪”。

1. 为什么需要向量数据库?(传统方案的致命痛点)

  • 存储不是壁垒,检索才是瓶颈:任何关系型数据库或键值库都可以把一串浮点数组 [0.12, -0.45, ...] 当作普通的 TEXT、JSON 或 BLOB 字段持久化。
  • 维度灾难与暴力遍历(Brute-Force)的算力崩溃:
    • 在 1536 维甚至更高的嵌入向量空间中,计算两个向量的几何相似度(如余弦相似度或欧式距离)涉及成千上万次浮点乘加运算。
    • 若仅能存储而没有专用索引,查询相似内容时只能执行全表扫描(O(N) 复杂度)。当数据量达到数十万到数千万级别时,单次查询耗时将从数秒恶化至数分钟,直接导致在线业务不可用。

2. 底层运行机制:从几何距离到近邻搜索(ANN)

  • 向量检索的本质是在高维连续空间中求解 近似最近邻(ANN, Approximate Nearest Neighbor),以微小的精度损失(例如 98% 召回率)换取数量级的检索速度提升。
  • 流转链路: 用户提问 ➡️ Embedding 模型编码为向量 ➡️ 向量索引引擎(毫秒级空间近邻定位) ➡️ 召回 Top-K 向量 ID ➡️ 提取切片内容与元数据

3. 核心魔力与收益

  • 检索复杂度从全表遍历的 O(N) 直降为近对数级的 O(log N)。
  • 支撑大模型 RAG(检索增强生成)场景下的端到端低延迟响应(通常在 10ms ~ 50ms 之间)。

二、 核心索引算法原理解析:HNSW 与 IVFFlat

  • 一句话结论:IVFFlat 像“划分片区按邮编分桶查找”,建索引快但可能漏查边缘;HNSW 像“立交桥与高速路网多层导航”,检索极快极准但吃内存。

1. IVFFlat(倒排文件平铺索引)

  • 原理:基于 K-Means 聚类算法,将高维空间划分为若干个“聚类中心(Centroids)”。向量插入时归入距离最近的聚类桶中。
  • 检索流程: 输入查询向量 ➡️ 计算与各聚类中心的距离 ➡️ 锁定最近的 nprobe 个桶 ➡️ 仅在这几个桶内做局部遍历计算 ➡️ 输出 Top-K
  • 优缺点与适用场景:
    • 优点:构建速度极快,内存占用非常低(直接保存原始浮点数)。
    • 缺点:如果目标向量恰好落在聚类桶的交界边缘处,容易漏召回,准确率相对妥协。

2. HNSW(分层可导航小世界图索引)

  • 原理:借鉴计算机跳表(Skip-List)的多层分层思想,在高维空间构建多层图结构。
    • 顶层(高速公路):节点稀疏,长边连接,用于在大空间内快速跳跃粗定位。
    • 底层(地面毛细血管):节点密集,连接紧密,用于在局部区域做精准的细粒度寻路。
  • 检索流程: 从顶层入口点进入 ➡️ 沿长边快速逼近目标区域 ➡️ 逐层下降进入更密集的子图 ➡️ 底层细粒度贪心搜索 ➡️ 收敛命中最近邻
  • 优缺点与适用场景:
    • 优点:当前工业界召回率与查询延迟综合表现最好的算法,毫秒级响应。
    • 缺点:构图耗时较长,且图索引必须全量常驻内存,内存开销巨大。

三、 向量数据库的存储全貌:元数据(Metadata)与混合检索

  • 一句话结论:向量数据库绝非只存一串向量,它是“高维几何坐标 + 原始切片内容 + 结构化属性标签”的三位一体系统。

1. 真实 RAG 场景下单条记录的数据结构

一条标准的数据切片通常包含三个核心部分:

  • 向量数据(Embedding):固定维度的浮点数组,用于相似度几何计算。
  • 原始文本(Document Chunk):检索命中后提取并组装进 Prompt 的实际文字内容。
  • 结构化元数据(Metadata):关联的业务属性,如 user_id(多租户权限)、category(业务分类)、created_at(时效过滤)、doc_id 等。

2. 标量过滤 + 向量检索的三种技术路径

  • Post-filtering(后过滤):
    • 先通过向量检索召回 Top 100,再根据元数据过滤出符合条件的记录。
    • 缺陷:若业务限制条件严苛(如筛选某特定冷门分类),Top 100 过滤后可能所剩无几,导致召回不足。
  • Pre-filtering(前过滤):
    • 先根据元数据过滤出目标文档集合,再在子集中做向量检索。
    • 缺陷:如果子集打乱了预先构建的向量全局图结构(如 HNSW 图被截断),检索效率会急剧退化。
  • Single-stage / Native Filtered ANN(原生联合索引过滤):
    • 在图遍历或聚类探测的过程中,边寻路边实时校验元数据条件。现代成熟向量库与扩展库(如 Qdrant、pgvector 0.7+)均采用此机制。

四、 传统数据库扩展 vs 原生专用向量数据库选型

  • 一句话结论:千万级以内,传统数据库装插件是一骑绝尘的性价比之王;上亿级海量并发,原生专用向量库才是存算分离的终极归宿。

1. 架构选型对比矩阵

评估维度传统数据库扩展(PostgreSQL + pgvector / ES)原生专用向量数据库(Milvus / Qdrant / Pinecone)
底层架构单机/主从经典架构,与关系引擎共用内核云原生、计算与存储完全解耦、分布式多分片集群
事务支持完整的 ACID 强事务支持,行级锁完备多数为弱事务或最终一致性,偏向批量插入与覆盖
性能拐点千万级以内表现极佳,过亿数据内存争抢严重大几千万 ~ 数十亿级 依然具备水平伸缩能力
硬件加速依赖 CPU 通用指令集(AVX-512 等)优化支持 GPU 算力加速构建与量化计算(如 Milvus Knowhere)
运维成本极低:复用既有 RDS/PG 基础设施,无新增组件较高:需独立运维一套分布式存储与协调组件(Etcd/MinIO)
数据一致性业务字段修改与向量更新可在同一个事务内原子提交双写架构,业务库与向量库之间需自行保证最终一致性

2. PostgreSQL + pgvector 实操精要

-- 1. 启用 pgvector 插件
CREATE EXTENSION IF NOT EXISTS vector;

-- 2. 建表:将传统业务字段、原始文本与向量字段融为一体
CREATE TABLE knowledge_chunks (
    id BIGSERIAL PRIMARY KEY,
    tenant_id VARCHAR(64) NOT NULL,      -- 多租户隔离字段
    category VARCHAR(32) NOT NULL,       -- 业务分类
    content TEXT NOT NULL,               -- 知识库原文切片
    created_at TIMESTAMP DEFAULT NOW(),  -- 时间戳
    embedding vector(1536)               -- 1536维文本嵌入向量
);

-- 3. 构建 HNSW 高性能向量索引(采用余弦距离)
CREATE INDEX ON knowledge_chunks USING hnsw (embedding vector_cosine_ops);

-- 4. 原地执行“标量过滤 + 向量相似度”混合检索
SELECT id, content, created_at, (1 - (embedding <=> '[0.012, -0.045, ...]')) AS similarity
FROM knowledge_chunks
WHERE tenant_id = 'company_a' AND category = '财务制度'
ORDER BY embedding <=> '[0.012, -0.045, ...]'
LIMIT 5;

【代码解析】:通过 <=> 操作符直接在 SQL 层执行余弦距离排序,结合 WHERE 约束在单次查询中完成关系过滤与向量召回,彻底杜绝多系统间的数据同步延迟。


五、 LangGraph 状态检查点(Checkpoint)与存储架构

  • 一句话结论:PostgreSQL 在大模型系统里不仅是优秀的向量库,更是最稳健的 Agent 状态记忆中心。

1. LangGraph Checkpoint 的核心职责

  • 会话长久记忆:保存对话历史与图状态,支持跨请求的多轮会话还原。
  • 人机协同(HITL)断点恢复:当遇到人工审批(interrupt())时,状态被原子化落盘冻结;前端审批完成后通过会话 ID 重新唤醒线程继续执行。
  • 容灾重试与时间旅行(Time Travel):节点执行失败时可从最近检查点回放重试,支持回滚到历史任一步骤。

2. Checkpointer 选型矩阵

Checkpointer 实现存储介质适用场景与工程定位
MemorySaver内存字典本地单元测试、轻量开发演示;进程重启数据完全丢失
SqliteSaver本地 SQLite 文件单机桌面应用、轻量级嵌入式 Agent 服务
PostgresSaverPostgreSQL 数据库生产环境主流标准:支持多 Worker 协同、强事务隔离与断点持久化
RedisSaver / 社区扩展Redis 内存库对读写吞吐极高、状态生命周期相对较短的会话场景

六、 全局大串联与工程选型心法

1. 架构精简全链路图

[用户请求] 
    ⬇️
[FastAPI 接入层]
    ⬇️
[LangGraph 编排引擎] ⬅️持久化状态读写➡️ [PostgreSQL (PostgresSaver)]
    ⬇️
[RAG 知识检索] ⬅️标量+向量混合查询➡️ [PostgreSQL (pgvector HNSW 索引)]
    ⬇️
[LLM 生成输出]

2. 【核心细节与避坑指南】

  • 细节 1(pgvector 内存分配配置): 在 PostgreSQL 中使用 HNSW 索引时,务必调大 maintenance_work_mem。创建 HNSW 索引极度依赖工作内存,默认的 64MB 配置可能导致建索引速度缓慢或回退到磁盘临时文件。
  • 细节 2(避免过早引入专用向量数据库): 绝大多数企业知识库在切分后的切片总量都在几十万到数百万条以内。在没有达到大几千万向量规模、没有极致硬件加速诉求之前,盲目引入专用分布式向量库只会徒增部署与维护复杂度。
  • 细节 3(六边形战士原则): 单实例 PostgreSQL 配合 pgvector 插件与 PostgresSaver,能够同时承载“业务关系数据、RAG 向量与原文、Agent 状态检查点”三大核心职责,是中早期 AI 系统架构极度推崇的精简方案。

3. 【终极一句话速记】

“能存数组不等于向量库,近邻索引才定乾坤;千万以内单机 PG 挑大梁,海量并发再上专用分布式。”