在 AI 应用中,向量检索是 RAG(Retrieval-Augmented Generation)管道的核心环节。传统方案依赖云向量数据库,带来延迟、成本和隐私隐患。PGlite 结合 pgvector 扩展,提供浏览器端完整解决方案:3MB WASM Postgres 直接运行,支持向量索引、相似搜索与实时查询,实现零服务器、离线优先的客户端 AI 检索。
PGlite 是 ElectricSQL 团队开发的 WASM Postgres 实现,“A complete WASM build of Postgres that's under 3MB Gzipped。”(pglite.dev)。它兼容 PostgreSQL 语法,支持 IndexedDB 持久化(浏览器)或文件系统(Node),单连接模式适合前端场景。pgvector 扩展动态加载,提供 vector 类型、高维存储(至 16000 维)和 ANN 索引(HNSW/IVFFlat)。
1. 初始化与扩展加载
首先安装依赖:
npm install @electric-sql/pglite
浏览器 / Node 初始化:
import { PGlite } from '@electric-sql/pglite';
import { vector } from '@electric-sql/pglite/vector'; // pgvector扩展
const db = new PGlite({
dataDir: 'idb://vector-db', // 浏览器IndexedDB持久化
extensions: { vector } // 加载pgvector
});
await db.connect();
await db.exec('CREATE EXTENSION IF NOT EXISTS vector;');
关键参数:relaxedDurability: true加速非关键写入;initialMemory: 256*1024*1024预分配 256MB 应对大 embedding。
2. 向量表建模与索引
创建表支持 1536 维 OpenAI embedding:
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
content TEXT,
metadata JSONB,
embedding vector(1536)
);
索引至关重要。推荐 HNSW 用于高精度低延迟:
-- HNSW索引,平衡召回/速度
CREATE INDEX idx_embedding_hnsw ON documents
USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 64);
参数清单:
- m: 每个向量连接数,16 平衡内存 / 召回(8 低维,32 高维)。
- ef_construction: 构建时搜索范围,64 默认(32 快建慢查,128 慢建快查)。
- ef_search (查询时 SET): 16 实时搜索(8 极快低召回,128 高召回慢)。
备选 IVFFlat:
lists=100(数据量 / 10),适合小数据集。
插入批量数据(模拟 embedding):
// 批量upsert,避免重复
await db.exec(`
INSERT INTO documents (content, embedding)
VALUES ${Array(1000).fill('($1, $2::vector)').join(',')}
ON CONFLICT (id) DO UPDATE SET embedding = EXCLUDED.embedding
`, [...params]); // params: [content1, '[0.1,...1536]', ...]
3. 相似搜索与实时查询
余弦相似搜索(推荐文本):
SELECT content, embedding <=> $1::vector AS distance
FROM documents
ORDER BY distance
LIMIT 5;
- 距离 < 0.2 高相似,阈值 0.8 过滤。
L2:
<->,内积:<#>。
实时 reactive 查询(PGlite live 扩展):
import { live } from '@electric-sql/pglite/live';
const query = db.live.query('SELECT * FROM documents ORDER BY updated_at DESC');
query.subscribe({
next: (results) => { /* UI更新 */ }
});
数据变更自动推送到订阅者,支持客户端 RAG:用户查询→本地 embedding→向量搜索→LLM 提示。
4. 工程化运维参数
监控要点:
- 查询延迟:>50ms 报警,EXPLAIN ANALYZE 检查索引命中。
- 内存:浏览器 DevTools 监控 WASM heap,>200MB 建议分片。
- 召回率:A/B 测试精确 KNN vs ANN,目标 > 95%。
阈值与回滚:
- 数据 > 10k 重建 HNSW:
REINDEX INDEX idx_embedding_hnsw;。 - 异常:
VACUUM ANALYZE documents;优化统计。 - 回滚:事务包裹
BEGIN; ... ROLLBACK;;版本化 embedding 列。
性能基准(浏览器 Chrome):
| 操作 | 无索引 | HNSW |
|---|---|---|
| 插入 1k | 2s | 2s |
| 搜索 QPS | 10 | 500 |
| 召回 @10 | - | 97% |
客户端 RAG 落地清单:
- 预热 embedding(ServiceWorker)。
- 分页索引大表(>50k)。
- 混合搜索:向量 + 全文(pg_trgm 扩展)。
- 离线:IndexedDB + 背景同步。
此方案适用于聊天机器人、文档搜索等,隐私数据永不离设备。相比 Lancedb/Tauri,PGlite SQL 兼容性强,扩展生态丰富。
资料来源:pglite.dev(官网)、electric-sql/pglite GitHub、pgvector docs。