CREATE EXTENSION 权限。-- 创建 pgvector 扩展CREATE EXTENSION IF NOT EXISTS vector;-- 验证安装SELECT extversion FROM pg_extension WHERE extname = 'vector';
-- 创建带向量列的表(1536 维,适配常见 Embedding 模型)CREATE TABLE documents (id BIGSERIAL PRIMARY KEY,content TEXT NOT NULL,embedding vector(1536));-- 插入向量数据INSERT INTO documents (content, embedding)VALUES ('PostgreSQL 是最先进的开源数据库', '[0.1, 0.2, 0.3, ...]'::vector(1536));
CREATE TABLE docs_halfvec (id BIGSERIAL PRIMARY KEY,embedding halfvec(1536));
CREATE TABLE docs_sparse (id BIGSERIAL PRIMARY KEY,embedding sparsevec(30000));-- 稀疏向量使用 {index:value}/dim 格式INSERT INTO docs_sparse (embedding)VALUES ('{1:0.5, 100:0.3, 999:0.8}/30000'::sparsevec);
运算符 | 含义 | 使用场景 |
<-> | L2欧氏距离 | 通用相似度搜索 |
<=> | 余弦距离 | 文本 / 图像嵌入(推荐) |
<#> | 负内积 | 归一化向量的最大内积搜索 |
<+> | L1曼哈顿距离 | 特殊场景 |
-- 余弦相似度搜索(最常用)SELECT id, content,1 - (embedding <=> query_vec) AS similarityFROM documentsORDER BY embedding <=> query_vecLIMIT 10;-- L2 距离搜索SELECT id, contentFROM documentsORDER BY embedding <-> query_vecLIMIT 10;
-- 创建 HNSW 索引(余弦距离)CREATE INDEX ON documentsUSING hnsw (embedding vector_cosine_ops)WITH (m = 16, ef_construction = 200);-- 创建 HNSW 索引(L2 距离)CREATE INDEX ON documentsUSING hnsw (embedding vector_l2_ops)WITH (m = 16, ef_construction = 200);
参数 | 默认值 | 说明 |
m | 16 | 每个节点的最大连接数,越大越精确但内存越多 |
ef_construction | 64 | 构建时搜索宽度,越大构建越慢但质量越高 |
-- 增大 ef_search 提高召回率(默认 40)SET hnsw.ef_search = 100;
-- 需要先有数据才能创建CREATE INDEX ON documentsUSING ivfflat (embedding vector_cosine_ops)WITH (lists = 100); -- lists 建议 = sqrt(行数)-- 查询时设置探测数SET ivfflat.probes = 10;
场景 | 推荐索引 | 原因 |
数据量 < 100万 | HNSW | 查询快,召回率高 |
数据量 > 100万 | 磁盘友好 | |
频繁插入更新 | IVFFlat | 增量成本低 |
对召回率要求极高 | HNSW(大 ef_search) | 可趋近精确搜索 |
-- 1. 创建知识库表CREATE TABLE knowledge_base (id BIGSERIAL PRIMARY KEY,title TEXT NOT NULL,content TEXT NOT NULL,embedding vector(1024),metadata JSONB DEFAULT '{}',created_at TIMESTAMPTZ DEFAULT NOW());-- 2. 创建索引CREATE INDEX idx_kb_hnsw ON knowledge_baseUSING hnsw (embedding vector_cosine_ops)WITH (m = 16, ef_construction = 200);-- 3. 语义搜索(结合 tencentdb_ai 获取查询向量)SELECT title, content,1 - (embedding <=> query_embedding) AS similarityFROM knowledge_base,LATERAL (SELECT tencentdb_ai.get_embedding('bge-m3', '什么是 PostgreSQL?')AS query_embedding) qWHERE embedding <=> query_embedding < 0.5ORDER BY embedding <=> query_embeddingLIMIT 5;
-- 先插数据,后建索引(速度更快)DROP INDEX IF EXISTS idx_kb_hnsw;-- ... 批量 COPY 数据 ...CREATE INDEX idx_kb_hnsw ON knowledge_baseUSING hnsw (embedding vector_cosine_ops);
模型 | 维度 | 建议场景 |
BGE-M3 | 1024 | 中英文通用 |
text-embedding-3-small | 1536 | OpenAI 生态 |
Cohere embed-v3 | 1024 | 多语言 |
自定义降维 | 256 – 512 | 超大规模数据 |
文档反馈