pgvector 中的 IVFFlat 索引
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 内部实现高性能向量搜索——无需外部数据库。