概述
最强大的开源关系型数据库,大概率就是PostgreSQL,下文简称PG。而PG的强大不仅在于它稳定可靠的关系型能力,更在于它拥有极其丰富的扩展(插件)生态,从向量检索、图数据库到机器学习,几乎都能在数据库内部直接搞定,无需额外部署一堆独立组件。
这篇文章就来盘点几个让PG变身「AI数据库」的重量级扩展:PGVector(向量检索)、Apache AGE(图数据库)、PostgresML(机器学习)、Arrow Flight SQL Adapter(高性能列存传输)。它们各有侧重,组合起来几乎能覆盖当下主流AI应用的后端存储与计算需求。
PGVector
开源(GitHub,23.2K Star,1.3K Fork)、C+Perl语言实现,增加向量类型与向量相似度检索能力,不用单独部署独立向量库,是目前 RAG、语义检索最主流方案之一,作者:ankane 。扩展内部名字叫 vector,创建扩展语句是CREATE EXTENSION vector。
能力
- 向量数据类型
- vector(N):单精度浮点向量,最多16000维
- halfvec(N):半精度FP16,节省内存(0.7+)
- sparsevec(N):稀疏向量
- bit:二进制向量,支持汉明距离、雅卡尔距离
- 距离算子
| 运算符 | 距离 | 适用场景 |
|---|---|---|
<-> | L2欧氏距离 | 通用相似度 |
<=> | 余弦距离 | 文本Embedding最常用 |
<#> | 负内积 | 归一化向量,最大内积检索 |
<+> | L1曼哈顿距离 | |
<~> | 汉明距离(bit向量) | 图像哈希 |
<%> | Jaccard距离 | 集合/二进制 |
- 两种 ANN 近似索引
- HNSW:图索引,召回高、查询快;建索引慢、内存占用高,适合百万级向量,生产首选
- ivfflat:倒排聚类索引,建索引快、内存小;召回略低,适合冷数据、大批量导入场景
- 支持精确KNN检索:不建索引,全表扫描,小数据集
- 完美复用PG能力:ACID事务、JOIN、WHERE过滤、JSONB、分区、备份、权限,可以向量 + 业务数据同库做混合检索(过滤后向量召回)
优点
- 架构简单:已有PG直接加扩展,不用维护额外向量数据库
- 支持带业务条件过滤的向量检索,如
WHERE category='xxx' ORDER BY embedding <=> ...,这是很多独立向量库短板 - SQL原生,和LangChain、LlamaIndex生态集成成熟
- 事务保证,向量和业务数据强一致
局限
- 数十亿超大向量规模,性能弱于Pinecone、Milvus等专用向量库;超大场景可用 pgvectorscale 增强
- HNSW索引内存开销大,更新频繁场景索引维护成本高
- 高维向量存储占用较高
适用场景
- RAG知识库、LLM私有文档问答
- 文本语义搜索、图片检索
- 商品推荐、用户特征召回
- 异常检测、向量聚类分析
生态集成:LangChain、LlamaIndex、Spring AI、Dify、Supabase、云厂商(AWS RDS、Azure、阿里云PolarDB、腾讯云PG)大多原生预装PGVector。
实战
-- 1. 开启扩展CREATEEXTENSIONIFNOTEXISTSvector;-- 2. 建表,embedding 为1536维(OpenAI text-embedding-ada-002)CREATETABLEdocuments(id bigserialPRIMARYKEY,contenttext,embedding vector(1536));-- 3. 插入向量INSERTINTOdocuments(content,embedding)VALUES('pgvector介绍','[0.1,0.2,0.3,...]');-- 4. 余弦相似度检索(RAG常用)SELECTid,content,1-(embedding<=>'[0.1,0.2,...]')ASsimilarityFROMdocumentsORDERBYembedding<=>'[0.1,0.2,...]'LIMIT5;-- 5. 创建HNSW索引(加速检索)CREATEINDEXONdocumentsUSINGhnsw(embedding vector_cosine_ops);PostgresML
官网,简称PGML,Rust+JavaScript+HTML开发、开源(GitHub,6.8K Star,364 Fork)插件,把机器学习、LLM、向量能力直接内置在数据库内部,在数据原地做训练、微调、推理,不用把数据导出到单独Python/模型服务、独立向量库。
能力
- 传统表格机器学习:内置47+种分类/回归算法(XGBoost、LightGBM、随机森林、线性模型等),直接用SQL
pgml.train()在库内训练模型、预测,做结构化数据建模。 - HuggingFace深度集成(NLP/LLM):直接在SQL调用HF Hub模型:文本嵌入、情感分析、问答、摘要、翻译、文本生成、LLM微调。
- RAG全链路内置:文本分块(chunk)→生成嵌入→向量检索(底层集成PGVector)→重排→提示词生成,整套RAG都在PG里完成。
- GPU加速:支持NVIDIA CUDA,嵌入和LLM推理GPU加速,官方宣称相比HTTP模型服务,推理速度提升数倍。
- 向量检索:兼容PGVector,可做向量相似度搜索,能直接把业务数据、向量、模型存在同一张库。
架构思想:数据不动,模型计算移动到数据侧
- 传统方案:PG→导出数据→Python/模型服务→向量库→业务服务(多次数据拷贝、延迟、隐私风险)
- PGML:数据、向量、模型全部保存在PG,SQL函数直接触发训练/推理,减少跨服务数据传输,适合RAG、推荐、预测类业务
适合:RAG知识库、数据库内实时预测、中小模型推理、不想维护多个独立AI服务的团队。
不适合:
- 超大模型(70B+)推理、大规模离线分布式训练;
- GPU资源占用高,生产环境要单独评估资源隔离。
对比PGVector
- PGVector:只做向量存储+相似度检索,不包含模型、embedding生成、LLM、表格ML;需要外部服务生成向量
- PGML:完整ML扩展,自带模型加载、embedding、LLM推理、传统机器学习训练,底层可以复用PGVector做向量搜索
实战
-- 加载扩展CREATEEXTENSION pgml;-- 用HF模型生成文本embeddingSELECTpgml.transform('feature-extraction','all-MiniLM-L6-v2','Hello PostgresML');-- 训练表格预测模型SELECTpgml.train(project_name=>'sales_prediction',task=>'regression',relation_name=>'sales_data',y_column_name=>'revenue');Apache AGE
官网,开源(GitHub,4.9K Star, 529 Fork)、C语言实现、PostgreSQL扩展插件,让PG同时具备关系数据库+属性图数据库能力,支持OpenCypher图查询语言,一份存储同时跑SQL和图查询。多模数据库,不需要独立部署一套图数据库,复用PG整套生态(事务、备份、复制、索引、权限)。
A Graph Extension缩写,源自 Bitnine 公司 AgensGraph,2020 进入 Apache 孵化器,2022 毕业成为 Apache 顶级开源项目,
特性
- SQL+OpenCypher混合查询:Cypher语句封装在
cypher()SQL函数内,可以SQL和图查询互相嵌套,关系表数据与图数据联合分析 - 完整 ACID 事务:完全复用PG 存储引擎,图操作同样支持事务、MVCC
- 多图实例:同一个库中可以创建多张独立 Graph 图谱
- 丰富驱动:Python / Go / Java (JDBC) / NodeJS 客户端驱动
- 内置导入工具:agload支持从 CSV 批量导入顶点、边构建图谱
- 支持变长路径遍历、最短路径、模式匹配等图分析能力
实战
-- 1. 开启扩展CREATEEXTENSIONIFNOTEXISTSage;-- 加载 AGE 到当前数据库(AGE 要求显式加载到 search_path)LOAD'age';SETsearch_path=ag_catalog,"$user",public;-- 2. 创建图(Graph)-- 创建一个名为 "social" 的图,用于存放社交关系数据SELECTcreate_graph('social');-- 3. 插入顶点(Vertex)-- 创建人物节点,每个节点带 name 属性SELECT*FROMcypher('social',$$CREATE(a:Person {name:'Alice',age:30}),(b:Person {name:'Bob',age:28}),(c:Person {name:'Carol',age:32}),(d:Person {name:'Dave',age:35})$$)AS(result agtype);-- 4. 插入边(Edge)-- 建立朋友关系:Alice-Bob、Alice-Carol、Bob-Dave、Carol-DaveSELECT*FROMcypher('social',$$MATCH(a:Person {name:'Alice'}),(b:Person {name:'Bob'})CREATE(a)-[:FRIEND_OF {since:2015}]->(b)$$)AS(result agtype);SELECT*FROMcypher('social',$$MATCH(a:Person {name:'Alice'}),(c:Person {name:'Carol'})CREATE(a)-[:FRIEND_OF {since:2018}]->(c)$$)AS(result agtype);SELECT*FROMcypher('social',$$MATCH(b:Person {name:'Bob'}),(d:Person {name:'Dave'})CREATE(b)-[:FRIEND_OF {since:2020}]->(d)$$)AS(result agtype);SELECT*FROMcypher('social',$$MATCH(c:Person {name:'Carol'}),(d:Person {name:'Dave'})CREATE(c)-[:FRIEND_OF {since:2019}]->(d)$$)AS(result agtype);-- 5. 使用 cypher() 执行 OpenCypher 查询-- 5.1 查找 Alice 的所有朋友SELECT*FROMcypher('social',$$MATCH(p:Person {name:'Alice'})-[:FRIEND_OF]->(friend)RETURNfriend.nameASfriend_name $$)AS(friend_name agtype);-- 5.2 查找朋友的朋友(二度关系)SELECT*FROMcypher('social',$$MATCH(p:Person {name:'Alice'})-[:FRIEND_OF]->()-[:FRIEND_OF]->(fof)RETURNDISTINCTfof.nameASfriend_of_friend $$)AS(friend_of_friend agtype);-- 5.3 查找所有人的朋友数量(聚合查询)SELECT*FROMcypher('social',$$MATCH(p:Person)-[:FRIEND_OF]->()RETURNp.nameASname,count(*)ASfriend_countORDERBYfriend_countDESC$$)AS(name agtype,friend_count agtype);-- 6. SQL 与图查询混合使用-- 6.1 图查询结果与关系表 JOIN-- 先建一张普通关系表存储用户注册信息CREATETABLEuser_registration(nametextPRIMARYKEY,registered_atdate);INSERTINTOuser_registrationVALUES('Alice','2020-01-15'),('Bob','2020-03-22'),('Carol','2021-06-10'),('Dave','2019-11-30');-- 混合查询:从图中找出 Alice 的朋友,再 JOIN 关系表获取其注册时间SELECTf.friend_name,u.registered_atFROMcypher('social',$$MATCH(p:Person {name:'Alice'})-[:FRIEND_OF]->(friend)RETURNfriend.nameASfriend_name $$)ASf(friend_name agtype)JOINuser_registration uONu.name=f.friend_name::text;-- 6.2 在 SQL 中直接过滤图查询结果-- 找出所有年龄大于 30 的人,并统计其朋友数量SELECT*FROMcypher('social',$$MATCH(p:Person)-[:FRIEND_OF]->()WHEREp.age>30RETURNp.nameASname,count(*)ASfriend_count $$)AS(name agtype,friend_count agtype);Arrow Flight SQL adapter for PG
官网,Apache Arrow官方开源(GitHub,116 Star,10 Fork)PG扩展,给PG原生增加一套Arrow Flight SQL(gRPC)服务端点,不是代理程序,是数据库内运行的插件。
在 PG 服务端直接把查询结果组装成 Arrow RecordBatch(列存),通过 gRPC (Flight) 流式返回给客户端;客户端直接拿到列存内存结构,省去行→列转换开销,适合大数据导出、ETL、分析读取。
| 方案 | 实现位置 | 说明 |
|---|---|---|
| arrow‑flight‑sql‑postgresql | PG内置bgworker扩展 | 直接SPI执行SQL,服务端生成Arrow,性能最优;需要PG≥15 |
| 独立Flight‑SQL代理服务(外部程序) | 数据库外部 | 通过libpq/jdbc访问PG,多一层转换,无需改PG,性能弱于内置扩展 |
| JDBC+Arrow JDBC适配器 | 客户端 | PG返回行,客户端转Arrow;大量数据CPU开销高 |
| pg_copy导出parquet | PG服务端导出文件 | 需要落盘,无法流式直接给应用内存 |