pgvector
pgvector 是 PostgreSQL 的向量检索扩展,适合在数据库中保存 embedding,并按相似度查询文本、图片或其他非结构化数据。
CloudBase PostgreSQL 可以结合云函数、云托管或 AI 模型服务完成 RAG 应用:业务侧生成 embedding,数据库保存向量和元数据,查询时按相似度召回相关内容。
启用扩展
在 DMC SQL 窗口中启用 vector 扩展。具体支持情况以控制台和实例版本为准。
create extension if not exists vector;
创建向量表
向量字段需要声明固定维度,维度必须与 embedding 模型输出一致。
create table public.documents (
id bigint generated by default as identity primary key,
title text not null,
content text not null,
metadata jsonb not null default '{}',
embedding vector(1536),
created_at timestamptz not null default now()
);
如果使用的模型输出 768 维向量,则字段应写为 vector(768)。
写入向量
业务服务生成 embedding 后,可以通过服务端直连或 HTTP API 写入数据库。
insert into public.documents (title, content, embedding)
values (
'CloudBase PostgreSQL',
'CloudBase PostgreSQL supports relational data and vector search.',
'[0.012, -0.023, 0.034]'::vector
);
示例中的向量已截断,实际写入时需要传入完整维度。
相似度查询
pgvector 支持多种距离操作符:
| 操作符 | 说明 |
|---|---|
<-> | L2 欧氏距离 |
<#> | 负内积 |
<=> | Cosine 距离 |
select id, title, content
from public.documents
order by embedding <=> '[0.011, -0.020, 0.030]'::vector
limit 5;
距离越小表示越相似。对于 RAG 场景,通常先召回 Top K 文档,再将内容片段传给大模型生成答案。
创建索引
数据量较大时,应为向量字段创建近似索引。具体索引类型和参数支持取决于 pgvector 版本。
create index documents_embedding_ivfflat_idx
on public.documents
using ivfflat (embedding vector_cosine_ops)
with (lists = 100);
创建 ivfflat 索引后,应执行 analyze 更新统计信息。
analyze public.documents;
RAG 调用流程
- 将知识库文档切分为片段。
- 为每个片段生成 embedding。
- 将片段文本、来源、权限元数据和向量写入 PostgreSQL。
- 用户提问时生成 query embedding。
- 在数据库中按向量距离召回相关片段。
- 将片段作为上下文交给模型生成答案。
完整 RAG 示例请先参考 用 CloudBase PostgreSQL + pgvector 做 RAG。要把检索结果作为工具挂给 Agent,参考 知识库。
权限与过滤
如果不同用户或团队只能访问自己的知识库,应在向量表中保留 user_id、team_id 或 visibility 字段,并结合 RLS 或服务端权限过滤。
select id, title, content
from public.documents
where team_id = $1
order by embedding <=> $2
limit 5;
不要只在应用层过滤召回结果,否则可能把无权限文档传入模型上下文。
性能建议
- 维度必须与模型输出一致,不能混用不同维度的 embedding。
- 小数据量可以直接精确排序,大数据量应创建向量索引。
- 向量检索通常还需要结合元数据过滤,例如租户、知识库、状态和更新时间。
- embedding 字段较大,批量导入时应分批写入,并关注索引构建耗时。