跳到主要内容

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 调用流程

  1. 将知识库文档切分为片段。
  2. 为每个片段生成 embedding。
  3. 将片段文本、来源、权限元数据和向量写入 PostgreSQL。
  4. 用户提问时生成 query embedding。
  5. 在数据库中按向量距离召回相关片段。
  6. 将片段作为上下文交给模型生成答案。

完整 RAG 示例请先参考 用 CloudBase PostgreSQL + pgvector 做 RAG

权限与过滤

如果不同用户或团队只能访问自己的知识库,应在向量表中保留 user_idteam_idvisibility 字段,并结合 RLS 或服务端权限过滤。

select id, title, content
from public.documents
where team_id = $1
order by embedding <=> $2
limit 5;

不要只在应用层过滤召回结果,否则可能把无权限文档传入模型上下文。

性能建议

  • 维度必须与模型输出一致,不能混用不同维度的 embedding。
  • 小数据量可以直接精确排序,大数据量应创建向量索引。
  • 向量检索通常还需要结合元数据过滤,例如租户、知识库、状态和更新时间。
  • embedding 字段较大,批量导入时应分批写入,并关注索引构建耗时。