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日誌堆積和哪些參數有關']);