27 深入专题:向量检索与 AI 应用
pgvector、HNSW/IVFFlat 索引、量化与检索增强场景的落地。
1 亿条向量建索引需要多久,VectorChord 在 16 核机器上表现如何?
VectorChord 新版在 16 核机器上对 1 亿条向量建索引,借助 IVF+RaBitQ 量化和并行构建,能在很短时间内完成(相比 pgvector HNSW 全内存构建快得多、内存也省得多)。量化让单条向量占用的内存和磁盘降到极小,构建时 CPU 主要花在聚类和量化上,配合并行框架可线性加速,这是其宣称比 pgvector 快 100 倍的底气之一。
AI 搜索为什么不等于向量搜索?
向量搜索只是 AI 检索的一环,完整的 AI 搜索通常需要稠密向量(语义召回)、稀疏向量/BM25(关键词召回)、向量量化(省内存加速)和重排序(rerank)等多个技术协同。单靠稠密向量难以覆盖精确词匹配、冷门实体和长尾查询。所以『AI 搜索』是一个组合工程,稀疏+稠密+量化+rerank 缺一不可,这也是 pgvector、VectorChord-bm25 等要同时支持多种向量与全文能力的原因。
BM25 全文检索里 Block-WeakAnd 算法是什么?
Block-WeakAnd(又称 WAND 变体)是一种 top-k 检索剪枝算法:它把倒排索引按 block 组织,通过维护候选文档的分数上界,优先扫描可能进入 top-k 的文档,提前跳过分数注定不够的块,从而在不牺牲太多精度下大幅减少文档评分计算量。VectorChord-bm25 在 Postgres 里实现原生 BM25 排名时就采用 Block-WeakAnd 来加速,避免对全部命中文档逐一算分。
DiskANN 是什么,和 HNSW 有什么区别?
DiskANN 是微软提出的磁盘友好型图索引(论文 Fast Accurate Billion-scale),核心思想是把图分层:上层热数据常驻内存、下层数据放 SSD,查询时按需加载,从而用很小内存支撑十亿级向量。与传统 HNSW 全内存驻留不同,DiskANN 通过『内存+SSD』混合降低内存成本。TimescaleDB 和 pgvectorscale 的 StreamingDiskANN 都基于这套思路,把 DiskANN 移植进 PostgreSQL 作为扩展。
DuckDB 如何通过 Lance 扩展把 AI 向量检索变成一等公民?
DuckDB 的 Lance 扩展让 SQL 工作流从分析表延伸到检索表:INSTALL lance; LOAD lance 后可读写 Lance 表,提供 lance_vector_search、lance_fts、lance_hybrid_search 三类检索函数。向量、全文、图片字节和标量元数据可在同一套 SQL 里协同,混合搜索里向量距离、全文分数和 _hybrid_score 可同表排序。这标志着向量检索正式成为 DuckDB 内的一等公民能力。
RaBitQ 向量量化算法的原理是什么?
RaBitQ 是一种面向相似度检索的量化算法,核心是『随机二值化 + 误差补偿』:先把向量投影到随机正交基上做二值量化,再用残差修正量化误差,从而在极小 bit 下保持高召回。相比传统 PQ(乘积量化)更省内存、构建更快,配合 IVF 索引可显著压缩向量规模。VectorChord 的 IVF+RaBitQ 方案正是靠它把内存和索引体积压到 pgvector 的几十分之一,从而做到比 pgvector 快上百倍。
SQL:2028 为什么可能定义 vector 标准?
随着向量检索在各数据库普及,SQL 标准组织考虑在 SQL:2028 中加入 vector 类型与相似度查询的标准化定义,以避免各数据库(Postgres pgvector、DuckDB、MySQL 等)各自为政、语法不兼容。标准化的 vector 类型和近邻查询语法,能让应用在不同数据库间移植向量检索代码更平滑,也让向量成为数据库的一等公民类型。
VectorChord 为什么比 pgvector 快 100 倍?
VectorChord 用『IVF + RaBitQ 量化』组合,把高维 float32 向量量化成极小的 bit 表示,内存和磁盘占用只有 pgvector HNSW 的几十分之一,同样的内存能装更多数据、减少换页和 IO。同时它内置 Graph(DiskANN 和 HNSW)索引、SIMD 加速和高效的召回重排序管线。官方称在相同召回率下,VectorChord 的查询速度比 pgvector 快约 100 倍,1 亿条向量建索引在 16 核机器上也能在很短时间内完成。
pg_bestmatch + pgvector 如何打造适合自己语料的文本检索?
pg_bestmatch 结合 pgvector 和 TF-IDF 思路,为特定语料定制文本相似检索:先用 PostgreSQL 的 ts 全文检索和 madlib 等工具对本地海量文本计算专属的 TF(词频)/IDF(逆文档频率)权重,得到符合该领域语料特点的关键词权重,再结合向量相似度做召回排序。相比通用 embedding,这种『本地语料定制』能更贴合特定领域的检索需求。
pg_turbovec / TurboQuant 为什么能省 20 倍内存?
pg_turbovec 采用 TurboQuant 量化技术,把高维向量的存储压缩到极低 bit(如 4bit/8bit),配合高效的 SIMD 检索,在几乎不损失召回的前提下把向量内存占用降到传统 float32 的约 1/20。这对内存敏感的大规模向量检索场景非常有吸引力,用同样的内存可以承载 20 倍的数据量,是 PG 向量检索内存优化的代表方案之一。
pg_vectorize 插件如何把 pgvector 和 AI 结合?
pg_vectorize 是一个把 pgvector、OpenAI(及本地模型)集成进 Postgres 的插件,让用户能直接在 SQL 里完成 embedding 生成、向量存储和相似检索,把『数据库+AI』的流程收敛到数据库内。它抽象了 embedding 模型调用和向量索引管理,降低在 PG 上搭建 RAG/语义搜索应用的门槛,是 DB&AI 融合的典型实践。
pgvecto.rs 是什么,和其他向量插件比有什么特点?
pgvecto.rs 是一个用 Rust 编写的 PostgreSQL 向量索引扩展,支持 IVFFlat 和 HNSW 等索引,强调用 Rust 实现以获得内存安全和较高性能,并支持向量+标量混合过滤。它和 pgvector、VectorChord 一样是 PG 生态里的向量检索选项,主要卖点是 Rust 实现带来的安全性,以及较完整的混合检索与过滤能力。
pgvector HNSW 索引在高频更新场景有什么坑?
HNSW 的删除是惰性的——被删除的节点不会立刻从图中移除,而是被标记,导致图结构逐渐退化、检索质量下降。频繁 UPDATE/DELETE 会让 HNSW 图里残留大量死节点,召回率和性能随时间变差。缓解办法是定期对表做 vacuum 清理、必要时重建索引(REINDEX),或者对频繁更新的向量数据避免用 HNSW 而改用其他方案。
pgvector 插件支持哪几种向量数据类型,各自有什么用途?
pgvector 提供 vector、halfvec、sparsevec、bit 四种类型。vector 是默认的 float32 稠密向量;halfvec 用 float16 存储,内存占用只有 vector 的一半,适合大维度、内存敏感场景;sparsevec 是稀疏向量,只存非零维的坐标和值,适合稀疏 embedding;bit 是二值向量,配合 Hamming 距离做二值化检索,存储极小。选择类型本质是在召回精度与内存/存储之间做权衡。
pgvector 支持哪几种相似度距离操作符,如何选?
pgvector 用操作符表达距离:<-> 是欧氏距离 L2(越小越相似)、<#> 是负内积(值越大越相似)、<=> 是余弦距离(越小越相似),bit 类型用 <~> 计算 Hamming 距离。内积适合词向量这类方向敏感的场景,余弦适合文本 embedding 且对模长不敏感,L2 适合坐标类数据。内积操作符返回负值是因为索引内部按从小到大排序,取负号让『越大越相似』转成『越小越靠前』。
pgvector 的 HNSW 索引原理和关键参数是什么?
HNSW(Hierarchical Navigable Small World)是多层跳表式图索引,每层是邻近图,上层稀疏下层稠密,查询从顶层贪心下降到底层做近似最近邻。核心参数:m 是每个节点在图中的最大邻居数(默认 16),越大召回越高但内存和建索引越慢;ef_construction 是建索引时的动态候选队列长度(默认 64);ef_search 是查询时的候选队列长度,可运行时通过 SET hnsw.ef_search 调节,越大越准越慢。HNSW 建索引比 IVFFlat 慢、内存更大,但查询召回和 QPS 通常更优。
pgvector 的 IVFFlat 索引原理和关键参数是什么?
IVFFlat 是倒排文件(Inverted File)+ 平坦存储,建索引时先用 kmeans 把向量聚成 lists 个簇,查询时只探测 probes 个最近的簇,而不是全表扫。核心参数:lists 是聚类中心数(一般取行数/1000,或直接设 100),probes 是查询时探测的簇数,建议取 sqrt(lists)。probes 越大召回越高但越慢,lists 越大每个簇越小、候选更精准但可能漏簇。IVFFlat 是近似检索,需要先灌一批数据再建索引以获得好的聚类中心。
pgvector 的 bit 类型和 Hamming 距离适合什么场景?
pgvector 的 bit 类型用二值向量表示数据,用 <~> 操作符计算 Hamming 距离(两个二进制向量不同 bit 的个数)。二值向量每个维度只占 1 bit,存储极小、计算极快,适合对精度要求不高但数据规模巨大、内存敏感的检索场景(如大规模图像指纹去重)。代价是丢失了实数值的精度,召回通常低于 float32 向量。
pgvectorscale 的 StreamingDiskANN 和 SBQ 是什么?
pgvectorscale 是 Timescale 开源的 pgvector 扩展,核心是 StreamingDiskANN——一种流式磁盘 ANN 索引,向量不全部驻留内存,构建和查询时流式读写,大幅降低大向量集合的内存占用。SBQ(Scalar Binary Quantization)是它的标量二值量化压缩,把向量压缩存储以省内存和带宽。整体让 pgvector 在十亿级向量上也能以较小内存工作,同时对 pgvector 保持兼容。
什么是召回率(recall),近似最近邻为什么需要它?
召回率指 ANN 返回结果中包含真实最近邻的比例,通常以 recall@k 衡量(top-k 里命中了多少真近邻)。因为 IVF/HNSW/DiskANN 都是近似检索,用剪枝换速度,必然可能漏掉部分真近邻,所以用召回率来量化精度损失。实践中通过调大 probes/ef_search/lists 等参数提高召回,但要与 QPS、内存做权衡,通常目标是 95%~99% 召回。
什么是多向量(multi-vector)相似搜索,和单向量有何区别?
多向量搜索用多个向量共同表示一个文档/查询,典型如 ColBERT 把文档的每个 token 都编码成一个向量。查询时用 MaxSim:对查询的每个 token 向量,在文档向量里找最相似的那个取最大值,再求和作为整体相似度。相比把整篇文档压成一个稠密向量的单向量检索,多向量能保留更细粒度语义,召回更高,但存储和算力开销也成倍增加,常配合 ColBERT 做 rerank。
什么是混合搜索(hybrid search),为什么比纯向量搜索效果好?
混合搜索把多种检索信号融合在一起,典型是『稠密向量 + 稀疏向量(BM25 关键词) + 结构化过滤』,用 RRF(Reciprocal Rank Fusion)等算法把各路的排序结果合并。纯向量搜索擅长语义相关但可能漏掉精确关键词命中,纯 BM25 擅长精确词但不懂语义,混合搜索两者互补,能显著提升检索相关性。Postgres 借助 pgvector + 原生 BM25/VectorChord-bm25 可以在一个 SQL 里完成混合检索。
向量数据为什么需要归一化?
归一化(单位化)后所有向量的模长变成 1,好处有三:一是此时余弦相似度与内积等价,计算可复用;二是 L2 距离与余弦距离也等价,排序结果一致;三是避免不同模长的向量在比较时引入长度偏差。做归一化后,用内积操作符 <#> 就能得到与余弦一致的相关性排序,且内积计算比余弦省一次除法。
向量索引建索引时 maintenance_work_mem 是不是越大越好?
不是。maintenance_work_mem 决定建索引时的工作内存,但给太大反而可能变慢:当工作内存超过 CPU 三级缓存(L3)容量时,排序/聚类的工作集会溢出缓存、命中内存延迟上升,同时超大内存易触发操作系统脏页抖动和 swap。经验上要给得适中,让它装下关键工作集即可,而不是无脑拉满,对大规模向量建索引尤其要结合 L3 cache 大小调。
向量索引的『前置/预过滤器』指的是什么?
向量索引里的预过滤(pre-filter)指在进入向量近邻搜索前,先用结构化条件(如 WHERE 过滤类别、时间、标签)缩小候选集合,再在这个子集里做 ANN 检索。相比之下后过滤(post-filter)是先做 ANN 取出 top-k 再套过滤条件,容易因为过滤掉部分结果导致返回不足 k 条。预过滤能保证结果满足所有约束,是混合搜索正确性的关键,pgvector 和 VectorChord 等插件都支持把过滤条件下推到索引扫描。
向量索引预热(prewarm)的原理和作用是什么?
向量索引预热指在查询高峰前,把索引的热数据预先加载到内存/页缓存里,避免首批查询发生大量磁盘 IO 和冷启动延迟。对基于磁盘的索引(如 DiskANN/StreamingDiskANN)尤其重要,预热后首次查询即可命中内存。VectorChord 等插件提供 prewarm 机制,把常用分片或图的上层节点提前加载,从而消除首查抖动。
向量量化有哪些主流技术,压缩和量化的区别是什么?
主流量化技术包括:标量量化(把 float32 映射到 int8/4bit)、乘积量化 PQ(把向量切段分别聚类,用码本 ID 表示)、残差向量量化 RVQ(逐级量化残差)、二值量化(每维 1bit)以及 RaBitQ。『压缩』泛指降低存储(如 float32→float16 或降维),『量化』特指用有限码本/离散值近似原始值。量化本质是用精度换内存和算力,召回率会略有下降,需要在压缩比与召回精度间权衡。
残差矢量量化(RVQ)的原理是什么?
RVQ(Residual Vector Quantization)是矢量量化的增强:先对向量做一次量化,算出量化后的残差(误差向量),再对残差做下一级量化,如此逐级叠加多个码本,用多级码本 ID 共同逼近原向量。相比单级 VQ,RVQ 能用更小码本达到更高精度,是谷歌 SoundStream、Meta Encodec 等神经音频编解码器(也是 AudioLM 基础)的核心压缩技术。VectorChord 等向量插件也借鉴 RVQ 做高压缩比量化。
阿里云 PG 的 pase 插件在高维向量上做了什么?
pase(PostgreSQL 向量索引)是阿里云 PG 早期的高维向量检索插件,支持 512 维向量索引,用于图像识别、人脸识别等相似搜索场景。它针对高维向量的近似最近邻做优化,是国产云 PG 向量能力早期的代表。后来 pgvector 成为事实标准后,这些早期自研插件逐步被替代或整合。
高维向量如何做可视化降维?
高维向量无法直接画在二维平面上,常用 T-SNE(t-Distributed Stochastic Neighbor Embedding)等降维算法,把高维空间里的近邻关系尽可能保留地映射到 2D/3D,用于观察向量聚类的分布。T-SNE 通过在高维用高斯、低维用 t 分布建模点对相似度,并优化 KL 散度来保持局部结构,是向量数据集探索和质检的常用工具。