AI(rds_ai)

RDS PostgreSQL现推出AI插件rds_ai,集成了阿里云百炼的先进模型,包括通义千问、通用文本向量和通用文本排序等。通过该插件,您可以在RDS PostgreSQL数据库中轻松实现包括大模型问答、文本向量转换、文本排序、Top N相似向量检索以及RAG问答等多种应用场景。此外,rds_ai还支持自定义模型,您可以灵活添加所需模型,以在RDS PostgreSQL中实现丰富多样的AI应用。

您可以加入RDS PostgreSQL插件交流钉钉群(103525002795),进行咨询、交流和反馈,获取更多关于插件的信息。

前提条件

  • 实例大版本为RDS PostgreSQL 16。

  • 实例内核小版本为20241230及以上。

    如需升级内核小版本,请参见升级内核小版本

  • 已创建RDS PostgreSQL高权限账号,如何创建高权限账号请参见创建账号

  • 本文使用的模型为阿里云大模型服务平台百炼提供,请先前往百炼开通服务,并获取API-KEY。具体操作,请参见获取API Key

网络配置

RDS PostgreSQL数据库默认不具备访问外部网络的能力。因此,需要通过私网连接(PrivateLink)建立专有网络VPC与阿里云百炼平台之间的网络连接,或为RDS PostgreSQL实例所属的VPC配置NAT网关,以便允许其访问外部模型。

  • 通过私网连接

    通过私网访问阿里云百炼平台可以提高数据传输的安全性及传输效率。您可以通过私网连接(PrivateLink)建立专有网络 VPC与阿里云百炼平台之间的网络连接。详细操作请参见通过终端节点私网访问阿里云百炼平台

  • 通过公网连接

    通过为RDS PostgreSQL实例所属的VPC配置NAT网关,使其允许访问外部模型。NAT网关相关信息,请参见使用公网NAT网关SNAT功能访问互联网

创建和删除插件

  • 插件管理页面安装插件。

    1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。

    2. 在左侧导航栏单击插件管理

    3. 插件市场页面,单击rds_ai插件的安装

    4. 在弹出的窗口中选择目标数据库和账号后,单击安装,将插件安装至目标数据库。

    (可选)在管理插件页面的已安装插件页签,可以卸载已安装的插件。

  • 通过SQL命令安装插件

    创建插件

    CREATE EXTENSION IF NOT EXISTS rds_ai CASCADE;
    说明

    删除插件

    DROP EXTENSION rds_ai;

默认模型

rds_ai插件默认支持如下模型。您还可以根据实际需求自定义模型

接口类型

参数

参数类型

默认模型

prompt接口

rds_ai.default_prompt_model

enum

  • qwen-plus(默认值)

  • qwen-max

  • qwen-turbo

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插件默认的模型可以提供如下能力:

基础设置

  1. 使用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;
  2. 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');
  3. (可选)如果通过私网连接(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插件默认的大模型问答模型为通义千问-文本生成

  1. (可选)设置大模型问答默认的大模型。在未进行配置时,系统将默认使用qwen-plus模型。

    说明

    如果需要修改默认模型,须将rds_ai添加到shared_preload_libraries运行参数值中。配置参数的详情操作请参见设置实例参数。例如,将运行参数值改为'pg_stat_statements,auto_explain,rds_ai'

    SET rds_ai.default_prompt_model TO "qwen-max" ;
  2. 使用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列表
    );

将向量转换结果存储到目标表中。

  1. 创建表test_embed。

    CREATE TABLE test_embed(a text, b vector(1024), c sparsevec(250002));
  2. 插入需要转换的文本内容。

    INSERT INTO test_embed (a) values ('hello world');
  3. 使用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模型进行相似向量检索。例如:

  1. 创建测试表。

    --创建测试表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;
  2. 创建向量索引。

    说明

    创建向量索引时需选择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);
  3. 使用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-EASRDS PG实例部署在同一VPC内,在rds_ai插件中配置PAIVPC地址。同时,PAI-EAS的连接地址也应采用RDS PGVPC地址。这样,整个通信网络均位于用户的VPC下,无需通过公网链路,从而确保安全性。

  1. PAIEAS中部署RAG服务。详情请参见通过PAIEASRDS PostgreSQL部署大模型RAG对话系统

  2. 获取RAG服务的调用信息。

    1. 单击RAG服务名称,进入服务详情页面。

    2. 基本信息区域,单击查看调用信息

    3. 调用信息对话框中,获取服务访问地址和Token。

  3. 新增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模型

  4. 配置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模型

  1. 部署函数计算的AgentCraft应用。详情请参见云端部署AgentCraft

  2. 已创建了智能体,并创建了客户端接入

    将智能体接入钉钉机器人为例,已在创建客户端接入时,获取并保存了服务地址和Token。

  3. 新增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

  4. 配置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模型

  1. 获取text-embedding-v2模型的URL地址,默认为:https://dashscope.aliyuncs.com/api/v1/services/embeddings/text-embedding/text-embedding。

  2. text-embedding-v2模型为阿里云大模型服务平台百炼提供,请先前往百炼开通服务,并获取API-KEY。具体操作,请参见获取API Key

  3. 新增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

  4. 配置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字段中,无需用户设置
);

提供的函数

rds-ai.raw_invoke_model:进行自定义模型的调用,以返回完整的HTTP响应(http_response)。

rds-ai.raw_invoke_model(
    model_name TEXT, 
    params_list TEXT[]
) 
RETURNS http.http_response

参数

类型

说明

示例

model_name

text

调用的模型名称。

'qwen-plus'

param_list

text[]

按顺序填入模型对应content_template字段的内容。

ARRAY['who are you', '{}']

rds-ai.invoke_model:进行自定义模型的调用,并根据元数据表中配置的json_path字段,解析HTTP返回的内容,并返回相应的结果。

rds-ai.invoke_model(
    model_name TEXT, 
    params_list TEXT[]
) 
RETURNS http.http_response

参数

类型

说明

示例

model_name

text

调用的模型名称。

'qwen-plus'

param_list

text[]

按顺序填入模型对应content_template字段的内容。

ARRAY['who are you', '{}']

rds_ai.embed:使用指定模型进行一次文本转向量,并根据json_path返回结果。

rds_ai.embed(
    model_name TEXT, 
    content TEXT, 
    args jsonb DEFAULT '{}' 
) RETURNS text

参数

类型

说明

示例

model_name

text

调用的模型名称。

说明

未传入model_name参数值时,将调用默认模型(text-embedding-v3)。

'text-embedding-v3'

content

text

需要转向量的文本。

'who are you'

args

jsonb

调用模型时指定的参数。

'{"output_type": "dense"}'

rds_ai.prompt:使用指定模型执行一次提示(prompt)操作。

rds_ai.prompt(
    model_name TEXT, 
    content TEXT, 
    args jsonb DEFAULT '{}'
) 
RETURNS text

参数

类型

说明

示例

model_name

text

调用的模型名称。

说明

未传入model_name参数值时,将调用默认模型(qwen-plus)。

'qwen-plus'

content

text

需要转向量的文本。

'who are you'

args

jsonb

调用模型时指定的参数。

'{"top_p": 0.2}'

rds_ai.rank:使用指定模型进行文本排序。

rds_ai.rank(
    query TEXT, 
    document TEXT[], 
    args jsonb DEFAULT '{}' 
) 
RETURNS TABLE(score_value float8, text_value TEXT);

参数

类型

说明

示例

query

text

文本排序的问题。

'who are you'

document

text[]

待排序的文本内容。

ARRAY['foo', 'bar']

args

jsonb

调用模型时指定的参数。

'{}'

rds_ai.retrieve:使用指定模型对指定文本进行向量检索,以检索存储的向量。

rds_ai.retrieve(
    model_name TEXT, 
    question TEXT, 
    source_schema TEXT, 
    source_table TEXT, 
    chunk_col TEXT, 
    vector_col TEXT, 
    topn INT DEFAULT 10, 
    embed_args jsonb DEFAULT '{}', 
    distance_type TEXT DEFAULT 'L2'
) 
RETURNS TABLE(chunk TEXT, distance float);

参数

类型

说明

示例

model_name

text

调用的模型名称。

说明

未传入model_name参数值时,将调用默认模型(text-embedding-v3)。

'text-embedding-v3'

question

text

需要召回的文本。

'who are you'

source_schema

text

需要检索向量的表所在的schema。

'public'

source_table

text

需要检索向量的表名。

'vec_tbl'

chunk_col

text

检索向量的chunk列。

'chunk'

vector_col

text

表的向量列。

'vec'

topn

int

指定向量检索的Top N,默认为10。

20

embed_args

jsonb

指定文本转向量时的参数,与rds_ai.embed函数的args相同。

'{"output_type": "dense"}'

distance_type

text

向量距离计算的方法,默认为L2。

'L1'

rds_ai.rag:使用指定模型对向量检索结果执行一次提示(prompt)操作。

rds_ai.rag(
    embed_model TEXT,
    prompt_model TEXT,
    question TEXT,
    source_schema TEXT,
    source_table TEXT,
    chunk_col TEXT,
    vector_col TEXT,
    topn INT DEFAULT 10,
    embed_args jsonb DEFAULT '{}',
    prompt_args jsonb DEFAULT '{}',
    distance_type TEXT DEFAULT 'L2'
) 
returns text

参数

类型

说明

示例

embed_model

text

调用的模型名称。

说明

未传入model_name参数值时,将调用默认模型(qwen-plus)。

'qwen-plus'

question

text

需要召回的文本。

'who are you'

source_schema

text

需要检索向量的表所在的schema。

'public'

source_table

text

需要检索向量的表名。

'vec_tbl'

chunk_col

text

检索向量的chunk列。

'chunk'

vector_col

text

表的向量列。

'vec'

topn

int

指定向量检索的Top N,默认为10。

20

embed_args

jsonb

指定文本转向量时的参数,与rds_ai.embed函数的args相同。

'{"output_type": "dense"}'

prompt_args

jsonb

执行提示(prompt)时的参数,与rds_ai.prompt函数的args相同。

'{"top_p": 0.2}'

distance_type

text

向量距离计算的方法,默认为L2。

'L1'

rds_ai.show_models:查看已配置的模型信息。

rds_ai.show_models() 
RETURNS setof rds_ai.model_list

rds_ai.del_model:删除指定模型信息。

rds_ai.del_model (model_name text) 
RETURNS void

参数

类型

说明

示例

model_name

text

需要删除的模型名称。

'qwen-plus'

rds_ai.add_model:添加一个模型。

rds_ai.add_model(
    model_name TEXT,
    request_type TEXT,
    request_header http.http_header[],
    uri TEXT,
    content_type TEXT,
    content_template TEXT,
    json_path TEXT
) 
RETURNS TEXT

参数

类型

说明

示例

model_name

TEXT

需要添加的模型名。

'text-embedding-v3'

request_type,

TEXT

请求类型。

'POST'

request_header

http.http_header[]

HTTP请求中的Header信息。在调用时,请使用token字段填充相应的占位符。

ARRAY[('Authorization', 'Bearer %s')]

uri

TEXT

模型的URL地址。

'https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation'

content_type

TEXT

请求类型。

'application/json'

content_template

TEXT

调用请求Body模板,调用rds-ai.invoke_model函数,使用param_list参数值填充这个模板,其中parameters参数的值为JSON类型。

'{

"model": "text-embedding-v3",

"input": {"texts": ["%s"]},

"parameters": %s

}'

json_path

TEXT

解析路径,调用rds-ai.invoke_model函数时,需解析content_template中的JSON结构的SQL。

当您不确定具体的解析路径时,可以配置为 'SELECT %L'。如果已确认具体的解析路径,请用确认的解析路径进行替代。

'SELECT %L'

rds_ai.update_model:更新已配置模型的信息。

rds_ai.add_model(
    model_name TEXT,
    config_name TEXT, 
    value TEXT
) 
RETURNS void

参数

类型

说明

示例

model_name

TEXT

需要更新的模型名称。

'text-embedding-v3'

config_name

TEXT

需要更新的字段。取值参见rds_ai.add_model函数。

'uri'

value

TEXT

需要更新字段的值。

'https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation'