ApsaraDB for PostgreSQL は、Qwen やテキスト埋め込みモデルなど、Alibaba Cloud Model Studio の高度なモデルを統合する rds_ai 拡張機能のサポートを導入しました。 この拡張機能により、LLM ベースの Q&A サービス、テキストからベクトルへの変換、上位 N 個の類似ベクトルの取得、および検索拡張生成 (RAG) ベースの Q&A サービスなど、幅広いアプリケーションが可能になります。 さらに、rds_ai 拡張機能を通じてカスタムモデルをデプロイして、RDS for PostgreSQL でさまざまな AI 駆動型アプリケーションを開発できます。 このトピックでは、この拡張機能をデプロイして AI 機能を使用する方法について説明します。
前提条件
RDS インスタンスのメジャーエンジンバージョンとマイナーエンジンバージョンが、次の表の要件を満たしていること。
メジャーエンジンバージョン
マイナーエンジンバージョン
PostgreSQL 16
20241230 以降
PostgreSQL 14、PostgreSQL 15、および PostgreSQL 17
20250430 以降
マイナーエンジンバージョンの更新方法の詳細については、「マイナーエンジンバージョンの更新」をご参照ください。
RDS インスタンスに特権アカウントが作成されていること。 特権アカウントの作成方法の詳細については、「アカウントの作成」をご参照ください。
Alibaba Cloud Model Studio がアクティブ化されており、API キーが利用可能であること。 詳細については、「API キーの取得」をご参照ください。
Network configurations
デフォルトでは、RDS for PostgreSQL インスタンスは内部ネットワーク経由でのみリソースにアクセスできます。 そのため、RDS インスタンスが外部モデルにアクセスできるようにするには、RDS インスタンスが存在する仮想プライベートクラウド (VPC) の NAT ゲートウェイを作成する必要があります。 NAT ゲートウェイの詳細については、「インターネット NAT ゲートウェイの SNAT 機能を使用してインターネットにアクセスする」をご参照ください。
rds_ai の作成と削除
rds_ai 拡張機能を作成する前に、RDS for PostgreSQL インスタンスが前提条件で説明されている要件を満たしていることを確認してください。
[プラグイン] ページで rds_ai 拡張機能を作成および削除する
ApsaraDB RDS コンソールにログインし、[インスタンス] ページに移動します。 上部のナビゲーションバーで、RDS インスタンスが存在するリージョンを選択します。 次に、RDS インスタンスを見つけて、その ID をクリックします。
左側のナビゲーション [ウィンドウ] で、[プラグイン] をクリックします。
[拡張マーケットプレイス] タブの rds_ai セクションで、[インストール] をクリックします。
表示されるダイアログ [ボックス] で、データベースとアカウントを選択します。 次に、[インストール] をクリックして、選択したデータベースに rds_ai 拡張機能を作成します。
(オプション) rds_ai 拡張機能が不要になった場合は、[拡張機能の管理] タブの [インストール済みの拡張機能] ページで削除できます。
SQL 文を実行して rds_ai 拡張機能を作成および削除する
拡張機能を作成する
CREATE EXTENSION IF NOT EXISTS rds_ai CASCADE;説明上記の文を実行する権限を持っているのは、特権アカウントのみです。 特権アカウントの作成方法の詳細については、「アカウントの作成」をご参照ください。
rds_ai 拡張機能を作成すると、pgvector 拡張機能と pgsql-http 拡張機能が自動的に作成されます。
SELECT * FROM pg_extension;文を実行して、作成された拡張機能を表示できます。
拡張機能を削除する
DROP EXTENSION rds_ai;
デフォルトモデルを使用して AI 機能を実装する
rds_ai 拡張機能は、次の表に示すデフォルトモデルをサポートしています。 また、要件に基づいてカスタムモデルを作成することもできます。
インターフェースタイプ | パラメーター | データ型 | デフォルトモデル |
プロンプト API | rds_ai.default_prompt_model | enum |
|
埋め込み API | rds_ai.default_embed_model | enum | text-embedding-v3 |
拡張機能のデフォルトモデルを変更するには、shared_preload_libraries パラメーターの[実行値]に rds_ai を追加します。 インスタンスパラメーターの構成方法の詳細については、「ApsaraDB for PostgreSQL インスタンスのパラメーターを変更する」をご参照ください。
たとえば、shared_preload_libraries パラメーターの[実行値]を 'pg_stat_statements,auto_explain,rds_ai' に設定できます。
rds_ai 拡張機能のデフォルトモデルは、次の 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 拡張機能はQwen が提供するテキスト生成モデルを使用して、LLM ベースの Q&A を実装します。
(オプション) LLM ベースの Q&A の実装に使用するデフォルトモデルを構成します。 デフォルトでは、Qwen-Plus モデルが使用されます。
説明拡張機能のデフォルトモデルを変更するには、shared_preload_libraries パラメーターの[実行値]に rds_ai を追加します。 インスタンスパラメーターの構成方法の詳細については、「ApsaraDB for PostgreSQL インスタンスのパラメーターを変更する」をご参照ください。
たとえば、shared_preload_libraries パラメーターの[実行値]を
'pg_stat_statements,auto_explain,rds_ai'に設定できます。SET rds_ai.default_prompt_model TO "qwen-max" ;rds_ai.prompt 関数を使用して、Q&A サービスのデフォルトモデルを呼び出します。
コマンドの例:
SELECT rds_ai.prompt('ジャガイモ、ナス、大根を使った料理のレシピを教えてください。');完全なコマンド:
SELECT rds_ai.prompt( model_name=>'qwen-plus', -- Q&A サービスに使用する LLM を指定します。 content=>'ジャガイモ、ナス、大根を使った料理のレシピを教えてください。', -- 質問を指定します。 args=>'{"top_p": 0.7}'::jsonb -- モデルの呼び出しに必要なパラメーターを指定します。 );
テキストからベクトルへの変換
デフォルトでは、rds_ai 拡張機能は text-embedding-v3 モデルを使用して、テキストをベクトルに変換します。
入力テキストをベクトルに変換します。
パラメーターを指定せずに rds_ai.embed 関数を呼び出して、入力テキストをベクターに変換できます。 デフォルトでは、テキストは密ベクターに変換されます。
SELECT rds_ai.embed( 'The quality of the clothes is excellent, very beautiful, worth the wait, I like it and will buy here again' -- 変換するテキストを指定します。 );入力テキストをスパース ベクターに変換するためのパラメーターを指定することもできます。
-- デフォルトで 250,002 次元のスパース ベクターに入力テキストを変換します。 SELECT rds_ai.embed( content=>'The quality of the clothes is excellent, very beautiful, worth the wait, I like it and will buy here again', 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 ); -- テキストチャンクから変換されたベクターを格納するための埋め込み列を追加します。 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 ('Why is PostgreSQL the most advanced open source database', 'public', 'test_rag', 'chunk', 'embedding');完全なコマンド:
SELECT * FROM rds_ai.retrieve ( embed_model=>'text-embedding-v3', -- ベクター取得に使用するモデルを指定します。 question=>'Why is PostgreSQL the most advanced open source database', source_schema=>'public', -- 取得するベクターを格納するテーブルのスキーマを指定します。 source_table=>'test_rag', -- 取得するベクターを格納するテーブルを指定します。 chunk_col=>'chunk', -- チャンクテキストを格納する列を指定します。 vector_col=>'embedding', -- ベクターを格納する列を指定します。 -- 以下のデフォルトパラメータを指定します。 topn=>10, -- ベクター取得の上位 N 値を指定します。 embed_args=>'{}'::jsonb, -- モデルに必要なパラメータを指定します。 distance_type=>'cosine' -- ベクター間の距離を計算するために使用されるアルゴリズムを指定します。有効な値:L1、L2、cosine、および negative。 );
RAG ベースの Q&A
デフォルトでは、rds_ai 拡張機能は text-embedding-v3 モデルと Qwen が提供するテキスト生成モデル を使用して、RAG ベースの Q&A サービスを実装します。
サンプルコマンド:
-- rds_ai は、ベクター関連の操作に text-embedding-v3 モデルを使用します。 rds_ai で使用されるテキスト生成モデルは、rds_ai.default_prompt_model パラメーターによって指定されます。
SELECT * FROM rds_ai.rag
('Why is PostgreSQL the most advanced open source database',
'public', 'test_rag', 'chunk', 'embedding');完全なコマンド:
SELECT * FROM rds_ai.rag
(
embed_model=>'text-embedding-v3', -- RAG ベースの Q&A サービスに使用されるベクターモデルを指定します。
prompt_model=>'qwen-plus', -- RAG ベースの Q&A に使用されるプロンプトモデルを指定します。
question=>'Why is PostgreSQL the most advanced open source database',
source_schema=>'public', -- 取得するベクターを格納するテーブルのスキーマを指定します。
source_table=>'test_rag', -- 取得するベクターを格納するテーブルを指定します。
chunk_col=>'chunk', -- チャンクテキストを格納する列を指定します。
vector_col=>'embedding', -- ベクターを格納する列を指定します。
-- 以下のデフォルトパラメーターを指定します。
topn=>10,
embed_args=>'{}'::jsonb, -- RAG ベースの Q&A に使用されるベクターモデルに必要なパラメーターを指定します。
prompt_args=>'{}'::jsonb, -- RAG ベースの Q&A に使用されるプロンプトモデルに必要なパラメーターを指定します。
distance_type=>'L2' -- ベクター間の距離を計算するために使用されるアルゴリズムを指定します。 有効な値: L1、L2、cosine、および内積。
);カスタムモデルを使用して AI 機能を実装する
カスタムモデルを追加する際に問題が発生した場合は、お問い合わせください。
メタデータテーブル rds_ai.model_list にモデルのレコードを挿入することで、カスタムモデルを追加できます。次の表に、rds_ai.model_list テーブルに含まれるフィールドを示します。
フィールド | データ型 | 説明 |
model_name | name | モデルの名前。このフィールドは、rds_ai.model_list テーブルのプライマリキーです。 |
request_type | text | このモデルを呼び出すために送信される HTTP リクエストのメソッド。 |
request_header | http.http_header[] | 認証情報を含む HTTP リクエストヘッダー。このフィールドのデータ型は、pgsql-http 拡張機能によって定義されます。 |
uri | text | モデルの URL。 |
content_type | text | リクエストのコンテンツタイプ。例: application/json。 |
content_template | text | リクエストボディのテンプレート。モデルを呼び出すときは、テンプレート内のプレースホルダーを実際の値に置き換える必要があります。 |
json_path | text | レスポンスを解決し、必要な情報を取得するために使用される 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', -- リクエストのコンテンツタイプ '{"key":"%s"}', -- リクエストボディのテンプレート 'SELECT %L' -- レスポンスを解決するために使用される SQL 文 );カスタムモデルを使用する
次のコマンドは、rds_ai.raw_invoke_model 関数を使用して、メタデータテーブルの設定に基づいて Qwen-Plus を呼び出す方法を示しています。リクエストでは、テンプレートを満たすために配列が指定されています。完全なレスポンスが返されます。
SELECT * FROM rds_ai.raw_invoke_model('qwen-plus', ARRAY['who are you']);次のコマンドは、rds_ai.invoke_model 関数を使用して、メタデータテーブルの設定に基づいて Qwen-Plus を呼び出す方法を示しています。Qwen-Plus に指定された
json_pathフィールドに基づいて、レスポンスから特定のフィールドが解決され、返されます。SELECT * FROM rds_ai.invoke_model('qwen-plus', ARRAY['who are you']);
カスタムモデルを削除する
SELECT rds_ai.del_model('test-model');
RAG ベースの PAI モデルを追加する
RAG ベースの PAI モデルを追加するには、RDS for PostgreSQL インスタンスと Platform for AI(PAI)の Elastic Algorithm Service(EAS)モジュールを同じ VPC にデプロイし、rds_ai の設定で PAI の VPC エンドポイントを設定することをお勧めします。また、RDS for PostgreSQL インスタンスの VPC エンドポイントを使用して、PAI の EAS モジュールに接続する必要があります。このようにして、異なるサービスは VPC 内でのみ通信し、データセキュリティを確保します。
PAI の EAS モジュールに RAG ベースのサービスをデプロイします。詳細については、「PAI の EAS モジュールと ApsaraDB RDS for PostgreSQL を使用して RAG ベースの LLM チャットボットをデプロイする」をご参照ください。
RAG ベースのサービスの呼び出し情報を取得します。
RAG ベースのサービスの名前をクリックして、[サービスの詳細] ページに移動します。
[基本情報] セクションで、[エンドポイント情報を表示] をクリックします。
[呼び出し方法] ダイアログボックスで、サービスのエンドポイントとトークンを取得します。
RAG ベースの PAI モデルを追加します。
SELECT rds_ai.add_model( 'pai-rag', -- モデル名 'POST', -- HTTP リクエストメソッド 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' -- レスポンスを解決するために使用される SQL 文 );説明上記の例の URL を、
/service/queryが追加された実際のモデル URL に置き換えます。RAG ベースの PAI モデルの呼び出し方法の詳細については、「API 操作を呼び出してモデル推論を実行する」をご参照ください。
RAG ベースの PAI モデルのトークンを設定します。
SELECT rds_ai.update_model('pai-rag', 'token','MTFkYjMwZjgzYzA1YmE2N2YyNWMxM2NkNDVjMjEzNjYxMDAzMzE5****');(オプション) RAG ベースの PAI モデルをテストします。
サンプルコマンド
SELECT rds_ai.invoke_model('pai-rag', ARRAY['どのパラメーターが WAL ログの蓄積につながる可能性がありますか']);
RAG ベースの Function Compute モデルを追加する
Function Compute に AgentCraft アプリケーションをデプロイします。
エージェントを作成し、エージェントの[クライアントアクセス情報] を設定します。
RAG ベースの Function Compute モデルを追加します。
SELECT rds_ai.add_model( 'fc-rag', -- モデル名 'POST', -- HTTP リクエストメソッド 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' -- レスポンスを解決するために使用される SQL 文 );説明上記の例の URL を、
/completionsが追加された実際のモデル URL に置き換えます。RAG ベースの Function Compute モデルのトークンを設定します。
SELECT rds_ai.update_model('fc-rag', 'token','8UiGAziWgYGPxM3qR5sAChBfDJRt****');(オプション) RAG ベースの Function Compute モデルをテストします。
サンプルコマンド:
SELECT rds_ai.invoke_model('fc-rag', ARRAY['どのパラメーターが WAL ログの蓄積につながる可能性がありますか']);