全部產品
Search
文件中心

ApsaraDB RDS:AI(rds_ai)

更新時間:Jun 14, 2025

RDS PostgreSQL現推出AI外掛程式rds_ai,整合了阿里雲百鍊的先進模型,包括通義千問、通用文本向量等。通過該外掛程式,您可以在RDS PostgreSQL資料庫中輕鬆實現包括大模型問答、文本向量轉換、Top N相似向量檢索以及RAG問答等多種應用情境。此外,rds_ai還支援自訂模型,您可以靈活添加所需模型,以在RDS PostgreSQL中實現豐富多樣的AI應用。

前提條件

  • 執行個體版本滿足以下要求:

    執行個體大版本

    核心小版本

    PostgreSQL16

    20241230及以上

    PostgreSQL 14、15、17

    20250430或以上

    如需升級核心小版本,請參見升級核心小版本

  • 已建立RDS PostgreSQL高許可權帳號,如何建立高許可權帳號請參見建立帳號

  • 本文使用的模型為阿里雲百鍊提供,請先前往阿里雲百鍊開通服務,並擷取API-KEY。具體操作,請參見擷取API Key

網路設定

RDS PostgreSQL資料庫預設不具備訪問外部網路的能力。因此,需要通過為RDS PostgreSQL執行個體所屬的VPC配置NAT Gateway,使其允許訪問外部模型。NAT Gateway相關資訊,請參見使用公網NAT GatewaySNAT功能訪問互連網

建立和刪除外掛程式

重要

在安裝外掛程式之前,請確認RDS PostgreSQL執行個體的大版本和核心小版本,以確保其支援該外掛程式的安裝。詳情請參見本文的前提條件

  • 外掛程式管理頁面安裝外掛程式。

    1. 訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。

    2. 在左側導覽列單擊外掛程式管理

    3. 外掛程式市場頁面,單擊rds_ai外掛程式的安裝

    4. 在彈出的視窗中選擇目標資料庫和帳號後,單擊安裝,將外掛程式安裝至目標資料庫。

    (可選)在管理外掛程式頁面的已安裝外掛程式頁簽,可以卸載已安裝的外掛程式。

  • 通過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

  • qwen-plus(預設值)

  • qwen-max

  • qwen-turbo

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. 執行以下命令,配置預設模型的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'); 
  3. 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外掛程式預設的大模型問答模型為通義千問-文本產生

  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;

檢索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.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下,無需通過公網鏈路,從而確保安全性。

  1. 在PAI的EAS中部署RAG服務。詳情請參見通過PAI的EAS和RDS 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日誌堆積和哪些參數有關']);

增加FCFunction ComputeRAG模型

  1. 部署Function Compute的AgentCraft應用。詳情請參見雲端部署AgentCraft

  2. 已建立了智能體,並建立了用戶端接入

    將智能體接入DingTalk機器人為例,已在建立用戶端接入時,擷取並儲存了服務地址和Token。

  3. 新增FCFunction ComputeRAG模型。

    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. 配置FCFunction ComputeRAG模型的Token。

    SELECT rds_ai.update_model('fc-rag', 'token','8UiGAziWgYGPxM3qR5sAChBfDJRt****');

驗證新增的FCFunction ComputeRAG模型。例如:

SELECT rds_ai.invoke_model('fc-rag', ARRAY['wal日誌堆積和哪些參數有關']);

提供的函數

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.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-intl.aliyuncs.com/api/v1/services/embeddings/text-embedding/text-embedding'

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.update_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-intl.aliyuncs.com/api/v1/services/embeddings/text-embedding/text-embedding'