首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >AI 时代首选数据库:PostgreSQL 如何以向量扩展与 JSON 能力重塑智能应用

AI 时代首选数据库:PostgreSQL 如何以向量扩展与 JSON 能力重塑智能应用

原创
作者头像
用户12566962
发布2026-08-14 11:38:26
发布2026-08-14 11:38:26
890
举报

AI 时代首选数据库:PostgreSQL 如何以向量扩展与 JSON 能力重塑智能应用

当大模型(LLM)和检索增强生成(RAG)成为 AI 应用的标准范式,数据基础设施面临前所未有的挑战:既要高效处理海量非结构化数据,又要支持高维向量的近似最近邻搜索,还要兼顾事务一致性与复杂 SQL 分析。PostgreSQL 凭借其可插拔的扩展生态、成熟的优化器以及云原生演进,正成为这一领域的“终极赢家”。本文将从实战角度,深度剖析 PostgreSQL + pgvector + JSONB 如何构建端到端的 AI 数据管道,并给出在腾讯云数据库上的最佳实践。


1. 引言:AI 数据栈的“三体问题”

传统 AI 应用通常将数据分散在多个专用系统中:关系型数据库存元数据、Elasticsearch 做全文检索、Milvus/Pinecone 存向量、Redis 做缓存。这种“异构数据栈”带来了严重的运维复杂性和数据一致性难题。

PostgreSQL 的破局之道在于 “一体多能”

  • 向量检索:通过 pgvector 扩展,支持 L2、内积、余弦距离,并利用 IVFFlat 或 HNSW 索引加速。
  • 非结构化处理JSONB 类型支持灵活 Schema,配合 GIN 索引实现高效键值查询。
  • 全文搜索:内置 tsvector / tsquery,支持字典、权重、排名。
  • 事务与分析混合:MVCC + 并行查询,兼顾 OLTP 与轻量 OLAP。

本文所有代码均基于 PostgreSQL 16 + pgvector 0.7.2,已在腾讯云云数据库 PostgreSQL 16 版本上验证通过。


2. 向量检索:pgvector 深度实战

2.1 安装与配置

在腾讯云数据库中,pgvector 已作为默认扩展提供,只需执行:

代码语言:javascript
复制
CREATE EXTENSION vector;

若需自定义安装,可参考 pgvector 官方文档

2.2 向量列与嵌入生成

假设我们有一个商品表,需要存储商品描述的 embedding(维度 768,由 BGE 模型生成):

代码语言:javascript
复制
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);

2.3 距离查询与索引加速

查询与目标向量最相似的商品(余弦相似度)

代码语言:javascript
复制
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 索引(推荐高精度)

代码语言:javascript
复制
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(影响召回率与延迟):

代码语言:javascript
复制
SET hnsw.ef_search = 40;  -- 默认 40,可调至 100~200 提高召回

2.4 向量分区与并行查询

当表数据量过亿,单表索引可能过大。可结合声明式分区按 ID 哈希或时间分片,并利用并行查询:

代码语言:javascript
复制
-- 按 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;

3. 非结构化数据:JSONB + 全文检索联合作战

AI 应用中,用户画像、配置参数、元标签常以 JSON 形式存在。PostgreSQL 的 JSONB 支持二进制存储和 GIN 索引。

3.1 JSONB 与向量混合查询

扩展商品表,增加 attributes 字段存储价格、库存、标签:

代码语言:javascript
复制
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

代码语言:javascript
复制
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;

为确保性能,可创建表达式索引:

代码语言:javascript
复制
CREATE INDEX idx_products_price ON products (( (attributes->>'price')::NUMERIC ));
CREATE INDEX idx_products_tags ON products USING GIN ((attributes->'tags'));

3.2 全文搜索 + 向量检索(混合召回)

RAG 场景常需要同时匹配关键词和语义。PostgreSQL 支持 tsvector 与向量距离组合排序。

description 创建全文索引

代码语言:javascript
复制
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);

混合查询:关键词匹配“降噪”且向量相似度排序

代码语言:javascript
复制
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;

更高级的 加权排序(线性组合):

代码语言:javascript
复制
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;

4. 高级特性:外部数据包装器(FDW)与数据湖融合

AI 数据往往分布在对象存储(如 COS)或 Hadoop 中。PostgreSQL FDW 允许直接查询外部数据,减少 ETL。

4.1 使用 file_fdw 读取 CSV 训练样本

代码语言:javascript
复制
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' );

4.2 结合 postgres_fdw 跨库查询

在腾讯云上,可将不同业务库的数据聚合进行向量检索:

代码语言:javascript
复制
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;

5. 性能调优:让 PostgreSQL 跑出“专用向量库”的速度

5.1 内存参数优化

腾讯云数据库默认参数偏保守,针对 AI 负载建议调整:

代码语言:javascript
复制
-- 增加共享缓冲区(建议系统内存的 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';

5.2 索引选择:IVFFlat vs HNSW

索引类型

构建速度

查询速度

召回率

内存占用

IVFFlat

中等

高(调高 probes)

HNSW

极快

极高

较高(约原始数据 1.5~2 倍)

对于 百万级 以下数据,HNSW 是首选;亿级 数据可考虑 IVFFlat 结合分区。

IVFFlat 使用示例

代码语言:javascript
复制
CREATE INDEX products_embedding_ivfflat_idx 
ON products 
USING ivfflat (embedding vector_cosine_ops)
WITH (lists = 100);  -- 聚类中心数,约为 sqrt(行数)

-- 查询时调整 probes(默认 1)
SET ivfflat.probes = 10;  -- 增加召回率

5.3 查询计划分析

使用 EXPLAIN ANALYZE 监控向量索引是否生效:

代码语言:javascript
复制
EXPLAIN (ANALYZE, BUFFERS) 
SELECT * FROM products 
ORDER BY embedding <=> '[0.12, -0.34, 0.56]'::VECTOR 
LIMIT 10;

关键指标:

  • Index Scan using hnsw 表示使用 HNSW 索引
  • Heap Fetches 应尽量低
  • Execution Time 需与顺序扫描对比

6. 腾讯云数据库 PostgreSQL 的专属增强

腾讯云数据库 PostgreSQL 在社区版基础上提供了多项针对 AI 场景的优化:

6.1 自动扩展 pgvector 预安装

所有 16.x 及以上实例默认包含 vector 扩展,无需手动编译。

6.2 异构计算加速(GPU 卸载)

腾讯云自研的 TDSQL-C PostgreSQL 支持将向量距离计算卸载至 GPU,通过 pgvector_gpu 插件实现,适合大规模批量推理。

6.3 只读实例与读写分离

AI 应用常有高并发查询,可创建只读实例分担向量检索压力,主实例负责写入。

6.4 备份与恢复

结合对象存储 COS 实现秒级快照,保障向量数据安全。


7. 完整实战案例:构建一个商品智能推荐系统

需求:用户输入一段自然语言描述(如“我想找一款适合户外运动的防水手表”),系统返回最匹配的商品,同时支持按价格区间、品牌过滤。

步骤

  1. 离线阶段:将商品描述通过 embedding 模型(如 BGE-M3)向量化,存入 products 表。
  2. 在线查询:用户文本同样向量化,执行混合查询:
代码语言:javascript
复制
-- 假设已获取用户查询向量 :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;
  1. 缓存热点:使用 pg_cron 定时刷新最热查询结果到物化视图。
代码语言:javascript
复制
CREATE EXTENSION pg_cron;

-- 每 5 分钟刷新热门结果
SELECT cron.schedule('refresh-hot', '*/5 * * * *', 
    'REFRESH MATERIALIZED VIEW CONCURRENTLY hot_recommendations');

8. 总结与展望

PostgreSQL 凭借其 30 余年积累的工程底蕴,在 AI 时代非但没有“老迈”,反而通过 pgvectorpgml(机器学习)、pg_embedding 等扩展焕发新生。它让开发者能够:

  • 统一数据治理:一套 SQL 覆盖结构化、半结构化和向量数据。
  • 降低运维成本:无需维护多套异构存储,减少数据搬迁。
  • 弹性扩展:结合腾讯云等云厂商的分布式架构,可支撑 PB 级 AI 数据。

未来,随着 pgvector 支持量化磁盘 ANN 索引 等特性落地,PostgreSQL 将成为 AI 应用数据库的默认选项。作为开发者,掌握 PostgreSQL + 向量检索,便是握住了通往智能应用的金钥匙。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • AI 时代首选数据库:PostgreSQL 如何以向量扩展与 JSON 能力重塑智能应用
    • 1. 引言:AI 数据栈的“三体问题”
    • 2. 向量检索:pgvector 深度实战
      • 2.1 安装与配置
      • 2.2 向量列与嵌入生成
      • 2.3 距离查询与索引加速
      • 2.4 向量分区与并行查询
    • 3. 非结构化数据:JSONB + 全文检索联合作战
      • 3.1 JSONB 与向量混合查询
      • 3.2 全文搜索 + 向量检索(混合召回)
    • 4. 高级特性:外部数据包装器(FDW)与数据湖融合
      • 4.1 使用 file_fdw 读取 CSV 训练样本
      • 4.2 结合 postgres_fdw 跨库查询
    • 5. 性能调优:让 PostgreSQL 跑出“专用向量库”的速度
      • 5.1 内存参数优化
      • 5.2 索引选择:IVFFlat vs HNSW
      • 5.3 查询计划分析
    • 6. 腾讯云数据库 PostgreSQL 的专属增强
      • 6.1 自动扩展 pgvector 预安装
      • 6.2 异构计算加速(GPU 卸载)
      • 6.3 只读实例与读写分离
      • 6.4 备份与恢复
    • 7. 完整实战案例:构建一个商品智能推荐系统
    • 8. 总结与展望
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档