RDS PostgreSQL现推出AI插件rds_ai,集成了阿里云百炼的先进模型,包括通义千问、通用文本向量和通用文本排序等。通过该插件,您可以在RDS PostgreSQL数据库中轻松实现包括大模型问答、文本向量转换、文本排序、Top N相似向量检索以及RAG问答等多种应用场景。此外,rds_ai还支持自定义模型,您可以灵活添加所需模型,以在RDS PostgreSQL中实现丰富多样的AI应用。
您可以加入RDS PostgreSQL插件交流钉钉群(103525002795),进行咨询、交流和反馈,获取更多关于插件的信息。
前提条件
网络配置
RDS PostgreSQL数据库默认不具备访问外部网络的能力。因此,需要通过私网连接(PrivateLink)建立专有网络VPC与阿里云百炼平台之间的网络连接,或为RDS PostgreSQL实例所属的VPC配置NAT网关,以便允许其访问外部模型。
通过私网连接
通过私网访问阿里云百炼平台可以提高数据传输的安全性及传输效率。您可以通过私网连接(PrivateLink)建立专有网络 VPC与阿里云百炼平台之间的网络连接。详细操作请参见通过终端节点私网访问阿里云百炼平台。
通过公网连接
通过为RDS PostgreSQL实例所属的VPC配置NAT网关,使其允许访问外部模型。NAT网关相关信息,请参见使用公网NAT网关SNAT功能访问互联网。
创建和删除插件
在插件管理页面安装插件。
访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
在左侧导航栏单击插件管理。
插件市场页面,单击rds_ai插件的安装。
在弹出的窗口中选择目标数据库和账号后,单击安装,将插件安装至目标数据库。
(可选)在管理插件页面的已安装插件页签,可以卸载已安装的插件。
通过SQL命令安装插件
创建插件
CREATE EXTENSION IF NOT EXISTS rds_ai CASCADE;
说明仅高权限账号可以执行此命令。如何创建高权限账号请参见创建账号。
创建rds_ai插件时,将同步创建插件高维向量相似度搜索(pgvector)和pgsql-http。
您可以执行
SELECT * FROM pg_extension;
查看已安装的插件。
删除插件
DROP EXTENSION rds_ai;
默认模型
rds_ai插件默认支持如下模型。您还可以根据实际需求自定义模型。
接口类型 | 参数 | 参数类型 | 默认模型 |
prompt接口 | rds_ai.default_prompt_model | enum |
|
rank接口 | rds_ai.default_rerank_model | enum | gte-rerank |
embed接口 | rds_ai.default_embed_model | enum | text-embedding-v3 |
如果需要修改默认模型,须将rds_ai添加到shared_preload_libraries的运行参数值中。配置参数的详情操作请参见设置实例参数。例如,将运行参数值改为'pg_stat_statements,auto_explain,rds_ai'
。
rds_ai插件默认的模型可以提供如下能力:
基础设置
使用rds_ai调用大模型前,必须配置对应的API-KEY。
-- 为目标模型设置api_key SELECT rds_ai.update_model('qwen-plus', 'token', 'sk-****'); -- 为rds_ai.model_list中所有的模型设置api key SELECT rds_ai.update_model(model_name,'token','sk-****') FROM rds_ai.model_list;
rds_ai对模型的远程调用是基于pgsql-http插件实现的,支持以下超时设置,以中断长时间执行的调用。
-- 设置请求的超时时间,单位毫秒 SET http.timeout_msec TO 200000; SELECT http.http_set_curlopt('CURLOPT_TIMEOUT', '200000'); -- 设置连接超时时间 SELECT http.http_set_curlopt('CURLOPT_CONNECTTIMEOUT_MS', '200000');
(可选)如果通过私网连接(PrivateLink)建立RDS PostgreSQL专有网络 VPC与阿里云百炼平台之间的网络连接,则需要执行如下命令,更新目标模型的URL地址。
SELECT rds_ai.update_model('qwen-plus', 'uri', '<通过私网连接后的URL地址>');
通过私网连接(PrivateLink)建立RDS PostgreSQL专有网络 VPC与阿里云百炼平台之间的网络连接后,模型URL地址请参见步骤二:通过终端节点私网访问阿里云百炼平台。例如,当VPC地域为华北2(北京)时,将
https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation
中公网域名dashscope.aliyuncs.com
替换为已经获取到的自定义服务域名vpc-cn-beijing.dashscope.aliyuncs.com
。当需要更新多个模型的URL地址时,SQL示例如下:
SELECT rds_ai.update_model( model_name, 'uri', 'https://vpc-cn-beijing.dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation' ) FROM rds_ai.model_list WHERE model_name IN ('qwen-max', 'qwen-turbo', 'qwen-plus');
大模型问答
rds_ai插件默认的大模型问答模型为通义千问-文本生成。
(可选)设置大模型问答默认的大模型。在未进行配置时,系统将默认使用qwen-plus模型。
说明如果需要修改默认模型,须将rds_ai添加到shared_preload_libraries的运行参数值中。配置参数的详情操作请参见设置实例参数。例如,将运行参数值改为
'pg_stat_statements,auto_explain,rds_ai'
。SET rds_ai.default_prompt_model TO "qwen-max" ;
使用rds_ai.prompt调用默认的大语言模型进行问答。例如:
SELECT rds_ai.prompt('用萝卜、土豆、茄子做饭,给我个菜谱。');
完整接口调用:
SELECT rds_ai.prompt( model_name=>'qwen-plus', -- 模型名 content=>'用萝卜、土豆、茄子做饭,给我个菜谱。', -- 问题 args=>'{"top_p": 0.7}'::jsonb -- 调用大模型的参数 );
文本转向量
rds_ai插件默认的文本转向量模型为text-embedding-v3。
默认输出稠密向量(dense vector)。
SELECT rds_ai.embed( '风急天高猿啸哀,渚清沙白鸟飞回,无边落木萧萧下,不尽长江滚滚来' -- 需要转成向量的文本 );
指定输出稀疏向量(sparse vector)。
-- 文本转离散向量 ,默认250002维 SELECT rds_ai.embed( content=>'风急天高猿啸哀,渚清沙白鸟飞回,无边落木萧萧下,不尽长江滚滚来', args=>'{"output_type": "sparse"}'::jsonb -- parameter列表 );
将向量转换结果存储到目标表中。
创建表test_embed。
CREATE TABLE test_embed(a text, b vector(1024), c sparsevec(250002));
插入需要转换的文本内容。
INSERT INTO test_embed (a) values ('hello world');
使用rds_ai.embed调用text-embedding-v3模型,将转换结果写入到表test_embed中。
写入稠密向量(dense vector)
UPDATE test_embed SET b = rds_ai.embed(a, '{"output_type": "dense"}'::jsonb)::vector;
写入稀疏向量(sparse vector)
UPDATE test_embed SET c = rds_ai.embed(a, '{"output_type": "sparse"}'::jsonb)::sparsevec;
文本排序
rds_ai插件默认的文本排序模型为gte-rerank。
使用rds_ai.rank调用gte-rerank模型进行排序。
-- 调用默认文本排序模型gte-rerank
SELECT * FROM rds_ai.rank
(
'什么是文本排序模型', -- 查询问题
ARRAY[
'文本排序模型广泛用于搜索引擎和推荐系统中,它们根据文本相关性对候选文本进行排序',
'量子计算是计算科学的一个前沿领域',
'预训练语言模型的发展给文本排序模型带来了新的进展'
]
);
完整的接口调用:
SELECT * FROM rds_ai.rank
(
query=>'who are you',
document=>ARRAY['a','b','c'],
args=>'{"top_n":2}'::jsonb
);
检索Top N相似向量
rds_ai插件默认使用text-embedding-v3模型进行相似向量检索。例如:
创建测试表。
--创建测试表test_rag CREATE TABLE test_rag ( id SERIAL PRIMARY KEY, chunk TEXT ); --新增embedding列存储chunk转成的向量 ALTER TABLE test_rag ADD COLUMN embedding VECTOR(1024); UPDATE test_rag SET embedding=rds_ai.embed(chunk)::vector;
创建向量索引。
说明创建向量索引时需选择vector_cosine_ops类型。
--创建hnsw索引 CREATE INDEX ON test_rag USING hnsw (embedding vector_cosine_ops); --创建ivfflat索引 CREATE INDEX ON test_rag USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
使用rds_ai.retrieve调用text-embedding-v3模型在测试表中进行向量检索。
SELECT * FROM rds_ai.retrieve ('为什么说postgres是最先进的开源数据库', 'public', 'test_rag', 'chunk', 'embedding');
完整的接口调用:
SELECT * FROM rds_ai.retrieve ( embed_model=>'text-embedding-v3', -- 使用的向量模型 question=>'为什么postgres是最先进的开源数据库', source_schema=>'public', -- 进行相似向量查找的表所在的schema source_table=>'test_rag', -- 进行相似向量查找的表 chunk_col=>'chunk', -- chunk 列 vector_col=>'embedding', -- 向量列 -- 以下为缺省参数 topn=>10, -- 设置top_n embed_args=>'{}'::jsonb, -- 文本转向量模型的parameter传入 distance_type=>'cosine' -- 距离算法,支持L1,L2,cosine,negative );
RAG问答
rds_ai插件默认使用text-embedding-v3模型和通义千问-文本生成模型进行RAG问答。
-- 向量模型: text-embedding-v3, 文本生成模型:由rds_ai.default_prompt_model参数指定
SELECT * FROM rds_ai.rag
('为什么postgres是最先进的开源数据库',
'public', 'test_rag', 'chunk', 'embedding');
完整的接口调用:
SELECT * FROM rds_ai.rag
(
embed_model=>'text-embedding-v3', -- 使用的向量模型
prompt_model=>'qwen-plus', -- 使用的prompt模型
question=>'为什么postgres是最先进的开源数据库',
source_schema=>'public', -- 进行相似向量查找的表所在的schema
source_table=>'test_rag', -- 进行相似向量查找的表
chunk_col=>'chunk', -- chunk 列
vector_col=>'embedding', -- 向量列
-- 以下为缺省参数
topn=>10,
embed_args=>'{}'::jsonb, --文本转向量模型参数
prompt_args=>'{}'::jsonb, --大语言模型prompt参数
distance_type=>'L2' -- 距离算法,支持L1,L2,cosine,inner product
);
自定义模型
添加自定义模型时,如遇到任何问题,请及时联系我们。
使用元数据表rds_ai.model_list新增自定义的模型。元数据表rds_ai.model_list字段如下:
字段 | 类型 | 说明 |
model_name | name | 主键约束,模型名称。 |
request_type | text | 调用的HTTP类型。 |
request_header | http.http_header[] | pgsql-http插件提供的类型,记录HTTP请求中Header的信息(主要是鉴权的信息)。 |
uri | text | 模型的URL地址。 |
content_type | text | 请求类型,例如application/json。 |
content_template | text | 请求Body的模板,一般会有占位符,在接口调用时填入。 |
json_path | text | 基于http_response解析SQL,并提取需要的内容。 |
token | text | Header中的密钥。 |
添加自定义模型
SELECT rds_ai.add_model(
'test-model', -- 模型名称
'POST', -- http请求类型
ARRAY[('Authorization', 'Bearer %s')]::http.http_header[], -- http_header
'https://****.com', -- 请求的URL
'application/json', -- 请求的Content-type
'{"key":"%s"}', -- 请求的request_body模板
'SELECT %L' -- 解析http请求的结果
);
使用自定义模型
使用rds_ai.raw_invoke_model函数,根据qwen-plus模型的配置进行请求。通过使用ARRAY填充调用模板,返回完整的HTTP请求结果。
SELECT * FROM rds_ai.raw_invoke_model('qwen-plus', ARRAY['who are you']);
使用rds_ai.raw_invoke_model函数,根据qwen-plus模型的配置进行请求,并依据配置中的
json_path
字段提取所需字段。SELECT * FROM rds_ai.invoke_model('qwen-plus', ARRAY['who are you']);
删除自定义模型
SELECT rds_ai.del_model('test-model');
增加PAI-RAG模型
建议将PAI-EAS与RDS PG实例部署在同一VPC内,在rds_ai插件中配置PAI的VPC地址。同时,PAI-EAS的连接地址也应采用RDS PG的VPC地址。这样,整个通信网络均位于用户的VPC下,无需通过公网链路,从而确保安全性。
在PAI的EAS中部署RAG服务。详情请参见通过PAI的EAS和RDS PostgreSQL部署大模型RAG对话系统。
获取RAG服务的调用信息。
单击RAG服务名称,进入服务详情页面。
在基本信息区域,单击查看调用信息。
在调用信息对话框中,获取服务访问地址和Token。
新增PAI-RAG模型。
SELECT rds_ai.add_model( 'pai-rag', -- 模型名 'POST', -- 请求方式 ARRAY[('Authorization','%s')]::http.http_header[], -- 请求头, 'http://rds-pai-rag-demo.****.cn-hangzhou.pai-eas.aliyuncs.com/service/query', -- 请求URL 'application/json', -- 请求内容格式 '{ "question": "%s" }', -- 请求体 'SELECT (%L::jsonb->''answer'')::text' -- 解析路径 );
说明模型的URL地址请使用实际地址替换,并在后面增加
/service/query
。更多PAI-RAG模型的调用信息请参见通过API调用PAI模型。
配置PAI-RAG模型的Token。
SELECT rds_ai.update_model('pai-rag', 'token','MTFkYjMwZjgzYzA1YmE2N2YyNWMxM2NkNDVjMjEzNjYxMDAzMzE5****');
验证新增的PAI-RAG模型。例如:
SELECT rds_ai.invoke_model('pai-rag', ARRAY['wal日志堆积和哪些参数有关']);
增加FC函数计算RAG模型
部署函数计算的AgentCraft应用。详情请参见云端部署AgentCraft。
已创建了智能体,并创建了客户端接入。
以将智能体接入钉钉机器人为例,已在创建客户端接入时,获取并保存了服务地址和Token。
新增FC函数计算RAG模型。
SELECT rds_ai.add_model( 'fc-rag', -- 模型名 'POST', -- 请求方式 ARRAY[('Authorization','Bearer %s')]::http.http_header[], -- 请求头, 'https://agentcrckend-de-obnhjsknam.cn-hangzhou.fcapp.run/v1/chat/completions', -- 请求URL 'application/json', -- 请求内容格式 '{ "messages":[ { "role": "user", "content": "%s" } ], "stream": false, "max_tokens": 1024 }', 'SELECT (%L::jsonb->''choices''->0->''message''->>''content'')::text' -- 解析路径 );
说明模型的URL地址请使用实际地址替换,并在后面增加
/completions
。配置FC函数计算RAG模型的Token。
SELECT rds_ai.update_model('fc-rag', 'token','8UiGAziWgYGPxM3qR5sAChBfDJRt****');
验证新增的FC函数计算RAG模型。例如:
SELECT rds_ai.invoke_model('fc-rag', ARRAY['wal日志堆积和哪些参数有关']);
增加text-embedding-v2模型
获取text-embedding-v2模型的URL地址,默认为:https://dashscope.aliyuncs.com/api/v1/services/embeddings/text-embedding/text-embedding。
text-embedding-v2模型为阿里云大模型服务平台百炼提供,请先前往百炼开通服务,并获取API-KEY。具体操作,请参见获取API Key。
新增text-embedding-v2模型。
SELECT rds_ai.add_model( 'text-embedding-v2-self', -- 模型名 'POST', -- 请求方式 ARRAY[('Authorization','Bearer %s')]::http.http_header[], 'https://dashscope.aliyuncs.com/api/v1/services/embeddings/text-embedding/text-embedding', -- 请求URL 'application/json', -- 请求内容格式 '{ "model": "text-embedding-v2", "input": {"texts": ["%s"]}, "parameters": %s }', -- 请求体 'SELECT %L::jsonb' -- 解析路径 );
说明更多text-embedding-v2模型的调用信息请参见Embedding。
配置API-KEY。
SELECT rds_ai.update_model('text-embedding-v2-self', 'token','sk-1a19fe7d73c240cca2192473e8a5****');
验证新增的text-embedding-v2模型。例如:
SELECT rds_ai.invoke_model(
'text-embedding-v2-self', -- 自定义模型名
ARRAY['风急天高猿啸哀','{"text_type":"query"}'] -- 数组类型,依次按顺序替换自定义模型中的 %s 占位符,token会自动填充到head字段中,无需用户设置
);