すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:AI (rds_ai)

最終更新日:Mar 28, 2026

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 1620241230
    PostgreSQL 14, 15, 1720250430
    PostgreSQL 1820251130
  • ご利用のインスタンスの特権アカウント。作成については、「アカウントの作成」をご参照ください。

  • API キーを持つアクティブな Alibaba Cloud Model Studio サブスクリプション。取得については、「API キーの取得」をご参照ください。

ネットワーク構成

デフォルトでは、RDS for PostgreSQL インスタンスは外部ネットワークにアクセスできません。外部モデルへのアクセスを有効にするには、インスタンスの VPC 用に NAT Gateway を構成する必要があります。NAT Gateway の詳細については、「インターネット NAT ゲートウェイの SNAT 機能を使用したインターネットアクセス」をご参照ください。

拡張機能のインストール

重要

インストールする前に、インスタンスのメジャーバージョンとマイナーエンジンバージョンを確認してください。「前提条件」をご参照ください。

オプション 1: コンソールからのインストール

  1. RDS インスタンスページに移動し、リージョンを選択して、ターゲットインスタンス ID をクリックします。

  2. 左側のナビゲーションウィンドウで、[プラグイン] をクリックします。

  3. [プラグインマーケットプレイス] ページで、rds_ai の横にある[インストール]をクリックします。

  4. 対象のデータベースとアカウントを選択し、[インストール] をクリックします。

アンインストールするには、[プラグインの管理] ページの [インストール済みプラグイン] タブに移動します。

オプション 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_modelqwen-plusqwen-plus, qwen-max, qwen-turbo
埋め込みrds_ai.default_embed_modeltext-embedding-v3text-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
);

埋め込みをテーブルに保存:

  1. テーブルを作成します。

    CREATE TABLE test_embed (
      a text,
      b vector(1024),         -- dense vector column
      c sparsevec(250002)     -- sparse vector column
    );
  2. テキストを挿入します。

    INSERT INTO test_embed (a) VALUES ('hello world');
  3. 埋め込みを書き込みます。

    -- 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ベクトルの方向だけでなく、その大きさが重要な場合
L1L2 の計算コストが高い疎ベクトルまたは高次元ベクトル向け
negativeコサイン類似度と同等だが高速なドット積を使用する正規化されたベクトル向け

rds_ai.retrieve のデフォルトの距離タイプは cosine です。

ベクトルインデックスタイプの選択

インデックスがない場合、PostgreSQL は正確なシーケンシャルスキャンを実行します。これは正確ですが、大規模データセットでは低速です。高速な近似最近傍 (ANN) 検索にはベクトルインデックスを追加します。

インデックスタイプ速度精度メモリ使用する状況
なし低速100% の再現率小規模テーブル、または正確な結果が必要な場合
HNSW高速高 (調整可能)ほとんどの本番ワークロード — 最適なクエリ速度
IVFFlat中程度中程度 (調整可能)メモリが制約されている大規模データセット

例: テーブルの設定と取得の実行

  1. テーブルを作成し、埋め込み列を追加します。

    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;
  2. ベクターインデックスを作成します。

    どちらのインデックスタイプも、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);
  3. 類似検索を実行します。

    -- シンプルな呼び出し (デフォルトを使用: 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_namenameモデル名。主キー。
request_typetextHTTP メソッド (例: POST)
request_headerhttp.http_header[]HTTP リクエストヘッダー — 認証に使用
uritextモデルエンドポイント URL
content_typetextリクエストコンテンツタイプ (例: application/json)
content_templatetext呼び出し時に %s プレースホルダーが埋められるリクエストボディテンプレート
json_pathtextHTTP 応答を解析するための SQL 式
tokentextリクエストヘッダーに配置される認証トークン

カスタムモデルの追加

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 にデプロイします。

  1. PAI-EAS に RAG サービスをデプロイします。「PAI-EAS と ApsaraDB RDS for PostgreSQL を使用した LLM ベースの RAG チャットボットのデプロイ」をご参照ください。

  2. サービスエンドポイントとトークンを取得します。

    1. RAG サービス名をクリックして、[サービスの詳細] ページを開きます。

    2. 基本情報」で、[エンドポイント情報の表示] をクリックします。

    3. [呼び出し情報] ダイアログボックスで、サービスエンドポイントとトークンをコピーします。

  3. 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'
    );
  4. 認証トークンを設定します。

    SELECT rds_ai.update_model('pai-rag', 'token', 'MTFkYjMwZjgzYzA1YmE2N2YyNWMxM2NkNDVjMjEzNjYxMDAzMzE5****');
  5. モデルを確認します。

    SELECT rds_ai.invoke_model('pai-rag', ARRAY['What parameters are related to WAL log accumulation?']);

PAI-RAG モデルの呼び出しの詳細については、「API を使用した PAI モデルの呼び出し」をご参照ください。

Function Compute RAG モデルの追加

  1. Function Compute に AgentCraft アプリケーションをデプロイします。「AgentCraft のクラウドデプロイ」をご参照ください。

  2. エージェントと[クライアント アクセス]インテグレーションを作成します。 [クライアント インテグレーション]を作成する際(「エージェントを DingTalk ロボットに統合する」を参照)は、エンドポイントとトークンを保存してください。

  3. 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'
    );
  4. 認証トークンを設定します。

    SELECT rds_ai.update_model('fc-rag', 'token', '8UiGAziWgYGPxM3qR5sAChBfDJRt****');
  5. モデルを確認します。

    SELECT rds_ai.invoke_model('fc-rag', ARRAY['What parameters are related to WAL log accumulation?']);

API リファレンス

rds_ai.prompt

LLM にプロンプトを送信し、応答を返します。

rds_ai.prompt(
  model_name TEXT,
  content    TEXT,
  args       jsonb DEFAULT '{}'
) RETURNS text
パラメータータイプ説明デフォルト
model_nametext呼び出すモデル。qwen-plus
contenttextプロンプトテキスト。
argsjsonb追加のモデルパラメーター (例: {"top_p": 0.2})。{}

rds_ai.embed

指定された埋め込みモデルを使用してテキストをベクトルに変換します。

rds_ai.embed(
  model_name TEXT,
  content    TEXT,
  args       jsonb DEFAULT '{}'
) RETURNS text
パラメータータイプ説明デフォルト
model_nametext呼び出すモデル。text-embedding-v3
contenttext変換するテキスト。
argsjsonb追加パラメーター (例: {"output_type": "dense"})。{}

rds_ai.retrieve

クエリテキストに最も類似した上位 N 件のレコードをテーブルから検索します。

rds_ai.retrieve(
  model_name    TEXT,
  question      TEXT,
  source_schema TEXT,
  source_table  TEXT,
  chunk_col     TEXT,
  vector_col    TEXT,
  topn          INT DEFAULT 10,
  embed_args    jsonb DEFAULT '{}',
  distance_type TEXT DEFAULT 'cosine'
) RETURNS TABLE(chunk TEXT, distance float)
パラメータータイプ説明デフォルト
model_nametext呼び出す埋め込みモデル。text-embedding-v3
questiontext検索するクエリテキスト。
source_schematext検索するテーブルのスキーマ。
source_tabletext検索するテーブル。
chunk_coltextテキストチャンクを含む列。
vector_coltext保存されたベクトルを含む列。
topnint返す結果の数。10
embed_argsjsonb埋め込みモデルの追加パラメーター。{}
distance_typetext距離アルゴリズム: L1L2cosine、または negativecosine

rds_ai.rag

テーブルから関連するチャンクを取得し、それらを LLM に渡して根拠のある回答を生成します。

rds_ai.rag(
  embed_model   TEXT,
  prompt_model  TEXT,
  question      TEXT,
  source_schema TEXT,
  source_table  TEXT,
  chunk_col     TEXT,
  vector_col    TEXT,
  topn          INT DEFAULT 10,
  embed_args    jsonb DEFAULT '{}',
  prompt_args   jsonb DEFAULT '{}',
  distance_type TEXT DEFAULT 'L2'
) RETURNS text
パラメータータイプ説明デフォルト
embed_modeltextベクトル検索用の埋め込みモデル。text-embedding-v3
prompt_modeltext回答を生成するための LLM。qwen-plus
questiontext回答する質問。
source_schematext検索するテーブルのスキーマ。
source_tabletext検索するテーブル。
chunk_coltextテキストチャンクを含む列。
vector_coltext保存されたベクトルを含む列。
topnint取得するチャンクの数。10
embed_argsjsonb埋め込みモデルの追加パラメーター。{}
prompt_argsjsonbプロンプトモデルの追加パラメーター。{}
distance_typetext距離アルゴリズム: L1L2cosine、または inner productL2

rds_ai.show_models

構成されているすべてのモデルをリスト表示します。

rds_ai.show_models() RETURNS setof rds_ai.model_list

rds_ai.add_model

モデル構成を追加します。

rds_ai.add_model(
  model_name       TEXT,
  request_type     TEXT,
  request_header   http.http_header[],
  uri              TEXT,
  content_type     TEXT,
  content_template TEXT,
  json_path        TEXT
) RETURNS TEXT
パラメータータイプ説明
model_nameTEXTモデルを識別するための名前。'text-embedding-v3'
request_typeTEXTHTTP メソッド。'POST'
request_headerhttp.http_header[]リクエストヘッダー。トークンのプレースホルダーとして %s を使用します。ARRAY[('Authorization', 'Bearer %s')]
uriTEXTモデルエンドポイント URL。

'https://dashscope-intl.aliyuncs.com/api/v1/services/embeddings/text-embedding/text-embedding'

content_typeTEXTリクエストコンテンツタイプ。'application/json'
content_templateTEXTリクエストボディテンプレート。呼び出し時に埋められる値には %s を使用します。'{ "model": "text-embedding-v3", "input": {"texts": ["%s"]}, "parameters": %s }'
json_pathTEXTHTTP 応答から結果を抽出するための SQL 式。正確なパスが不明な場合は 'SELECT %L' を使用します。'SELECT %L'

rds_ai.update_model

既存のモデル構成のフィールドを更新します。

rds_ai.update_model(
  model_name  TEXT,
  config_name TEXT,
  value       TEXT
) RETURNS void
パラメータータイプ説明
model_nameTEXT更新するモデルの名前。'text-embedding-v3'
config_nameTEXT更新するフィールド。rds_ai.add_model でフィールド名を確認してください。'uri'
valueTEXTフィールドの新しい値。

'https://dashscope-intl.aliyuncs.com/api/v1/services/embeddings/text-embedding/text-embedding'

rds_ai.del_model

モデル構成を削除します。

rds_ai.del_model(model_name text) RETURNS void
パラメータータイプ説明
model_nametext削除するモデルの名前。'test-model'

rds-ai.invoke_model

モデルを呼び出し、モデル構成の json_path 式によって解析された結果を返します。

rds-ai.invoke_model(
  model_name  TEXT,
  params_list TEXT[]
) RETURNS http.http_response
パラメータータイプ説明
model_nametext呼び出すモデル。'qwen-plus'
params_listtext[]content_template に順番に埋める値。ARRAY['who are you', '{}']

rds-ai.raw_invoke_model

モデルを呼び出し、完全な HTTP 応答を返します。

rds-ai.raw_invoke_model(
  model_name  TEXT,
  params_list TEXT[]
) RETURNS http.http_response
パラメータータイプ説明
model_nametext呼び出すモデル。'qwen-plus'
params_listtext[]content_template に順番に埋める値。ARRAY['who are you', '{}']

次のステップ