Amazon Web Services ブログ

Oracle Database 26ai での自然言語クエリ: Amazon Bedrock を使った Amazon RDS for Oracle での Select AI 入門

本記事は 2026 年 8 月 11 日 に公開された「Natural language queries on Oracle Database 26ai: Getting started with Select AI on Amazon RDS for Oracle with Amazon Bedrock」を翻訳したものです。

Amazon Relational Database Service (Amazon RDS) for Oracle で Oracle Database 26ai が利用可能になりました。Amazon RDS における Oracle 初の AI ネイティブなデータベースリリースで、生成 AI、ベクトル検索、機械学習がエンジンに直接組み込まれています。バックアップ、パッチ適用、マルチ AZ による高可用性、リードレプリカは Amazon RDS が処理するため、インフラストラクチャの管理ではなく AI アプリケーションの構築に集中できます。

本記事では、新機能のなかでも特に効果の大きい Select AI を紹介します。Select AI では、Amazon Bedrock の基盤モデル (FM) を使い、自然言語のプロンプトでリレーショナルデータを照会できます。「今四半期の売上上位 5 社の顧客は?」とデータベースに尋ねれば、コードを 1 行も書かずに、正しい SQL とその実行結果が返ってきます。内部では、Oracle の DBMS_CLOUD_AI パッケージがテーブルのスキーマを含むプロンプトを組み立て、選択した基盤モデルに送信します。生成された SQL を実データに対して実行し、結果を返すまでのすべてが同一のデータベースセッション内で完結します。

このアーキテクチャなら、AI インフラストラクチャを自前で構築する運用負荷がなくなります。Amazon Bedrock はフルマネージドかつサーバーレスです。プロビジョニングする GPU も、ホストするモデルも、維持する推論エンドポイントもありません。Anthropic、Meta、Amazon といったプロバイダーの基盤モデルに単一の API でアクセスでき、DBMS_CLOUD_AI プロファイルの属性を 1 つ変えるだけでモデルを切り替えられます。セキュリティは、すでに使い慣れた Amazon RDS のモデルに従います。Select AI のリクエストは Virtual Private Cloud (VPC) インターフェイスエンドポイントを経由するため、データは VPC 内に留まり、パブリックインターネットを通りません。DBMS_CLOUD_AI はネイティブな PL/SQL なので、すでに持っている SQL のスキルで生成 AI 機能を構築できます。別途 AI スタックを学んだり維持したりする必要はありません。

本記事は、Amazon RDS 上の Oracle Database 26ai の AI 機能を扱う 3 回シリーズの第 1 回です。今回は、Amazon Bedrock の認証情報の設定から自然言語クエリの実行まで、Select AI を一通り解説します。第 2 回では Oracle AI Vector Search による Retrieval Augmented Generation (RAG) を、第 3 回では SQL プロパティグラフを使った GraphRAG を取り上げ、グラフ探索、ベクトル検索、リレーショナルなフィルタリングを 1 つの SQL クエリで組み合わせる方法を紹介します。

Amazon RDS 上の Oracle Database 26ai の AI 機能

Amazon RDS 上の Oracle Database 26ai と Amazon Bedrock を組み合わせると、次の機能が使えます。

機能 内容 ユースケースの例
Select AI (NL2SQL) 自然言語のプロンプトを SQL に変換し、クエリを実行して、単一の SQL セッション内で結果を返す ビジネスアナリストが SQL を書かずに売上データを照会する。経営層がダッシュボードから即座に答えを得る
DBMS_CLOUD_AI.GENERATE PL/SQL から基盤モデルを呼び出し、チャット、要約、翻訳、合成データ生成を行う CLOB 列に格納されたサポートチケットを要約する。開発/QA 環境向けに現実的なテストデータを生成する。製品説明を翻訳する
Oracle AI Vector Search 標準的な SQL でベクトル埋め込みをリレーショナルデータと並べて保存、インデックス化、検索する 製品カタログのセマンティック検索。類似する顧客プロファイルの検索。レコメンデーションエンジンの実現
Retrieval Augmented Generation (RAG) ベクトル検索と大規模言語モデル (LLM) の生成を組み合わせ、AI の回答を実際のビジネスデータに基づかせる 社内文書やデータベースのレコードを使って質問に答える AI アシスタント
データベース内 ONNX 推論 埋め込み、分類、回帰などの ML モデルを、外部 API を呼び出さずに Oracle 内部で実行する 挿入時に埋め込みを生成する。不正な取引をリアルタイムで分類する。ラウンドトリップなしでリードをスコアリングする
プロパティグラフでの Select AI SQL プロパティグラフに対して、自然言語のプロンプトでグラフの関係を照会する 「サプライヤー X と顧客 Y の間の最短サプライチェーン経路を見せて」

ソリューションの概要

この手順を終えると、次のことができるようになります。

  • AWS Identity and Access Management (IAM) の認証情報を作成し、DBMS_CLOUD.CREATE_CREDENTIAL で Oracle 内に格納する。
  • VPC インターフェイスエンドポイントを設定し、プライベートな Amazon RDS インスタンスからインターネットを経由せずに Amazon Bedrock に到達できるようにする。
  • Claude Sonnet や Amazon Nova などの Amazon Bedrock の基盤モデルを指す DBMS_CLOUD_AI プロファイルを作成、管理する。
  • LLM から Oracle のテーブルに合成テストデータを直接生成する。
  • SELECT AI の SQL 構文を使い、自分のテーブルに対して自然言語クエリを実行する。
  • DBMS_CLOUD_AI.GENERATE() をチャット、SQL の説明、要約に使う。

次の図は全体のアーキテクチャです。

Select AI architecture showing an Amazon RDS for Oracle instance calling Amazon Bedrock through a VPC interface endpoint, with IAM credentials signing each request

図 1: Amazon RDS for Oracle 26ai と Amazon Bedrock による Select AI

主なコンポーネントは次のとおりです。

コンポーネント 役割
Amazon RDS for Oracle Database 26ai DBMS_CLOUD_AI を含み、Select AI のクエリを実行する
Amazon Bedrock 基盤モデル (Claude、Nova) へのマネージドなアクセスを提供する
VPC インターフェイスエンドポイント (bedrock-runtime) プライベートな Amazon RDS のサブネットからの Amazon Bedrock API 呼び出しを、インターネットを経由せずにルーティングする
IAM 認証情報 DBMS_CLOUD.CREATE_CREDENTIAL で Oracle に格納したアクセスキー ID とシークレット。Oracle がすべての Amazon Bedrock 呼び出しを SigV4 で署名するために使う

動作の流れ: ユーザーが SQL クライアントで自然言語の質問を入力します。Oracle が SELECT AI ステートメントを受け取り、質問と対象テーブルのスキーマメタデータを含むプロンプトを構築します。そして IAM ユーザーのアクセスキーで署名したリクエストを、VPC インターフェイスエンドポイント経由で HTTPS により Amazon Bedrock に送信します。LLM が返した SQL を Oracle が実データに対して実行し、結果セットを返します。ここまでのすべてが同一の SQL セッション内で行われます。

前提条件

始める前に、次を確認してください。

  • プライベートな VPC サブネットにデプロイした Amazon RDS for Oracle Database 26ai インスタンス。本記事では、データベースインスタンスとして一般的なパターンかつ推奨構成である、プライベートな Amazon RDS for Oracle インスタンスを前提とします。テスト目的であれば、インスタンスをパブリックに公開することもできます。
  • DBMS_CLOUD パッケージと DBMS_CLOUD_AI パッケージがインストールされていること (確認方法はステップ 1 で説明します)。
  • IAM ユーザーと VPC エンドポイントを作成する権限を持つ AWS アカウント。
  • 対象の AWS リージョンで Amazon Bedrock が利用できること。Amazon Bedrock ではほとんどの基盤モデルがデフォルトで利用可能です。必要に応じて Amazon Bedrock コンソールの モデルアクセス で確認してください。
  • 踏み台ホストまたは AWS Systems Manager Session Manager のポートフォワーディング経由で Amazon RDS インスタンスに接続した SQL Developer、SQLcl、その他の Oracle SQL クライアント。
  • Amazon RDS インスタンスに関連付けられた VPC ID、サブネット ID、セキュリティグループ ID。
  • DBMS_CLOUDDBMS_CLOUD_AI の両方に EXECUTE 権限を持つデータベースユーザー (例: AIUSER)。必要なら、先に作成しておきます。
GRANT EXECUTE ON DBMS_CLOUD TO AIUSER;
GRANT EXECUTE ON DBMS_CLOUD_AI TO AIUSER;

ステップ 1: DBMS_CLOUD_AI が利用可能か確認する

設定を始める前に、必要なパッケージがインストールされていることを確認します。Amazon RDS for Oracle 26ai では、インスタンス作成時に DBMS_CLOUDDBMS_CLOUD_AI がデフォルトでインストールされます。

SELECT object_name, object_type, status
FROM   dba_objects
WHERE  object_name IN ('DBMS_CLOUD', 'DBMS_CLOUD_AI')
AND    object_type IN ('PACKAGE', 'PACKAGE BODY')
ORDER  BY 1, 2;

4 行が返るはずです。DBMS_CLOUDDBMS_CLOUD_AI のそれぞれについて PACKAGE と PACKAGE BODY です。パッケージが見つからない場合は、Amazon RDS インスタンスが Oracle Database 26ai で動作しているか確認してください。

ステップ 2: Amazon Bedrock ランタイム用の VPC インターフェイスエンドポイントを作成する

Amazon RDS for Oracle DB インスタンスは、ポート 443 (HTTPS) で Amazon Bedrock ランタイムのエンドポイント (bedrock-runtime.<region>.amazonaws.com) に到達できる必要があります。この通信を AWS ネットワーク内のプライベートな経路に留め、インターネットアクセスを不要にするには、Amazon Bedrock ランタイムサービス用の VPC インターフェイスエンドポイントを作成します。Amazon RDS インスタンスをプライベートに保てるため、VPC インターフェイスエンドポイントの利用が推奨されます。本記事の例でも VPC インターフェイスエンドポイントを使います。

もう 1 つの選択肢は NAT ゲートウェイです。NAT ゲートウェイを使う場合、DB インスタンスのサブネットに NAT ゲートウェイ経由でインターネットへ向かうルートが必要です。NAT ゲートウェイの設定は、ドキュメントの「Amazon VPC network requirements」セクションのオプション 2 を参照してください。

エンドポイントを作成する

  1. AWS マネジメントコンソールで VPCエンドポイントエンドポイントを作成 の順に移動します。
  2. サービスカテゴリAWS サービス を選択します。
  3. サービス名 の検索で bedrock-runtime と入力し、com.amazonaws.<your-region>.bedrock-runtime を選択します。
  4. VPC では、Amazon RDS インスタンスがある VPC を選択します。
  5. サブネット では、Amazon RDS の DB サブネットグループが使っているサブネットと同じものを選択します。
  6. セキュリティグループ では、Amazon RDS インスタンスのセキュリティグループからの インバウンド TCP ポート 443 を許可するセキュリティグループをアタッチします。
  7. ポリシー では フルアクセス を選択します。
  8. プライベート DNS 名 を有効にします。ここが重要です。有効にすることで Oracle が bedrock-runtime.<region>.amazonaws.com をプライベート IP に解決し、通信が VPC 内でルーティングされます。
  9. エンドポイントを作成 を選択し、状態が 利用可能 になるまで待ちます。

ステップ 3: Amazon Bedrock エンドポイントへのネットワーク ACL アクセスを許可する

Oracle はアクセスコントロールリスト (ACL) でアウトバウンドのネットワークアクセスを制御します。AIUSER ユーザーに、bedrock-runtime.<your-region>.amazonaws.com への HTTP/HTTPS のアウトバウンド接続を許可します。

BEGIN
  DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
    host => 'bedrock-runtime.<your-region>.amazonaws.com',
    ace  => xs$ace_type(
               privilege_list => xs$name_list('connect', 'resolve', 'http'),
               principal_name => 'AIUSER',
               principal_type => xs_acl.ptype_db
             )
  );
END;
/

DNS 解決を確認する

エンドポイントが有効になったら、Oracle が Amazon Bedrock のホスト名をプライベート IP に解決することを確認します。

-- Should return a private IP, not a public AWS IP
SELECT UTL_INADDR.GET_HOST_ADDRESS(
    'bedrock-runtime.<your-region>.amazonaws.com'
) AS resolved_ip
FROM dual;

出力例:

RESOLVED_IP
---------------
172.31.17.236

ステップ 4: AWS の認証情報を作成し Oracle Database に格納する

DBMS_CLOUD_AI は IAM のアクセスキー ID とシークレットアクセスキーで Amazon Bedrock に認証します。設定手順としては、Amazon Bedrock の基盤モデル呼び出しに必要な最小限の権限だけを付与した専用の IAM ユーザーを作成し、そのユーザーのアクセスキーを発行します。認証情報を取得したら、DBMS_CLOUD.CREATE_CREDENTIAL を呼び出して Oracle データベース内に格納します。Oracle はキーを保存時に暗号化し、DBMS_CLOUD_AI がアウトバウンドの Amazon Bedrock API リクエストの署名に自動的に使用します。

ステップ 4a: Amazon Bedrock アクセス用の IAM ユーザーを作成する

次のポリシーを持つ IAM ユーザーまたはロールを作成します (既存の ID にアタッチしても構いません)。

{
  "Version": "2012-10-17",
  "Statement": [{
    "Sid": "BedrockInvoke",
    "Effect": "Allow",
    "Action": ["bedrock:InvokeModel", "bedrock:InvokeModelWithResponseStream"],
    "Resource": ["arn:aws:bedrock:region::foundation-model/*"]
  }]
}

特定のモデルだけにアクセスを制限するには、ワイルドカードを次のように個別のモデル ARN に置き換えます。

arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-sonnet-4-5-20250929-v1:0

ステップ 4b: アクセスキーを発行する

  1. 作成したユーザーを開き、セキュリティ認証情報 タブに移動します。
  2. アクセスキーアクセスキーを作成 を選択します。
  3. ユースケースを選択し、アクセスキーを作成 を選択します。
  4. アクセスキー ID とシークレットアクセスキーをコピーまたはダウンロードします。

セキュリティに関する注意: アクセスキーは長期的な認証情報です。本番環境では、IAM コンソールで定期的にローテーションすることを検討してください。この IAM ユーザーにはコンソールアクセス (パスワード) を与えないようにします。

ステップ 4c: IAM ユーザーのアクセスキーを Oracle に格納する

Amazon Bedrock のモデルアクセス: 2025 年時点で、Amazon Bedrock のほとんどの基盤モデルはデフォルトで利用可能で、明示的な有効化は不要です。アカウントとリージョンでのモデルの利用可否は、Amazon Bedrock コンソールモデルアクセス で確認または変更できます。Amazon RDS for Oracle 26ai の DBMS_CLOUD_AI で動作を検証済みのモデルは次のとおりです。

モデル名 モデル ID 備考
Anthropic Claude Sonnet 4.6 us.anthropic.claude-sonnet-4-6 NL2SQL の精度が最も高い (推奨)
Anthropic Claude Haiku 4.5 us.anthropic.claude-haiku-4-5-20251001-v1:0 最速 / 最低コスト
Amazon Nova Pro us.amazon.nova-pro-v1:0 高性能な AWS ネイティブモデル
Amazon Nova Lite amazon.nova-lite-v1:0 単純なクエリ向けの超高速モデル

重要: クロスリージョン推論のプレフィックス: Anthropic Claude と Amazon Nova Pro のモデル ID には us. プレフィックスが必要です。このプレフィックスによってリクエストがクロスリージョン推論プロファイル経由でルーティングされ、可用性が高まります。プレフィックスのないベースモデル ID を使うと ORA-20400: HTTP 400 が返ります。

DBMS_CLOUD.CREATE_CREDENTIAL を使い、ステップ 4a で取得したアクセスキーとシークレットキーを Oracle の認証情報ストアに格納します。Oracle は認証情報を暗号化し、所有ユーザーだけがアクセスできるようにします。

BEGIN
  DBMS_CLOUD.CREATE_CREDENTIAL(
    credential_name => 'AWS',
    username        => '<your-access-key-id>',
    password        => '<your-secret-access-key>'
  );
END;
/

認証情報が正しく作成されたか確認します。

SELECT credential_name, username, enabled
FROM   all_credentials
WHERE  credential_name = 'AWS';

username 列には指定したアクセスキー ID が表示されます。シークレットキーは暗号化されて格納され、クエリでは返りません。

ステップ 5: サンプルテーブルを作成する

Select AI のデモには E コマースのスキーマを使います。既存のテーブルがある場合は、ステップ 6 に進んでプロファイルの object_list で自分のテーブルを指定してください。

CREATE TABLE customers (
  customer_id  NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  first_name   VARCHAR2(50),
  last_name    VARCHAR2(50),
  email        VARCHAR2(100),
  city         VARCHAR2(50),
  country      VARCHAR2(50),
  signup_date  DATE,
  segment      VARCHAR2(20)  -- 'PREMIUM', 'STANDARD', 'NEW'
);

CREATE TABLE products (
  product_id   NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  product_name VARCHAR2(100),
  category     VARCHAR2(50),
  unit_price   NUMBER(10,2),
  stock_qty    NUMBER
);

CREATE TABLE orders (
  order_id     NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  customer_id  NUMBER REFERENCES customers(customer_id),
  order_date   DATE,
  status       VARCHAR2(20),  -- 'COMPLETED', 'PENDING', 'CANCELLED'
  total_amount NUMBER(10,2)
);

CREATE TABLE order_items (
  item_id     NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  order_id    NUMBER REFERENCES orders(order_id),
  product_id  NUMBER REFERENCES products(product_id),
  quantity    NUMBER,
  unit_price  NUMBER(10,2)
);

ステップ 6: DBMS_CLOUD_AI プロファイルを作成する

プロファイル は Select AI の中心となる設定オブジェクトです。AI プロバイダー、認証情報、呼び出す Amazon Bedrock のモデル、そしてプロンプトのコンテキストにスキーマを含めるデータベーステーブルを指定します。

DBMS_CLOUD_AI はデフォルトで bedrock-runtime.us-east-1.amazonaws.com に接続します。us-east-1 以外のリージョンの Amazon Bedrock ランタイムエンドポイントを使う場合は、プロファイル属性の JSON に region 属性と target_language 属性を含めます。region には Amazon Bedrock ランタイムエンドポイントがあるリージョン (例: us-west-2) を設定します。region を設定する場合は、target_language (または source_language) も含める必要があります。chatrunsql のように翻訳を使わないアクションでも、この 2 つの属性は必ずセットで設定してください。target_language の値が影響するのは translate アクションだけです。セットで指定しなければならないのは、Oracle の DBMS_CLOUD_AI パッケージに既知の制限があるためです。region なしで target_language だけを指定した場合、プロファイルは bedrock-runtime.us-east-1.amazonaws.com を使い続けます。VPC インターフェイスエンドポイントが別のリージョンにあると、Oracle はエンドポイントが存在しないリージョンへパブリックインターネット経由で接続を試み、ネットワーク構成でパブリックアクセスを許可していない限り、すべての呼び出しが ORA-30699 でタイムアウトします。

次の例では、Amazon Bedrock のクロスリージョン推論 (CRIS) 経由で Anthropic Claude Sonnet 4.6 を使うプロファイルを作成します。

BEGIN
  DBMS_CLOUD_AI.CREATE_PROFILE(
    profile_name => 'CLAUDE_SONNET',
    attributes   =>
      '{"provider":        "aws",
        "credential_name": "AWS",
        "region":          "<your-bedrock-region>",
        "model":           "us.anthropic.claude-sonnet-4-6",
        "target_language": "en",
        "object_list": [
          {"owner": "AIUSER", "name": "CUSTOMERS"},
          {"owner": "AIUSER", "name": "PRODUCTS"},
          {"owner": "AIUSER", "name": "ORDERS"},
          {"owner": "AIUSER", "name": "ORDER_ITEMS"}
        ]
      }'
  );
END;
/

object_list は、LLM 向けのスキーマコンテキストを構築するときに含めるテーブルとビューを Oracle に伝えます。Oracle はデータディクショナリから列名、データ型、列コメントを自動的に読み取り、プロンプトに組み込みます。スキーマを手作業で記述する必要はありません。

異なるモデルを指すプロファイルを複数作成し、セッションごとに切り替えることもできます。

-- Amazon Nova Pro profile
BEGIN
  DBMS_CLOUD_AI.CREATE_PROFILE(
    profile_name => 'NOVA_PRO',
    attributes   =>
      '{"provider":        "aws",
        "credential_name": "AWS",
        "region":          "<your-bedrock-region>",
        "model":           "us.amazon.nova-pro-v1:0",
        "target_language": "en",
        "object_list": [
          {"owner": "AIUSER", "name": "CUSTOMERS"},
          {"owner": "AIUSER", "name": "PRODUCTS"},
          {"owner": "AIUSER", "name": "ORDERS"},
          {"owner": "AIUSER", "name": "ORDER_ITEMS"}
        ]
      }'
  );
END;
/

セッションでプロファイルを有効化し、確認します。

EXECUTE DBMS_CLOUD_AI.SET_PROFILE('CLAUDE_SONNET');

-- Confirm active profile
SELECT DBMS_CLOUD_AI.GET_PROFILE() FROM dual;

-- List all profiles
SELECT profile_name, status FROM user_cloud_ai_profiles;

ステップ 7: 合成データを生成する

Amazon Bedrock にアクセスできる AI プロファイルを設定したら、DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA でテーブルに現実的なテストデータを自動投入できます。GENERATE_SYNTHETIC_DATA は、指定した AI プロファイル経由で LLM を使い、文脈に沿ったレコードを生成します。

object_list パラメータには、対象テーブルとそれぞれの生成レコード数を指定する JSON 配列を渡します。

次の PL/SQL ブロックを実行して、4 つのテーブルに合成データを生成します。

BEGIN
  DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA(
    profile_name => 'CLAUDE_SONNET',
    object_list  => '[
      {"owner": "AIUSER", "name": "CUSTOMERS", "record_count": 50},
      {"owner": "AIUSER", "name": "PRODUCTS", "record_count": 250},
      {"owner": "AIUSER", "name": "ORDERS", "record_count": 500},
      {"owner": "AIUSER", "name": "ORDER_ITEMS", "record_count": 1000}
    ]'
  );
END;
/

実行すると、顧客 50 件、製品 250 件、注文 500 件、注文明細 1,000 件が生成されます。テストデータを手作業で作り込まなくても、クエリ、レポート、アプリケーションロジックの検証に使える現実的なデータセットが手に入ります。

内部では、Oracle が対象テーブルの DDL、制約、メタデータを読み取り、データ型と外部キーを満たす現実的な行を生成するよう LLM にプロンプトを出します。生成方法は次の要素でカスタマイズできます。

  • sample_rows: 既存のレコードを例として渡し、生成されるデータを実データのスタイルに合わせます。
  • user_prompt: 「英国の郵便番号のみ」「2009 年公開の映画」といったルールを指定します。
  • テーブル統計 (デフォルトで有効): 列の最大値・最小値と個別値のリストを使って出力範囲を制限します。
  • 列コメント: 列にヒント (例: 許可される Status の値) を付けると、LLM は生成時にヒントに従います。
  • 一意制約: LLM のレスポンスから重複行を自動的に破棄します。

ステップ 8: Select AI で自然言語クエリを実行する

プロファイルを設定してデータを投入したら、SELECT AI の SQL 構文で平易な英語のままリレーショナルデータを照会できます。Oracle はステートメントを受け取り、質問と object_list のテーブルスキーマメタデータを組み合わせたプロンプトを構築し、Amazon Bedrock のモデルを呼び出して結果を返します。

実行前に生成された SQL を確認する

showsql を使うと、LLM が生成した SQL を実行せずに確認できます。精度の検証や信頼性の確認に役立ちます。

SELECT AI showsql how many customers do we have per country;

出力例:

SELECT country, COUNT(*) AS customer_count
FROM   customers
GROUP  BY country
ORDER  BY customer_count DESC

実行して結果を返す

runsql に切り替えると、生成された SQL を実行して結果を返します。

SELECT AI runsql how many customers do we have per country;

SELECT AI runsql what is the total revenue by product category;

SELECT AI runsql who are the top 3 customers by total spend;

SELECT AI runsql how many orders were cancelled;

SELECT AI runsql show me all pending orders with customer name and amount;

結果を自然言語の文章で返す

narrate アクションは、クエリ結果を平易な英語で要約して返します。ビジネスレポートやダッシュボードに適しています。

SELECT AI narrate give me a sales summary for 2024;

SELECT AI narrate who are our best customers and what do they buy;

1 つ目のクエリの出力例:

Based on the 2024 sales data, total completed revenue is $14,299.98 across six completed orders.
Frank Wilson is the top-spending customer at $7,000.00, followed by Alice Johnson at $6,099.99.
The Software category leads all product categories in revenue. Two orders remain in Pending status
with a combined value of $2,500.00.

既存の SQL を平易な英語で説明する

explainsql アクションは、既存の SQL クエリを受け取って平易な英語の説明を返します。ドキュメント作成やオンボーディングに役立ちます。

SELECT AI explainsql
  SELECT c.first_name, c.last_name, SUM(o.total_amount) AS total
  FROM   customers c
  JOIN   orders o ON c.customer_id = o.customer_id
  WHERE  o.status = 'COMPLETED'
  GROUP  BY c.first_name, c.last_name
  ORDER  BY total DESC;

出力例:

Query Analysis & Oracle SQL Conversion

Original Query Issues:
- Missing schema names
- Missing double quotes around case-sensitive identifiers
- 'COMPLETED' is not in double quotes in the question; must use UPPER() for case-insensitive comparison

Converted Oracle SQL:

SELECT
    c."FIRST_NAME"        AS first_name,
    c."LAST_NAME"         AS last_name,
    SUM(o."TOTAL_AMOUNT") AS total
FROM
    "AI_TEST"."CUSTOMERS" c
    JOIN "AI_TEST"."ORDERS" o
        ON c."CUSTOMER_ID" = o."CUSTOMER_ID"
WHERE
    UPPER(o."STATUS") = UPPER('COMPLETED')
GROUP BY
    c."FIRST_NAME",
    c."LAST_NAME"
ORDER BY
    total DESC;

ステップ 9: DBMS_CLOUD_AI.GENERATE() を他の AI タスクに使う

SELECT AI 構文に加えて、DBMS_CLOUD_AI.GENERATE() を使うと Amazon Bedrock のモデルに直接アクセスできます。自由形式のチャット、要約、プロンプトからの SQL 生成のように、データベースのスキーマコンテキストを必要としないタスクに使えます。

テキストを要約する

SELECT DBMS_CLOUD_AI.GENERATE(
  prompt       => 'Oracle Database 26ai introduces AI Vector Search, hybrid BM25 and semantic
                   search, an embedded ONNX inference runtime, SQL/PGQ property graph queries,
                   JSON-Relational Duality Views, native BOOLEAN type, and lock-free reservations
                   for high-concurrency workloads.',
  profile_name => 'CLAUDE_SONNET',
  action       => 'summarize'
) AS summary
FROM dual;

インラインのテキストを要約するだけでなく、DBMS_CLOUD_AI.GENERATE を Amazon Simple Storage Service (Amazon S3) バケットに保存された文書を直接処理することもできます。次のクエリは Amazon S3 から PDF を取得し、DBMS_VECTOR_CHAIN.UTL_TO_TEXT でテキストに変換します。そのうえで内容を LLM に渡して要約させます。ここまでを 1 つの SQL ステートメントで実行します。

SELECT DBMS_CLOUD_AI.GENERATE(
  prompt => DBMS_VECTOR_CHAIN.UTL_TO_TEXT(
    DBMS_CLOUD.GET_OBJECT(
      credential_name => 'AWS',
      object_uri => 'https://s3.us-west-2.amazonaws.com/<Bucket Name>/<File Name>')),
  profile_name => 'CLAUDE_SONNET',
  action => 'SUMMARIZE')
FROM DUAL;
/

内部では、3 つの関数が 1 つの SQL ステートメント内で連鎖します。DBMS_CLOUD.GET_OBJECT が指定した認証情報を使って Amazon S3 バケットから PDF 文書を取得します。DBMS_VECTOR_CHAIN.UTL_TO_TEXT がバイナリの内容を LLM が処理できるプレーンテキストに変換します。DBMS_CLOUD_AI.GENERATE が抽出したテキストを AI プロファイル経由で Amazon Bedrock に送信し、要約を返します。Amazon RDS for Oracle インスタンスから Amazon S3 に到達できるようにするには、前提条件が 2 つ追加で必要です。1 つは Amazon S3 用の VPC ゲートウェイエンドポイントで、Amazon RDS のサブネットに関連付けられたルートテーブルに追加し、通信をパブリックインターネットから切り離します。もう 1 つは対象バケットへの s3:GetObjects3:ListBucket の権限を付与する IAM ポリシーで、ステップ 4a で作成したユーザーにアタッチします。

トラブルシューティング

次の表に、遭遇しやすいエラーと根本原因、対処方法をまとめます。

エラー 根本原因 対処
ORA-30699: network connection failed: connection timed out bedrock-runtime の VPC エンドポイントがない、またはプロファイルの "region" が未指定か誤っている 正しいリージョンに bedrock-runtime の VPC インターフェイスエンドポイントを作成する。すべてのプロファイルに "region": "<your-region>" を追加する
DNS がパブリック IP に解決される VPC エンドポイントでプライベート DNS 名が有効になっていない エンドポイントを編集してプライベート DNS 名を有効にする
ORA-20400: HTTP 400 モデル ID が単一リージョン / オンデマンドの形式 (旧形式) になっている モデル ID にクロスリージョン推論の us. プレフィックスを追加する
ORA-20404: HTTP 404 そのリージョンでモデルが利用できない、またはアクセスが有効になっていない Amazon Bedrock → モデルアクセスでリージョンでのモデルの利用可否を確認する。モデル ID が正しいことを確認する
ORA-20400: HTTP 403 IAM ユーザーに bedrock:InvokeModel の権限がない BedrockInvokeModelPolicy が IAM ユーザーにアタッチされているか確認する
ORA-20001: profile not found プロファイルが作成されていない、または名前が間違っている SELECT profile_name FROM user_cloud_ai_profiles を実行する
ORA-29024: Certificate validation failure Oracle ウォレットに Amazon Bedrock の CA 証明書がない Amazon RDS では file:/rdsdbdata/rds-metadata/dbms_cloud_wallet にプリインストールされたウォレットに必要な CA が含まれているため、対応は不要

クリーンアップ

この手順で作成したリソースを削除するには、次を実行します。

-- Drop AI profiles
EXECUTE DBMS_CLOUD_AI.DROP_PROFILE('CLAUDE_SONNET');
EXECUTE DBMS_CLOUD_AI.DROP_PROFILE('NOVA_PRO');

-- Drop the Bedrock credential
EXECUTE DBMS_CLOUD.DROP_CREDENTIAL('AWS');

-- Drop sample tables (if created for this walkthrough)
DROP TABLE order_items;
DROP TABLE orders;
DROP TABLE products;
DROP TABLE customers;

AWS マネジメントコンソールでは、次の手順を実行します。

  • IAM → ユーザー で、ステップ 4a で作成した IAM ユーザーを削除します。
  • VPC → エンドポイント で、bedrock-runtime の VPC インターフェイスエンドポイントを削除します。

まとめ

本記事では、AI プロバイダーとして Amazon Bedrock を使い、Amazon RDS for Oracle Database 26ai で Select AI を設定する一連の手順を説明しました。IAM コンソールでの AWS 認証情報の作成、Oracle への認証情報の格納、VPC エンドポイントのセットアップ、自然言語クエリの実行までを、パブリックインターネットアクセスのないプライベートな Amazon RDS インスタンスで行いました。

Select AI を使えば、データを活用する人に SQL のスキルは不要になり、AI のロジックは信頼できる Oracle 環境の内側に留まります。ビジネスアナリストは SQL Developer や Oracle に接続したツールから、平易な英語で本番データを直接照会できます。データベース管理者は、モデルに公開するテーブル、有効にする基盤モデル、使用する IAM 認証情報を完全に制御し続けられます。いずれも Oracle 標準のプロファイルと認証情報の仕組みで管理できます。

本記事は Oracle Database 26ai と Amazon Bedrock を扱う 3 回シリーズの第 1 回です。

  • 第 1 回 (本記事): Amazon RDS での Select AI と DBMS_CLOUD_AI による自然言語クエリ。
  • 第 2 回: Oracle 26ai のネイティブなベクトル検索と Amazon Bedrock による RAG パイプラインの構築。
  • 第 3 回: Amazon RDS 上の Oracle Database 26ai と Amazon Bedrock によるデータベース内 GraphRAG。

著者について

Yamuna Palasamudram

Yamuna Palasamudram

Yamuna は AWS のプリンシパルデータベーススペシャリストソリューションアーキテクトです。AWS のリレーショナルデータベースチームで、Oracle などの商用データベースエンジンを担当しています。お客様と協力して AWS 上のリレーショナルデータベースワークロードの設計、デプロイ、最適化を支援し、技術的なガイダンスを提供することにやりがいを感じています。

Ibrahim Emara

Ibrahim Emara

Ibrahim は Amazon Web Services のデータベーススペシャリストソリューションアーキテクトで、AWS のお客様向けにデータベースソリューションの設計と実装を担当しています。Oracle、PostgreSQL、Amazon Aurora、AWS Database Migration Service に関する専門知識を活かし、クラウド移行の推進とデータベースパフォーマンスの改善に取り組んでいます。

Minu Hong

Minu Hong

Minu は AWS の Amazon RDS for Oracle のシニアプロダクトマネージャーです。クラウドネイティブかつ AI を活用したソリューションで、お客様がデータの可能性を最大限に引き出せるよう支援することに情熱を注いでいます。仕事以外では、旅行、テニス、スキー、料理を楽しんでいます。


この記事は Solutions Architect の 矢木 覚 が翻訳しました。