RDS PostgreSQL现推出AI插件rds_ai,集成了阿里云百炼的先进模型,包括千问、通用文本向量等。通过该插件,您可以在RDS PostgreSQL数据库中轻松实现包括大模型问答、文本向量转换、Top N相似向量检索以及RAG问答等多种应用场景。此外,rds_ai还支持自定义模型,您可以灵活添加所需模型,以在RDS PostgreSQL中实现丰富多样的AI应用。
前提条件
网络配置
RDS PostgreSQL数据库默认不具备访问外部网络的能力。因此,需要通过为RDS PostgreSQL实例所属的VPC配置NAT网关,使其允许访问外部模型。NAT网关相关信息,请参见使用公网NAT网关SNAT功能访问互联网。
创建和删除插件
在安装插件之前,请确认RDS PostgreSQL实例的大版本和内核小版本,以确保其支持该插件的安装。详情请参见本文的前提条件。
-
在插件管理页面安装插件。
-
访问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 |
|
|
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; -
执行以下命令,配置默认模型的URL地址。
--qwen-plus模型 SELECT rds_ai.update_model('qwen-plus', 'uri', 'https://dashscope-intl.aliyuncs.com/api/v1/services/aigc/text-generation/generation'); --qwen-max模型 SELECT rds_ai.update_model('qwen-max', 'uri', 'https://dashscope-intl.aliyuncs.com/api/v1/services/aigc/text-generation/generation'); --qwen-turbo模型 SELECT rds_ai.update_model('qwen-turbo', 'uri', 'https://dashscope-intl.aliyuncs.com/api/v1/services/aigc/text-generation/generation'); --text-embedding-v3模型 SELECT rds_ai.update_model('text-embedding-v3', 'uri', 'https://dashscope-intl.aliyuncs.com/api/v1/services/embeddings/text-embedding/text-embedding'); -
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');
大模型问答
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;
-
检索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.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日志堆积和哪些参数有关']);