RDS PostgreSQL現推出AI外掛程式rds_ai,整合了阿里雲百鍊的先進模型,包括千問、通用文本向量等。通過該外掛程式,您可以在RDS PostgreSQL資料庫中輕鬆實現包括大模型問答、文本向量轉換、Top N相似向量檢索以及RAG問答等多種應用情境。此外,rds_ai還支援自訂模型,您可以靈活添加所需模型,以在RDS PostgreSQL中實現豐富多樣的AI應用。
前提條件
網路設定
RDS PostgreSQL資料庫預設不具備訪問外部網路的能力。因此,需要通過為RDS PostgreSQL執行個體所屬的VPC配置NAT Gateway,使其允許訪問外部模型。NAT Gateway相關資訊,請參見使用公網NAT GatewaySNAT功能訪問互連網。
建立和刪除外掛程式
在安裝外掛程式之前,請確認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日誌堆積和哪些參數有關']);
增加FCFunction ComputeRAG模型
-
部署Function Compute的AgentCraft應用。詳情請參見雲端部署AgentCraft。
-
已建立了智能體,並建立了用戶端接入。
以將智能體接入DingTalk機器人為例,已在建立用戶端接入時,擷取並儲存了服務地址和Token。
-
新增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。 -
配置FCFunction ComputeRAG模型的Token。
SELECT rds_ai.update_model('fc-rag', 'token','8UiGAziWgYGPxM3qR5sAChBfDJRt****');
驗證新增的FCFunction ComputeRAG模型。例如:
SELECT rds_ai.invoke_model('fc-rag', ARRAY['wal日誌堆積和哪些參數有關']);