
当大模型(LLM)和检索增强生成(RAG)成为 AI 应用的标准范式,数据基础设施面临前所未有的挑战:既要高效处理海量非结构化数据,又要支持高维向量的近似最近邻搜索,还要兼顾事务一致性与复杂 SQL 分析。PostgreSQL 凭借其可插拔的扩展生态、成熟的优化器以及云原生演进,正成为这一领域的“终极赢家”。本文将从实战角度,深度剖析 PostgreSQL + pgvector + JSONB 如何构建端到端的 AI 数据管道,并给出在腾讯云数据库上的最佳实践。
传统 AI 应用通常将数据分散在多个专用系统中:关系型数据库存元数据、Elasticsearch 做全文检索、Milvus/Pinecone 存向量、Redis 做缓存。这种“异构数据栈”带来了严重的运维复杂性和数据一致性难题。
PostgreSQL 的破局之道在于 “一体多能” :
pgvector 扩展,支持 L2、内积、余弦距离,并利用 IVFFlat 或 HNSW 索引加速。JSONB 类型支持灵活 Schema,配合 GIN 索引实现高效键值查询。tsvector / tsquery,支持字典、权重、排名。本文所有代码均基于 PostgreSQL 16 + pgvector 0.7.2,已在腾讯云云数据库 PostgreSQL 16 版本上验证通过。
在腾讯云数据库中,pgvector 已作为默认扩展提供,只需执行:
CREATE EXTENSION vector;若需自定义安装,可参考 pgvector 官方文档。
假设我们有一个商品表,需要存储商品描述的 embedding(维度 768,由 BGE 模型生成):
CREATE TABLE products (
id BIGSERIAL PRIMARY KEY,
name TEXT,
description TEXT,
embedding VECTOR(768) -- 显式指定维度
);
-- 插入示例数据(为演示缩短为 3 维)
INSERT INTO products (name, description, embedding) VALUES
('无线蓝牙耳机', '降噪耳机,续航 30 小时', '[0.12, -0.34, 0.56]'::VECTOR),
('智能运动手表', '心率监测,GPS 定位', '[-0.21, 0.45, -0.67]'::VECTOR),
('4K 无人机', '高清摄像,飞行 40 分钟', '[0.78, -0.12, 0.33]'::VECTOR);查询与目标向量最相似的商品(余弦相似度):
SELECT id, name,
1 - (embedding <=> '[0.15, -0.30, 0.50]'::VECTOR) AS cosine_similarity
FROM products
ORDER BY embedding <=> '[0.15, -0.30, 0.50]'::VECTOR
LIMIT 5;<=> 是余弦距离运算符,值越小越相似。其他运算符:
<-> L2 欧氏距离<#> 内积(负值,需注意)创建 HNSW 索引(推荐高精度):
CREATE INDEX products_embedding_hnsw_idx
ON products
USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 200);m:每层最大连接数,影响召回率与构建速度ef_construction:构建时动态列表大小,越大索引质量越高查询时动态调整 ef_search(影响召回率与延迟):
SET hnsw.ef_search = 40; -- 默认 40,可调至 100~200 提高召回当表数据量过亿,单表索引可能过大。可结合声明式分区按 ID 哈希或时间分片,并利用并行查询:
-- 按 ID 范围分区(示例)
CREATE TABLE products_partitioned (
LIKE products INCLUDING ALL
) PARTITION BY RANGE (id);
CREATE TABLE products_p1 PARTITION OF products_partitioned
FOR VALUES FROM (1) TO (10000000);
-- 在每个分区上独立创建 HNSW 索引
-- 并行查询会自动下推
SET max_parallel_workers_per_gather = 4;
EXPLAIN (COSTS OFF)
SELECT * FROM products_partitioned
ORDER BY embedding <=> '[0.1,0.2,0.3]'::VECTOR LIMIT 10;AI 应用中,用户画像、配置参数、元标签常以 JSON 形式存在。PostgreSQL 的 JSONB 支持二进制存储和 GIN 索引。
扩展商品表,增加 attributes 字段存储价格、库存、标签:
ALTER TABLE products ADD COLUMN attributes JSONB;
UPDATE products SET attributes = '{
"price": 299.99,
"stock": 150,
"tags": ["electronics", "audio"],
"release_date": "2026-01-15"
}' WHERE id = 1;查询价格低于 500 且向量相似度 top 10:
SELECT id, name, attributes->>'price' AS price,
1 - (embedding <=> '[0.12, -0.34, 0.56]'::VECTOR) AS sim
FROM products
WHERE (attributes->>'price')::NUMERIC < 500
ORDER BY embedding <=> '[0.12, -0.34, 0.56]'::VECTOR
LIMIT 10;为确保性能,可创建表达式索引:
CREATE INDEX idx_products_price ON products (( (attributes->>'price')::NUMERIC ));
CREATE INDEX idx_products_tags ON products USING GIN ((attributes->'tags'));RAG 场景常需要同时匹配关键词和语义。PostgreSQL 支持 tsvector 与向量距离组合排序。
为 description 创建全文索引:
ALTER TABLE products ADD COLUMN text_search TSVECTOR
GENERATED ALWAYS AS (to_tsvector('english', description)) STORED;
CREATE INDEX idx_products_tsv ON products USING GIN (text_search);混合查询:关键词匹配“降噪”且向量相似度排序:
SELECT id, name, description,
ts_rank(text_search, to_tsquery('english', '降噪')) AS rank,
1 - (embedding <=> '[0.12, -0.34, 0.56]'::VECTOR) AS sim
FROM products
WHERE text_search @@ to_tsquery('english', '降噪')
ORDER BY (1 - (embedding <=> '[0.12, -0.34, 0.56]'::VECTOR)) DESC
LIMIT 20;更高级的 加权排序(线性组合):
SELECT id, name,
0.7 * (1 - (embedding <=> '[0.12, -0.34, 0.56]'::VECTOR))
+ 0.3 * ts_rank(text_search, to_tsquery('english', '降噪')) AS hybrid_score
FROM products
WHERE text_search @@ to_tsquery('english', '降噪') -- 可放宽为 OR 条件
ORDER BY hybrid_score DESC
LIMIT 10;AI 数据往往分布在对象存储(如 COS)或 Hadoop 中。PostgreSQL FDW 允许直接查询外部数据,减少 ETL。
file_fdw 读取 CSV 训练样本CREATE EXTENSION file_fdw;
CREATE SERVER csv_server FOREIGN DATA WRAPPER file_fdw;
CREATE FOREIGN TABLE training_samples (
sample_id INTEGER,
feature_vector VECTOR(128),
label TEXT
) SERVER csv_server
OPTIONS ( filename '/data/train.csv', format 'csv' );postgres_fdw 跨库查询在腾讯云上,可将不同业务库的数据聚合进行向量检索:
CREATE EXTENSION postgres_fdw;
CREATE SERVER remote_pg FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host 'xxx.tencentcdb.com', port '5432', dbname 'analytics');
CREATE USER MAPPING FOR CURRENT_USER SERVER remote_pg
OPTIONS (user 'user', password 'pass');
CREATE FOREIGN TABLE remote_embeddings (
id BIGINT,
emb VECTOR(768)
) SERVER remote_pg OPTIONS (schema_name 'public', table_name 'embeddings');
-- 本地 JOIN 远程向量
SELECT local.*, remote.emb
FROM local_table local
JOIN remote_embeddings remote ON local.id = remote.id
ORDER BY remote.emb <=> '[0.1, ...]'::VECTOR LIMIT 10;腾讯云数据库默认参数偏保守,针对 AI 负载建议调整:
-- 增加共享缓冲区(建议系统内存的 25%)
ALTER SYSTEM SET shared_buffers = '8GB';
-- 工作内存(影响排序、哈希、索引构建)
ALTER SYSTEM SET work_mem = '64MB';
-- 并行查询相关
ALTER SYSTEM SET max_parallel_workers = 16;
ALTER SYSTEM SET parallel_tuple_cost = 0.001;
ALTER SYSTEM SET parallel_setup_cost = 5.0;
-- 对于 HNSW 索引构建,临时提高 maintenance_work_mem
SET maintenance_work_mem = '4GB';索引类型 | 构建速度 | 查询速度 | 召回率 | 内存占用 |
|---|---|---|---|---|
IVFFlat | 快 | 中等 | 高(调高 probes) | 低 |
HNSW | 慢 | 极快 | 极高 | 较高(约原始数据 1.5~2 倍) |
对于 百万级 以下数据,HNSW 是首选;亿级 数据可考虑 IVFFlat 结合分区。
IVFFlat 使用示例:
CREATE INDEX products_embedding_ivfflat_idx
ON products
USING ivfflat (embedding vector_cosine_ops)
WITH (lists = 100); -- 聚类中心数,约为 sqrt(行数)
-- 查询时调整 probes(默认 1)
SET ivfflat.probes = 10; -- 增加召回率使用 EXPLAIN ANALYZE 监控向量索引是否生效:
EXPLAIN (ANALYZE, BUFFERS)
SELECT * FROM products
ORDER BY embedding <=> '[0.12, -0.34, 0.56]'::VECTOR
LIMIT 10;关键指标:
腾讯云数据库 PostgreSQL 在社区版基础上提供了多项针对 AI 场景的优化:
所有 16.x 及以上实例默认包含 vector 扩展,无需手动编译。
腾讯云自研的 TDSQL-C PostgreSQL 支持将向量距离计算卸载至 GPU,通过 pgvector_gpu 插件实现,适合大规模批量推理。
AI 应用常有高并发查询,可创建只读实例分担向量检索压力,主实例负责写入。
结合对象存储 COS 实现秒级快照,保障向量数据安全。
需求:用户输入一段自然语言描述(如“我想找一款适合户外运动的防水手表”),系统返回最匹配的商品,同时支持按价格区间、品牌过滤。
步骤:
products 表。-- 假设已获取用户查询向量 :query_vec TEXT
-- 价格范围 :min_price, :max_price
WITH filtered AS (
SELECT id, name, description, price,
1 - (embedding <=> :query_vec::VECTOR) AS sim
FROM products
WHERE price BETWEEN :min_price AND :max_price
AND attributes->>'brand' = 'Nike' -- 精确过滤
)
SELECT * FROM filtered
WHERE sim > 0.75 -- 相似度阈值
ORDER BY sim DESC
LIMIT 20;pg_cron 定时刷新最热查询结果到物化视图。CREATE EXTENSION pg_cron;
-- 每 5 分钟刷新热门结果
SELECT cron.schedule('refresh-hot', '*/5 * * * *',
'REFRESH MATERIALIZED VIEW CONCURRENTLY hot_recommendations');PostgreSQL 凭借其 30 余年积累的工程底蕴,在 AI 时代非但没有“老迈”,反而通过 pgvector、pgml(机器学习)、pg_embedding 等扩展焕发新生。它让开发者能够:
未来,随着 pgvector 支持量化、磁盘 ANN 索引 等特性落地,PostgreSQL 将成为 AI 应用数据库的默认选项。作为开发者,掌握 PostgreSQL + 向量检索,便是握住了通往智能应用的金钥匙。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。