rds_ai 拡張機能を使用すると、ApsaraDB RDS for PostgreSQL の SQL から直接、大規模言語モデル (LLM) の呼び出しや埋め込み操作を実行できます。この拡張機能は、Qwen や text-embedding-v3 などの Alibaba Cloud Model Studio モデルと統合されており、データベースからデータを移動することなく AI 機能を構築できます。
rds_ai を使用すると、LLM 質疑応答の実行、テキストからベクトルへの変換、意味的に類似したレコードの取得、およびエンドツーエンドの検索拡張生成 (RAG) パイプラインの実行を、すべて標準の PostgreSQL クエリから行うことができます。また、カスタムモデルもサポートしており、HTTP 互換のモデル API に接続できます。
前提条件
開始する前に、以下を確認してください。
以下のバージョン要件を満たす ApsaraDB RDS for PostgreSQL インスタンス。アップグレードについては、「マイナーエンジンバージョンのアップグレード」をご参照ください。
メジャーバージョン 最小マイナーエンジンバージョン PostgreSQL 16 20241230 PostgreSQL 14, 15, 17 20250430 PostgreSQL 18 20251130 ご利用のインスタンスの特権アカウント。作成については、「アカウントの作成」をご参照ください。
API キーを持つアクティブな Alibaba Cloud Model Studio サブスクリプション。取得については、「API キーの取得」をご参照ください。
ネットワーク構成
デフォルトでは、RDS for PostgreSQL インスタンスは外部ネットワークにアクセスできません。外部モデルへのアクセスを有効にするには、インスタンスの VPC 用に NAT Gateway を構成する必要があります。NAT Gateway の詳細については、「インターネット NAT ゲートウェイの SNAT 機能を使用したインターネットアクセス」をご参照ください。
拡張機能のインストール
インストールする前に、インスタンスのメジャーバージョンとマイナーエンジンバージョンを確認してください。「前提条件」をご参照ください。
オプション 1: コンソールからのインストール
RDS インスタンスページに移動し、リージョンを選択して、ターゲットインスタンス ID をクリックします。
左側のナビゲーションウィンドウで、[プラグイン] をクリックします。
[プラグインマーケットプレイス] ページで、rds_ai の横にある[インストール]をクリックします。
対象のデータベースとアカウントを選択し、[インストール] をクリックします。
アンインストールするには、[プラグインの管理] ページの [インストール済みプラグイン] タブに移動します。
オプション 2: 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 | パラメーター | デフォルトモデル | オプション |
|---|---|---|---|
| プロンプト | rds_ai.default_prompt_model | qwen-plus | qwen-plus, qwen-max, qwen-turbo |
| 埋め込み | rds_ai.default_embed_model | text-embedding-v3 | text-embedding-v3 |
デフォルトのプロンプトモデルを変更するには、rds_ai を [実行中の値] に追加し、shared_preload_libraries パラメーターの「実行中の値」を設定してから、モデルを設定します。パラメーターの更新手順については、「インスタンスパラメーターの設定」をご参照ください。たとえば、[実行中の値] を 'pg_stat_statements,auto_explain,rds_ai' に設定し、次に次のコマンドを実行します:
SET rds_ai.default_prompt_model TO 'qwen-max';拡張機能の構成
モデルを呼び出す前に、API キーとモデル URL を設定します。
ステップ 1: API キーの設定
-- Set the API key for a specific model
SELECT rds_ai.update_model('qwen-plus', 'token', 'sk-****');
-- Set the same API key for all models
SELECT rds_ai.update_model(model_name, 'token', 'sk-****')
FROM rds_ai.model_list;ステップ 2: モデル URL の設定
-- Prompt models (qwen-plus, qwen-max, qwen-turbo share the same endpoint)
SELECT rds_ai.update_model('qwen-plus', 'uri', 'https://dashscope-intl.aliyuncs.com/api/v1/services/aigc/text-generation/generation');
SELECT rds_ai.update_model('qwen-max', 'uri', 'https://dashscope-intl.aliyuncs.com/api/v1/services/aigc/text-generation/generation');
SELECT rds_ai.update_model('qwen-turbo', 'uri', 'https://dashscope-intl.aliyuncs.com/api/v1/services/aigc/text-generation/generation');
-- Embedding model
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 拡張機能を使用してリモート呼び出しを行います。長時間実行されるリクエストを中断するには、タイムアウトを設定します。
これらの設定は現在のセッションにのみ適用されます。新しい接続ごとに再設定してください。
-- Request timeout (milliseconds)
SET http.timeout_msec TO 200000;
SELECT http.http_set_curlopt('CURLOPT_TIMEOUT', '200000');
-- Connection timeout (milliseconds)
SELECT http.http_set_curlopt('CURLOPT_CONNECTTIMEOUT_MS', '200000');LLM 質疑応答
rds_ai.prompt を使用して、Qwen テキスト生成モデルに質問を送信し、応答を取得します。デフォルトモデルは qwen-plus です。
シンプルな呼び出し:
SELECT rds_ai.prompt('Give me a recipe using carrots, potatoes, and eggplants.');明示的なパラメーターを使用した完全な呼び出し:
SELECT rds_ai.prompt(
model_name => 'qwen-plus', -- model name
content => 'Give me a recipe using carrots, potatoes, and eggplants.', -- prompt text
args => '{"top_p": 0.7}'::jsonb -- model parameters
);テキストからベクトルへの変換
rds_ai.embed を使用して、text-embedding-v3 モデルを使用してテキストをベクトルに変換します。出力はデフォルトで 1024次元の密ベクトルです。疎ベクトルを要求するには、{"output_type": "sparse"} を渡します。出力は 250,002 ディメンションになります。
密ベクトル (デフォルト):
SELECT rds_ai.embed(
'A strong wind blows from a high sky, and monkeys cry sadly.'
);疎ベクトル:
SELECT rds_ai.embed(
content => 'A strong wind blows from a high sky, and monkeys cry sadly.',
args => '{"output_type": "sparse"}'::jsonb
);埋め込みをテーブルに保存:
テーブルを作成します。
CREATE TABLE test_embed ( a text, b vector(1024), -- dense vector column c sparsevec(250002) -- sparse vector column );テキストを挿入します。
INSERT INTO test_embed (a) VALUES ('hello world');埋め込みを書き込みます。
-- Write a dense vector UPDATE test_embed SET b = rds_ai.embed(a, '{"output_type": "dense"}'::jsonb)::vector; -- Write a sparse vector UPDATE test_embed SET c = rds_ai.embed(a, '{"output_type": "sparse"}'::jsonb)::sparsevec;
意味ベクトル取得
rds_ai.retrieve を使用して、クエリに最も類似した上位 N 件のレコードを検索します。text-embedding-v3 を使用してクエリを埋め込み、指定した距離タイプを使用して保存されたベクトルと比較します。
距離タイプの選択
| 距離タイプ | 使用する状況 |
|---|---|
cosine | 長さに関係なくテキストの意味を比較する場合 — 意味検索で最も一般的な選択 |
L2 | ベクトルの方向だけでなく、その大きさが重要な場合 |
L1 | L2 の計算コストが高い疎ベクトルまたは高次元ベクトル向け |
negative | コサイン類似度と同等だが高速なドット積を使用する正規化されたベクトル向け |
rds_ai.retrieve のデフォルトの距離タイプは cosine です。
ベクトルインデックスタイプの選択
インデックスがない場合、PostgreSQL は正確なシーケンシャルスキャンを実行します。これは正確ですが、大規模データセットでは低速です。高速な近似最近傍 (ANN) 検索にはベクトルインデックスを追加します。
| インデックスタイプ | 速度 | 精度 | メモリ | 使用する状況 |
|---|---|---|---|---|
| なし | 低速 | 100% の再現率 | 低 | 小規模テーブル、または正確な結果が必要な場合 |
| HNSW | 高速 | 高 (調整可能) | 高 | ほとんどの本番ワークロード — 最適なクエリ速度 |
| IVFFlat | 中程度 | 中程度 (調整可能) | 低 | メモリが制約されている大規模データセット |
例: テーブルの設定と取得の実行
テーブルを作成し、埋め込み列を追加します。
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);類似検索を実行します。
-- シンプルな呼び出し (デフォルトを使用: text-embedding-v3、上位 10 件、余弦距離) SELECT * FROM rds_ai.retrieve( 'Why is PostgreSQL considered 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 considered the most advanced open-source database?', source_schema => 'public', -- ソーステーブルのスキーマ source_table => 'test_rag', -- 検索対象テーブル chunk_col => 'chunk', -- テキスト列 vector_col => 'embedding', -- ベクター列 topn => 10, -- 返却する結果の件数 embed_args => '{}'::jsonb, -- 埋め込みモデル用の追加パラメーター distance_type => 'cosine' -- 距離アルゴリズム: L1、L2、余弦、または negative );
RAG 質疑応答
rds_ai.rag は、ベクトル取得と LLM 生成を単一の呼び出しで組み合わせます。テーブルから関連する上位 N 件のチャンクを取得し、それらをプロンプトモデルにコンテキストとして渡します。
デフォルトモデルは、埋め込みには text-embedding-v3、テキスト生成には qwen-plus です。
シンプルな呼び出し:
SELECT * FROM rds_ai.rag(
'Why is PostgreSQL considered the most advanced open-source database?',
'public', 'test_rag', 'chunk', 'embedding'
);明示的なパラメーターを使用した完全な呼び出し:
SELECT * FROM rds_ai.rag(
embed_model => 'text-embedding-v3', -- embedding model
prompt_model => 'qwen-plus', -- text generation model
question => 'Why is PostgreSQL considered the most advanced open-source database?',
source_schema => 'public', -- schema of the source table
source_table => 'test_rag', -- table to search
chunk_col => 'chunk', -- text column
vector_col => 'embedding', -- vector column
topn => 10, -- number of chunks to retrieve
embed_args => '{}'::jsonb, -- extra parameters for the embedding model
prompt_args => '{}'::jsonb, -- extra parameters for the prompt model
distance_type => 'L2' -- distance algorithm: L1, L2, cosine, or inner product
);カスタムモデル
rds_ai は、モデル構成を rds_ai.model_list テーブルに保存します。このテーブルに行を挿入することで、HTTP 互換のモデルを追加できます。
カスタムモデルの追加時に問題が発生した場合は、お問い合わせください。
rds_ai.model_list フィールド
| フィールド | タイプ | 説明 |
|---|---|---|
model_name | name | モデル名。主キー。 |
request_type | text | HTTP メソッド (例: POST) |
request_header | http.http_header[] | HTTP リクエストヘッダー — 認証に使用 |
uri | text | モデルエンドポイント URL |
content_type | text | リクエストコンテンツタイプ (例: application/json) |
content_template | text | 呼び出し時に %s プレースホルダーが埋められるリクエストボディテンプレート |
json_path | text | HTTP 応答を解析するための SQL 式 |
token | text | リクエストヘッダーに配置される認証トークン |
カスタムモデルの追加
SELECT rds_ai.add_model(
'test-model', -- model name
'POST', -- HTTP method
ARRAY[('Authorization', 'Bearer %s')]::http.http_header[], -- request header
'https://****.com', -- model URL
'application/json', -- content type
'{"key":"%s"}', -- request body template
'SELECT %L' -- JSON response parser
);カスタムモデルの呼び出し
完全な HTTP 応答を取得するには rds_ai.raw_invoke_model を使用し、json_path で定義されたフィールドのみを抽出するには rds_ai.invoke_model を使用します。
-- Returns the full HTTP response
SELECT * FROM rds_ai.raw_invoke_model('qwen-plus', ARRAY['who are you']);
-- Returns the parsed result from json_path
SELECT * FROM rds_ai.invoke_model('qwen-plus', ARRAY['who are you']);カスタムモデルの削除
SELECT rds_ai.del_model('test-model');PAI-RAG モデルの追加
すべてのトラフィックをプライベートネットワーク内に保持するために、RDS インスタンスと PAI-EAS サービスを同じ VPC にデプロイします。
PAI-EAS に RAG サービスをデプロイします。「PAI-EAS と ApsaraDB RDS for PostgreSQL を使用した LLM ベースの RAG チャットボットのデプロイ」をご参照ください。
サービスエンドポイントとトークンを取得します。
RAG サービス名をクリックして、[サービスの詳細] ページを開きます。
「基本情報」で、[エンドポイント情報の表示] をクリックします。
[呼び出し情報] ダイアログボックスで、サービスエンドポイントとトークンをコピーします。
PAI-RAG モデルを追加します。URL を実際の Endpoint に置き換え、
/service/queryを追加します。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', 'application/json', '{"question": "%s"}', 'SELECT (%L::jsonb->''answer'')::text' );認証トークンを設定します。
SELECT rds_ai.update_model('pai-rag', 'token', 'MTFkYjMwZjgzYzA1YmE2N2YyNWMxM2NkNDVjMjEzNjYxMDAzMzE5****');モデルを確認します。
SELECT rds_ai.invoke_model('pai-rag', ARRAY['What parameters are related to WAL log accumulation?']);
PAI-RAG モデルの呼び出しの詳細については、「API を使用した PAI モデルの呼び出し」をご参照ください。
Function Compute RAG モデルの追加
Function Compute に AgentCraft アプリケーションをデプロイします。「AgentCraft のクラウドデプロイ」をご参照ください。
エージェントと[クライアント アクセス]インテグレーションを作成します。 [クライアント インテグレーション]を作成する際(「エージェントを DingTalk ロボットに統合する」を参照)は、エンドポイントとトークンを保存してください。
Function Compute RAG モデルを追加します。URL を実際の Endpoint に置き換え、
/completionsを追加します。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', 'application/json', '{ "messages": [{"role": "user", "content": "%s"}], "stream": false, "max_tokens": 1024 }', 'SELECT (%L::jsonb->''choices''->0->''message''->>''content'')::text' );認証トークンを設定します。
SELECT rds_ai.update_model('fc-rag', 'token', '8UiGAziWgYGPxM3qR5sAChBfDJRt****');モデルを確認します。
SELECT rds_ai.invoke_model('fc-rag', ARRAY['What parameters are related to WAL log accumulation?']);
API リファレンス
次のステップ
pgvector ユーザーガイド — PostgreSQL でのベクターストレージとベクター検索の解説
PAI-EAS と ApsaraDB RDS for PostgreSQL を使用して LLM ベースの RAG チャットボットをデプロイする — エンドツーエンドの RAG チャットボットデプロイガイド