はじめに
Autonomous Databaseで使用することの出来る機能、Select AI with RAGを使えばRAGのシステムを簡単に構成することが出来ます。
今回は、Selct AI with RAGを使ってRAG構成のチャットアプリをOracle APEX上に作成していきます。
必要な製品はAutonomous Database(23ai)、オブジェクト・ストア(OCIのオブジェクトストレージ以外にもAWSのS3等が使用可能)、AIプロバイダー(OpenAI、 Azure OpenAI、Cohere、Google Geminiなどの様々なAIプロバイダーから選択可能)のみとなります。
作成するアプリケーションの構成図は以下の様になります。今回はAPEXをインターフェイスとして使用します。

【前提条件】
- OCIのアカウントを作成済みであること
(OCIのアカウントをお持ちでない場合は、こちらを参考にご作成下さい。) - OCI生成AIサービスを使用可能な大阪リージョン、シカゴリージョン等をホーム・リージョン、若しくはサブスクライブしてあること(本チュートリアルではシカゴリージョンを使用します)。詳しくは、Pretrained Foundational Models in Generative AIをご確認ください。
【所要時間】
1時間程
1. 準備
1-1. オブジェクト・ストアの作成
1.オブジェクト・ストアを作成します。本記事ではOCIのオブジェクトストレージを使用します。OCIのオブジェクトストレージの作成方法は、こちらをご参照ください。
- 使用可能なオブジェクトストレージ(中身が空、若しくはベクトル化しても問題ないファイルのみ格納されている場合)を既にお持ちの場合は、作成不要です。
- OCIのオブジェクトストレージ以外にも、AWSのS3等でも問題ありません。
2.オブジェクト・ストアを作成したら、こちらをクリックしrocket.txtというテキストファイルをダウンロードします。
rocket.txtにはOraBoosterという架空のロケットエンジンの概要が記載されています。以下がrocket.txtの内容です。

3.ダウンロードしたrocket.txtをオブジェクト・ストアにアップロードし、オブジェクト・ストアのURIを取得します。このURIは後程使用するので、メモをしておきます。(例:https://objectstorage.ap-tokyo-1.oraclecloud.com/n/xxxxxxxxx/b/xxxxxxxxxx/o/)
OCIのオブジェクトストレージでのURI取得方法
1-2. APIキーの取得
OCIのオブジェクトストレージを使用する場合、また、AIプロバイダーとしてOCI生成AIサービスを使用する場合はこちらの手順に沿ってOCIのリソースにアクセスするためのAPIキーを取得します。
OCIのオブジェクトストレージを使用しない場合、OCI生成AIサービスをAIプロバイダーとして使用しない場合は、それぞれのベンダー、プロバイダーから出ているマニュアルなどを参考にAPIキーを取得してください。
2. 環境設定
2-1. ADBインスタンスとAPEXワークスペースの作成
1.Select AI with RAGはADBの機能なので、使用にはADBインスタンスが必要です。ADBのインスタンスが未作成の場合は101: ADBインスタンスを作成してみようを参考に、ADBインスタンスを作成します。
ADBインスタンス作成時に、以下の点に注意してください。
- 名前:任意(同一コンパートメント内に、同じ名前のADBインスタンスは作成不可のため注意)
- データベース・バージョンの選択:23ai(今回はベクトル検索を行いますので、ベクトル検索に対応している23aiを選択します)
- Always Free:オン(無償でお試しいただく場合)
2. 101: ADBインスタンスを作成してみようの3-3. データベース・ユーザーを作成してみよう(コマンドライン)を参考に、Database ActionsのSQLワークシートから、チュートリアルを行うユーザーを作成し、必要なロールを付与します。
以下のSQLを実行し、
- SELECT_AI_USERというユーザーを作成、必要なロールを付与
- SELECT AIの利用に必要なDBMS_CLOUD_AIパッケージの実行権限を付与
GRANT DWROLE, UNLIMITED TABLESPACE TO select_ai_user IDENTIFIED BY Welcome12345#;
GRANT EXECUTE ON DBMS_CLOUD_AI TO select_ai_user;
3. ツール構成タブ配下のAPEXのURLをコピーし、APEXにアクセスします。

4. コピーしたURLにアクセスし、APEXの管理サービスにログインします。パスワードはADBのADMINパスワードと同じです。

6. 先程SELECT_AI_USERというスキーマを作成したので、既存のスキーマを選択します。

7. 以下の通りに選択・入力し、ワークスペースの作成をクリックします。
- データベース・ユーザー:SELECT_AI_USER(アイコンをクリックし、SELECT_AI_USERスキーマを選択)
- ワークスペース名:SELECT_AI_USER(データベース・ユーザーを選択すると自動で入力されます)
- ワークスペース・ユーザー名:SELECT_AI_USER
- ワークスペース・パスワード:Welcome12345#(任意)

8. 画面上部にメッセージが表示されます。SELECT_AI_USERをクリックし、ワークスペースのサインイン画面へ移動します。

9. 先ほど設定したワークスペースのパスワードを入力します(本記事の場合はWelcome12345#)。

APEXのワークスペースを作成し、ログインする事が出来ました。
2-2.Select AIの設定
それではSelect AIを利用するために必要なAPIキーの登録と、AIプロファイルの作成します。
1. SQLワークショップ>SQLコマンドをクリックします。

2. DBMS_CLOUD.CREATE_CREDENTIALプロシージャを使用して、OCI生成AIサービスに接続するためのクレデンシャルを作成(APIキーを登録)します。

以下の通りにOCID等を置き換え、プロシージャを実行します。
-
credential_name:任意(本チュートリアルではOCI_CREDとしています)
-
user_ocid:先ほどメモを取った構成ファイルを参照し、ユーザーのOCIDを入力
-
tenancy_ocid:先ほどメモを取った構成ファイルを参照し、使用しているテナンシーのOCIDを入力
-
private_key:先程取得した秘密キーの内容をコピー&ペースト
-
fingerprint:先ほどメモを取った構成ファイルを参照し、フィンガープリントを入力
BEGIN DBMS_CLOUD.CREATE_CREDENTIAL( credential_name => 'OCI_CRED', user_ocid => 'ocid1.user.oc1..axxxxxxxxxxxxxxxxq', tenancy_ocid => 'ocid1.tenancy.oc1..aaxxxxxxxxxxxxa', private_key => '-----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiGQEFA<中略>1D3iheu1ct50SB0aIQz9Ow== -----END PRIVATE KEY-----', fingerprint => 'xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx' ); END; /
これでクレデンシャルを作成する事が出来ました。このクレデンシャルは、この後プロファイルを作成する際に繰り返し使用しますので、credential_nameをメモしておきます。
3. DBMS_CLOUD_AI.CREATE_PROFILEプロシージャを使用して、AIプロファイルを作成します。どのLLMを使用するか、どのエンベッディングモデルを使用するかこちらで指定します。
- プロファイル名:RAG_PROFILE(任意)
- provider:oci(本記事ではOCI生成AIサービスをAIプロバイダーとして使用)
- credential_name:OCI_CRED(先ほど作成したクレデンシャル名を指定)
- vector_index_name: MY_INDEX(任意)
- embedding_model: cohere.embed-v4.0(任意)
- model: xai.grok-code-fast-1(大阪リージョン等使用される場合には、cohere.command-a-03-2025等をご使用ください)
BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
profile_name =>'RAG_PROFILE',
attributes =>'{"provider": "oci",
"credential_name": "OCI_CRED",
"vector_index_name": "MY_INDEX",
"embedding_model": "cohere.embed-v4.0",
"model": "xai.grok-code-fast-1"
}');
end;
/
4. DBMS_CLOUD_AI.CREATE_VECTOR_INDEXプロシージャを使用して、ベクトル索引を作成します。
-
索引名:MY_INDEX(プロファイル作成時に指定した索引名)
-
vector_db_provider:oracle
-
location:先程作成したオブジェクトストレージのURI
-
object_storage_credential_name:OCI_CRED(先ほど作成したオブジェクトストレージのクレデンシャル)
-
profile_name:RAG_PROFILE(先程作成したプロファイル名)
-
vector_dimension:1536
-
vector_distance_metric:cosine
-
chunk_overlap:128
-
chunk_size:400
-
refresh_rate:1(ベクトル索引を更新する間隔。本チュートリアルでは1分毎に索引を更新するように設定します)
BEGIN BEGIN DBMS_CLOUD_AI.CREATE_VECTOR_INDEX( index_name => 'MY_INDEX', attributes => '{"vector_db_provider": "oracle", "location": "https://objectstorage.ap-tokyo-1.oraclecloud.com/n/xxxxxxxxx/b/xxxxxxxxxx/o/", "object_storage_credential_name": "OCI_CRED", "profile_name": "RAG_PROFILE", "vector_dimension": 1536, "vector_distance_metric": "cosine", "chunk_overlap":128, "chunk_size":400, "refresh_rate":1 }'); END; /
DBMS_CLOUD_AI.CREATE_VECTOR_INDEXプロシージャを使用するだけで、RAG構成にするために必要な以下の作業が自動で行われます。
-
DBMS_CLOUD_AI.CREATE_VECTOR_INDEXプロシージャ実行時:
- オブジェクト・ストア内データのチャンキング
- エンベッディングモデルを使用し、チャンク化されたデータをエンベッディング
- ベクトル化されたデータを、ベクトル・ストアに格納
- ベクトル索引の作成
- ベクトル索引の自動更新(→ファイル追加時に手動での索引更新不要)
-
ユーザーから問い合わせがあった時:
- ユーザーからの問い合わせ(プロンプト)のベクトル化
- ベクトル化されたプロンプトを使ってベクトル検索
- ベクトル検索の結果を使ってLLMへ送信するプロンプトの補強
- LLMへのプロンプトの自動送信
- 生成された回答の表示(+回答生成に使用したファイルとその格納先も表示)
これでSELECT AI with RAGの準備は完了です。
2-3.APEXアプリのインポート
1. APEXのワークスペースにログインすると、この様な画面が表示されます。新たなアプリを作成するので、アプリケーション・ビルダーをクリックします。

2. 今回は既に作成済みのアプリケーションをインポートするので、インポートをクリックします。

3. インポートするアプリケーションをダウンロードします。こちらをクリックし、f101.zipというファイルをダウンロードします。
4. ダウンロードしたzipファイルをドラッグアンドドロップし、次へをクリックします。

7. サポートするオブジェクトのインストールもクリックし、表をインポートします。

これでAPEXのアプリケーションをインポートする事が出来ました。
3.Select AI with RAGを使ってみる
3-1.RAGを使用した自然言語問合せの実行
早速Select AI with RAGを試してみます。
2.アプリケーション一覧が表示されるので、インポートしたADB Chatアプリの実行ボタンをクリックします。

3.作成したAPEXワークスペースのユーザー名とパスワードを入力し、ログインします。
4.使用するAIプロファイルを選択します。先程作成したRAG_PROFILEを選択します。

5.架空のロケットエンジンであるOraBoosterについて、インターネットの情報を基に回答を生成してもらいます。「OraBoosterとは?」と質問をしてみます。

6.生成された回答を確認すると、間違った回答が生成されていることがわかります。
OraBoosterはロケットエンジンですが、架空の製品の為インターネット上には情報がなく、LLMがハルシネーション(幻覚)を起こしてしまってします。

7.同じ質問を今度はオブジェクトストレージ内の情報を基に回答を生成してもらいます。Ask your databaseにチェックを入れ、「OraBoosterとは?」と質問をしてみます。

8.生成された回答を確認すると、今回は正しい回答が生成されている事が分かります。
回答だけでなく、その回答を生成するのに使用した情報のソースも表示してくれます。

3-2.自動索引更新
Select AI with RAGでは自動で索引の更新も行ってくれます。自動索引更新の機能を試してみます。
1.「一番売り上げが多いロケットエンジンと、そのエンジンの重量を教えてください。」と質問をしてみます。

2.オブジェクトストレージに格納されているrocket.txtには売り上げや重量などのデータはないので、回答を生成する事は出来ません。

3.以下のcsvファイルをクリックし、ダウンロードします。
- sales.csv:ロケットエンジンの販売データ※
- products.csv:ロケットエンジン毎の推力や重量等のデータ※
※ファイルの中身を確認する場合は、Excelの使用を推奨します。もし文字化けが発生した場合は、文字コードを変更することでファイルの内容を確認できます。
4.ダウンロードした2つのファイルを、先程作成したオブジェクトストレージにアップロードします。

5.ベクトル索引の作成時に索引の更新間隔を1分に設定しているので、索引が更新されるまで1分程待ちます。
6.先程と同じ様に「一番売り上げが多いロケットエンジンと、そのエンジンの重量を教えてください。」と質問をしてみると、オブジェクトストレージに格納したファイルのデータを基に回答を生成してくれました。

7.複数のドキュメントを参照して回答を生成する事も出来ました。

3-3.おまけ
ベクトル埋め込みとチャンク化されたデータは<インデックス名>$VECTAB(今回の場合は、MY_INDEX$VECTAB)の表に格納されています。

パイプラインのステータスも確認する事が可能で、ファイル毎のステータス等が表示されます。

3-4. ADB上の構造化データに対して自然言語で問い合わせる
↑のQiita記事の2-2. データセットのダウンロードと2-3. SELECT AIを利用するための準備の手順4番目(AIプロファイルの作成)を行うと、オブジェクト・ストア上の非構造化データ(Select AI with RAGを使用)だけでなくADB上の構造化データ(Select AIを使用)に対しても、AIプロファイルを変更するだけで質問する事が出来る様になります。
是非こちらもお試し下さい。





