pgvector 中的 IVFFlat 索引

发布: (2025年12月17日 GMT+8 11:36)
5 min read
原文: Dev.to

Source: Dev.to

请提供您希望翻译的具体文本内容,我将为您翻译成简体中文。

什么是 pgvector 中的 IVFFlat?

IVFFlat(Inverted File with Flat Vectors)是一种 ANN 索引。与对表中每个向量进行逐一比较的暴力扫描不同,IVFFlat 将向量划分为多个“列表”(或簇)。查询时,仅搜索最相关的列表。

关键优势

  • 在大规模数据集上实现更快的相似度搜索
  • 近似结果,但可调节精度
  • 非常适合高维嵌入

IVFFlat 如何工作?

IVFFlat 使用基于中心点的聚类方法。

1. 训练步骤

  • 使用 k‑means 将向量聚类成列表。
  • 每个列表代表一个中心点。

2. 索引结构

  • 每个向量被分配到最近的中心点/列表。
  • 索引存储向量列表(倒排列表)。

3. 查询执行

  • 查询向量与所有中心点进行比较。
  • 选取 probes 最相似的列表。
  • 仅比较这些列表中的向量。

我们可以控制什么?

  • lists – 聚类数量
  • probes – 查询时搜索的聚类数量

增加 probes 的数量可以提升准确率,但会降低速度。

在 pgvector 中实现 IVFFlat 索引

1. 安装 pgvector(如果尚未安装)

CREATE EXTENSION IF NOT EXISTS vector;

2. 创建包含向量嵌入的表

CREATE TABLE documents (
    id        bigserial PRIMARY KEY,
    embedding vector(768)
);

3. 创建 IVFFlat 索引

CREATE INDEX vector_ivfflat_idx
ON documents
USING ivfflat (embedding vector_cosine_ops)
WITH (lists = 1000);

注意:

  • 应在插入足够多的行后再创建索引(以获得更好的 k‑means 训练)。
  • 每个列表的行数至少应为 1 000 条。

4. 使用 IVFFlat 查询

示例余弦相似度搜索:

SET ivfflat.probes = 20;

SELECT id
FROM documents
ORDER BY embedding '[0.5, 0.3, …]'
LIMIT 10;

如果需要,可全局设置:

ALTER SYSTEM SET ivfflat.probes = 20;

调整 IVFFlat 中的 Probes

  • Probes 控制查询期间扫描的 IVF 列表数量。
  • 较低的 probes → 更快,但精度较低(搜索的簇更少)。
  • 较高的 probes → 精度更高,但速度会下降。
  • 根据您对速度和召回率的优先级选择最佳值。

推荐范围

低探针 (1–10)

  • ✅ 最快的搜索性能
  • ✅ 适用于实时或高吞吐量工作负载
  • ❌ 准确率和召回率较低
  • ❌ 如果聚类较粗,可能会错过相似向量

中等探针 (~10 % 的总列表)

  • ✅ 速度与准确度的平衡
  • ✅ 适用于大多数生产工作负载
  • ✅ 在不牺牲显著性能的情况下获得良好召回率
  • ❌ 比低探针设置略慢

高探针 (50–100 % 的列表)

  • ✅ 接近精确搜索结果(高召回率)
  • ✅ 适用于对质量敏感的工作负载(例如搜索相关性)
  • ❌ 由于扫描大量列表,速度显著变慢
  • ❌ 减少了 ANN 索引的性能优势

维护任务:REINDEX、ANALYZE、VACUUM

IVFFlat 索引需要定期维护,以保持搜索性能的稳定。

1. ANALYZE – 改善查询计划

在大批量插入后运行 ANALYZE,或依赖 autovacuum/analyze。

ANALYZE documents;

-- 检查表的最近一次 ANALYZE 时间
SELECT relname, last_analyze, last_autoanalyze
FROM pg_stat_all_tables
WHERE relname = 'documents';

2. REINDEX – 大规模数据变更后必需

如果插入或删除了大量向量,中心向量可能会漂移,导致性能下降。

REINDEX INDEX vector_ivfflat_idx;

-- 重建期间保持表可用
REINDEX INDEX CONCURRENTLY vector_ivfflat_idx;

何时进行 REINDEX

  • 插入数百万新行后
  • 删除大量数据后
  • 如果召回率明显下降

3. VACUUM – 保持存储清洁

定期执行 VACUUM 有助于维护表和索引的健康。

VACUUM (VERBOSE, ANALYZE) documents;

启用 autovacuum 以进行持续维护。

结论

IVFFlat 是 pgvector 中一种强大的 ANN 索引方法,兼顾性能、内存效率和简易性。通过适当的配置和维护,IVFFlat 能在 PostgreSQL 内部实现高性能向量搜索——无需外部数据库。

Back to Blog

相关文章

阅读更多 »