ApsaraDB RDS for PostgreSQL は、rds_ai AI 拡張機能を提供します。この拡張機能は、Qwen、テキスト埋め込み、など、Alibaba Cloud Model Studio の高度なモデルを統合します。この拡張機能を使用して、大規模言語モデル (LLM) Q&A、テキストからベクターへの変換、上位 N 件の類似ベクター検索、検索拡張生成 (RAG) Q&A など、ApsaraDB RDS for PostgreSQL データベースでさまざまなシナリオを実装できます。さらに、rds_ai はカスタムモデルをサポートしており、必要なモデルを追加して ApsaraDB RDS for PostgreSQL で幅広い AI アプリケーションを実装できます。
前提条件
ご利用のインスタンスが次のバージョン要件を満たしていること:
メジャーバージョン
マイナーエンジンバージョン
PostgreSQL 16
20241230 以降
PostgreSQL 14, 15, 17
20250430 以降
PostgreSQL 18
20251130 以降
マイナーエンジンバージョンのアップグレード手順については、「マイナーエンジンバージョンのアップグレード」をご参照ください。
ApsaraDB RDS for PostgreSQL の特権アカウントを作成済みであること。詳細については、「アカウントの作成」をご参照ください。
このトピックで使用されるモデルは Alibaba Cloud Model Studio によって提供されます。Model Studio をアクティベートし、API キーを取得する必要があります。詳細については、「API キーの取得」をご参照ください。
ネットワーク構成
デフォルトでは、ApsaraDB RDS for PostgreSQL データベースは外部ネットワークにアクセスできません。外部モデルへのアクセスを許可するには、ApsaraDB RDS for PostgreSQL インスタンスが配置されている VPC に NAT Gateway を設定します。NAT Gateway の詳細については、インターネット NAT Gateway の SNAT 機能を使用したインターネットアクセスをご参照ください。
拡張機能の作成と削除
拡張機能をインストールする前に、ApsaraDB RDS for 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 拡張機能は、次のデフォルトモデルをサポートしています。必要に応じてカスタムモデルを追加することもできます。
API タイプ | パラメーター | パラメータータイプ | デフォルトモデル |
プロンプト API | rds_ai.default_prompt_model | enum |
|
埋め込み API | rds_ai.default_embed_model | enum | text-embedding-v3 |
デフォルトモデルを変更するには、shared_preload_libraries パラメーターの [実行中の値] に rds_ai を追加する必要があります。パラメーターの設定方法の詳細については、「インスタンスパラメーターの設定」をご参照ください。たとえば、[実行中の値] を 'pg_stat_statements,auto_explain,rds_ai' に変更します。
rds_ai 拡張機能のデフォルトモデルは、次の機能を提供します:
基本設定
rds_ai を使用して LLM を呼び出す前に、対応する API キーを設定する必要があります。
-- ターゲットモデルの API キーを設定します。 SELECT rds_ai.update_model('qwen-plus', 'token', 'sk-****'); -- rds_ai.model_list 内のすべてのモデルの API キーを設定します。 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');
LLM ベースの Q&A
rds_ai 拡張機能のデフォルトの LLM ベースの Q&A モデルは、Qwen-Text Generation です。
(任意) Q&A 用のデフォルトの大規模言語モデルを設定できます。これが設定されていない場合、システムはデフォルトで qwen-plus モデルを使用します。
説明デフォルトモデルを変更するには、shared_preload_libraries パラメーターの [実行中の値] に rds_ai を追加する必要があります。パラメーターの設定方法の詳細については、「インスタンスパラメーターの設定」をご参照ください。たとえば、[実行中の値] を
'pg_stat_statements,auto_explain,rds_ai'に変更します。SET rds_ai.default_prompt_model TO 'qwen-max';rds_ai.prompt を使用して、Q&A 用のデフォルトの LLM を呼び出します。例:
SELECT rds_ai.prompt('ニンジン、ジャガイモ、ナスを使ったレシピを教えてください。');完全な API 呼び出し:
SELECT rds_ai.prompt( model_name=>'qwen-plus', -- モデル名 content=>'ニンジン、ジャガイモ、ナスを使ったレシピを教えてください。', -- 質問 args=>'{"top_p": 0.7}'::jsonb -- 大規模モデルを呼び出すためのパラメーター );
テキストからベクターへの変換
rds_ai 拡張機能のデフォルトのテキストからベクターへの変換モデルは、text-embedding-v3 です。
デフォルトでは、この操作は密ベクトルを出力します。
SELECT rds_ai.embed( '風急にして天高く、猿嘯きて哀し。渚清くして沙白く、鳥飛びて廻る。無辺の落木は蕭蕭として下り、不尽の長江は滾滾として来たる。' -- ベクターに変換するテキスト );疎ベクトルを出力するように指定できます。
-- テキストを疎ベクトルに変換します。デフォルトでは 250002 次元です。 SELECT rds_ai.embed( content=>'風急にして天高く、猿嘯きて哀し。渚清くして沙白く、鳥飛びて廻る。無辺の落木は蕭蕭として下り、不尽の長江は滾滾として来たる。', args=>'{"output_type": "sparse"}'::jsonb -- パラメーターリスト );
ベクター変換結果をターゲットテーブルに格納します。
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 テーブルに書き込みます。
密ベクトルを書き込みます。
UPDATE test_embed SET b = rds_ai.embed(a, '{"output_type": "dense"}'::jsonb)::vector;疎ベクトルを書き込みます。
UPDATE test_embed SET c = rds_ai.embed(a, '{"output_type": "sparse"}'::jsonb)::sparsevec;
上位 N 件の類似ベクター検索
rds_ai 拡張機能は、デフォルトで text-embedding-v3 モデルを使用して類似ベクター検索を実行します。例:
テストテーブルを作成します。
-- テストテーブル test_rag を作成します。 CREATE TABLE test_rag ( id SERIAL PRIMARY KEY, chunk TEXT ); -- chunk から変換されたベクターを格納するための embedding 列を追加します。 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 ('なぜ PostgreSQL は最も先進的なオープンソースデータベースと見なされているのですか?', 'public', 'test_rag', 'chunk', 'embedding');完全な API 呼び出し:
SELECT * FROM rds_ai.retrieve ( embed_model=>'text-embedding-v3', -- 使用するベクターモデル question=>'なぜ PostgreSQL は最も先進的なオープンソースデータベースと見なされているのですか?', source_schema=>'public', -- 類似ベクター検索用のテーブルのスキーマ source_table=>'test_rag', -- 類似ベクター検索用のテーブル chunk_col=>'chunk', -- チャンク列 vector_col=>'embedding', -- ベクター列 -- 以下はデフォルトパラメーターです。 topn=>10, -- top_n を設定 embed_args=>'{}'::jsonb, -- テキストからベクターへの変換モデルにパラメーターを渡す distance_type=>'cosine' -- 距離アルゴリズム。サポートされている値は L1, L2, cosine, negative です。 );
RAG ベースの Q&A
rds_ai 拡張機能は、デフォルトで text-embedding-v3 モデルと Qwen-Text Generation モデルを使用して RAG ベースの Q&A を実行します。
-- ベクターモデル:text-embedding-v3。テキスト生成モデル:rds_ai.default_prompt_model パラメーターで指定。
SELECT * FROM rds_ai.rag
('なぜ PostgreSQL は最も先進的なオープンソースデータベースと見なされているのですか?',
'public', 'test_rag', 'chunk', 'embedding');完全な API 呼び出し:
SELECT * FROM rds_ai.rag
(
embed_model=>'text-embedding-v3', -- 使用するベクターモデル
prompt_model=>'qwen-plus', -- 使用するプロンプトモデル
question=>'なぜ PostgreSQL は最も先進的なオープンソースデータベースと見なされているのですか?',
source_schema=>'public', -- 類似ベクター検索用のテーブルのスキーマ
source_table=>'test_rag', -- 類似ベクター検索用のテーブル
chunk_col=>'chunk', -- チャンク列
vector_col=>'embedding', -- ベクター列
-- 以下はデフォルトパラメーターです。
topn=>10,
embed_args=>'{}'::jsonb, -- テキストからベクターへの変換モデルのパラメーター
prompt_args=>'{}'::jsonb, -- 大規模言語モデルプロンプトのパラメーター
distance_type=>'L2' -- 距離アルゴリズム。サポートされている値は L1, L2, cosine, 内積です。
);カスタムモデル
カスタムモデルの追加時に問題が発生した場合は、お問い合わせください。
rds_ai.model_list メタデータテーブルを使用してカスタムモデルを追加できます。rds_ai.model_list テーブルのフィールドは次のとおりです:
フィールド | タイプ | 説明 |
model_name | name | モデル名。このフィールドには主キー制約があります。 |
request_type | text | 呼び出す HTTP メソッド。 |
request_header | http.http_header[] | pgsql-http 拡張機能によって提供される型。HTTP リクエストのヘッダー情報を記録し、主に認証に使用されます。 |
uri | text | モデルの URL。 |
content_type | text | リクエストタイプ (例:application/json)。 |
content_template | text | リクエストボディのテンプレート。通常、API 呼び出し中に埋められるプレースホルダーが含まれます。 |
json_path | text | http_response に基づいて SQL を解析し、必要なコンテンツを抽出します。 |
token | text | ヘッダー内のキー。 |
カスタムモデルの追加
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['あなたは誰ですか']);rds_ai.invoke_model 関数を使用して、qwen-plus モデルの構成に基づいてリクエストを行います。この関数は、構成の
json_pathフィールドに従って指定されたフィールドを抽出します。SELECT * FROM rds_ai.invoke_model('qwen-plus', ARRAY['あなたは誰ですか']);
カスタムモデルの削除
SELECT rds_ai.del_model('test-model');PAI-RAG モデルの追加
PAI-EAS と ApsaraDB RDS for PostgreSQL インスタンスを同じ VPC にデプロイすることを推奨します。rds_ai 拡張機能で PAI VPC アドレスを設定します。PAI-EAS のエンドポイントも ApsaraDB RDS for PostgreSQL VPC アドレスを使用する必要があります。これにより、すべての通信が VPC 内で行われ、パブリックネットワークを経由しないため、セキュリティが強化されます。
PAI-EAS で RAG サービスをデプロイします。詳細については、「PAI-EAS と ApsaraDB RDS for PostgreSQL を使用した LLM ベースの RAG チャットボットのデプロイ」をご参照ください。
RAG サービスの呼び出し情報を取得します。
RAG サービス名をクリックして [サービス詳細] ページに移動します。
[基本情報] セクションで、[エンドポイント情報を表示] をクリックします。
[呼び出し情報] ダイアログボックスで、サービスエンドポイントとトークンを取得します。
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 を実際の URL に置き換え、
/service/queryを追加します。PAI-RAG モデルの呼び出しの詳細については、「API を使用した PAI モデルの呼び出し」をご参照ください。
PAI-RAG モデルのトークンを設定します。
SELECT rds_ai.update_model('pai-rag', 'token','MTFkYjMwZjgzYzA1YmE2N2YyNWMxM2NkNDVjMjEzNjYxMDAzMzE5****');
新しい PAI-RAG モデルを検証します。例:
SELECT rds_ai.invoke_model('pai-rag', ARRAY['WAL ログの蓄積に関連するパラメーターは何ですか?']);FC Function Compute RAG モデルの追加
Function Compute で AgentCraft アプリケーションをデプロイします。詳細については、「AgentCraft のクラウドデプロイ」をご参照ください。
エージェントと [クライアントアクセス] を作成済みであること。
たとえば、「エージェントを DingTalk ロボットに統合する」で説明されているように [クライアント統合] を作成した際に、エンドポイントとトークンを取得して保存しました。
FC Function Compute 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 を実際の URL に置き換え、
/completionsを追加します。FC Function Compute RAG モデルのトークンを設定します。
SELECT rds_ai.update_model('fc-rag', 'token','8UiGAziWgYGPxM3qR5sAChBfDJRt****');
新しい FC Function Compute RAG モデルを検証します。例:
SELECT rds_ai.invoke_model('fc-rag', ARRAY['WAL ログの蓄積に関連するパラメーターは何ですか?']);