☰
PostgreSQL插件(一):PGVector、PostgresML、Apache AGE
2026/10/2 2:28:16 网站建设 项目流程

概述

最强大的开源关系型数据库,大概率就是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、随机森林、线性模型等),直接用SQLpgml.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‑postgresqlPG内置bgworker扩展直接SPI执行SQL,服务端生成Arrow,性能最优;需要PG≥15
独立Flight‑SQL代理服务(外部程序)数据库外部通过libpq/jdbc访问PG,多一层转换,无需改PG,性能弱于内置扩展
JDBC+Arrow JDBC适配器客户端PG返回行,客户端转Arrow;大量数据CPU开销高
pg_copy导出parquetPG服务端导出文件需要落盘,无法流式直接给应用内存

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询