はじめに
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など7つのAIプロバイダーから選択可能)のみとなります。
作成するアプリケーションの構成図は以下の様になります。今回はAPEXをインターフェイスとして使用します。
【前提条件】
- OCIのアカウントを作成済みであること
(OCIのアカウントをお持ちでない場合は、こちらを参考にご作成下さい。) - OCIの中に使用可能なコンパートメントが作成済みであること
(コンパートメントの作成方法はこちらをご参照ください。)
【所要時間】
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.ADBの詳細画面からツール構成をクリックしAPEXのURLをコピーします。
3.コピーしたURLにアクセスし、APEXの管理サービスにログインします。パスワードはADBの管理者パスワードと同じです(本記事の場合はWelcome12345#)。
5.新規のスキーマをクリックし、新規のスキーマにワークスペースを作成します。
6.以下の通りに入力し、ワークスペースを作成します。
- ワークスペース名:APEXDEV
- ワークスペース・ユーザー名:APEXDEV
- ワークスペース・パスワード:Welcome12345#
以上のようにAPEXDEVというワークスペース名、ワークスペース・ユーザー名にした場合、ADB上ではWKSP_APEXDEVという名前のスキーマとワークスペースユーザーが作成されます。後程このスキーマ、ユーザーを使って設定をしていきます。
7.画面上部にメッセージが表示されます。APEXDEVをクリックし、ワークスペースのサインイン画面へ移動します。
8.先ほど設定したワークスペースのパスワードを入力します(本記事の場合はWelcome12345#)
APEXのワークスペースを作成し、ログインする事が出来ました。
2-2.APEXアプリのインポート
1. APEXのワークスペースにログインすると、この様な画面が表示されます。新たなアプリを作成するので、アプリケーション・ビルダーをクリックします。
2. 今回は既に作成済みのアプリケーションをインポートするので、インポートをクリックします。
3. インポートするアプリケーションをダウンロードします。こちらをクリックし、f101.sqlというSQLファイルをダウンロードします。
4. ダウンロードしたsqlファイルをドラッグアンドドロップし、次へをクリックします。
7. サポートするオブジェクトのインストールもクリックし、表をインポートします。
これでAPEXのアプリケーションをインポートする事が出来ました。
3. SELECT AIを利用するための準備
3-1. SELECT AI機能の利用に必要な権限の付与
1. 一旦OCIのコンソールに戻って、SELECT AIを利用するための準備を行います。
2. 101: ADBインスタンスを作成してみようの3-3. データベース・ユーザーを作成してみよう(コマンドライン)を参考に、Database ActionsのSQLワークシートから以下のSQLを実行し、権限を付与します。
-- SELECT AI機能の利用に必要なパッケージの実行権限を付与
GRANT DWROLE, UNLIMITED TABLESPACE TO WKSP_APEXDEV;
GRANT EXECUTE ON DBMS_CLOUD_AI TO WKSP_APEXDEV;
GRANT EXECUTE ON DBMS_CLOUD TO WKSP_APEXDEV;
3-2. OCI生成AIサービスのクレデンシャル作成
1.もう一度APEXのワークスペースに戻り、SQLワークショップ>SQLコマンドをクリックします。
2. DBMS_CLOUD.CREATE_CREDENTIALプロシージャを使用して、OCI生成AIサービスに接続するためのクレデンシャルを作成します。
OpenAIなど他のAIプロバイダーのLLM、Embeddingモデルを使用する場合は、こちらを参考にネットワークACLの設定とクレデンシャルの作成を行います。
以下の通りにOCID等を置き換え、プロシージャを実行します。
-
credential_name:任意(本記事ではOCI_GENAI_CREDとしています)
-
user_ocid:先程メモを取った構成ファイルを参照し、ユーザーのOCIDを入力
-
tenancy_ocid:先程メモを取った構成ファイルを参照し、使用しているテナンシーのOCIDを入力
-
private_key:先程取得した秘密キーの内容をコピー&ペースト
-
fingerprint:先程メモを取った構成ファイルを参照し、フィンガープリントを入力
BEGIN DBMS_CLOUD.CREATE_CREDENTIAL( credential_name => 'OCI_GENAI_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-3. オブジェクトストレージのクレデンシャル作成
DBMS_CLOUD.CREATE_CREDENTIALプロシージャを使用して、オブジェクトストレージに接続するためのクレデンシャルを作成します。
OCIのオブジェクトストレージとOCI生成AIサービスを使用する場合は、オブジェクトストレージ用のクレデンシャルを作成せずに、先程作成したOCI生成AIサービス用のクレデンシャルでオブジェクトストレージにアクセスしても問題ありません。
以下の通りにOCID等を置き換え、プロシージャを実行します。
-
credential_name:任意(本記事ではOBS_CREDとしています)
-
user_ocid:先程メモを取った構成ファイルを参照し、ユーザーのOCIDを入力
-
tenancy_ocid:先程メモを取った構成ファイルを参照し、使用しているテナンシーのOCIDを入力
-
private_key:先程取得した秘密キーの内容をコピー&ペースト
-
fingerprint:先程メモを取った構成ファイルを参照し、フィンガープリントを入力
BEGIN DBMS_CLOUD.CREATE_CREDENTIAL( credential_name => 'OBS_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; /
3-4. AIプロファイルの作成
DBMS_CLOUD_AI.CREATE_PROFILEプロシージャを使用して、AIプロファイルを作成します。どのLLMを使用するか、どのエンベッディングモデルを使用するかこちらで指定します。
- プロファイル名:RAG_PROFILE(任意)
- provider:oci(本記事ではOCI生成AIサービスをAIプロバイダーとして使用)
- credential_name:OCI_GENAI_CRED(先ほど作成したクレデンシャル名を指定)
- vector_index_name: MY_INDEX(任意)
- embedding_model: cohere.embed-multilingual-v3.0(デフォルトだとembedding_modelはcohereのenglishモデルになってしまうので、multilingualを明示的に指定)
- model: cohere.command-r-plus-08-2024(任意)
- LLMのモデルを明示的に指定しない場合は、デフォルトの
meta.llama-3.1-70b-instruct
(2025年1月現在)が使用されます。 - サポートされているAIプロバイダーの一覧はこちら
BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
profile_name =>'RAG_PROFILE',
attributes =>'{"provider": "oci",
"credential_name": "OCI_GENAI_CRED",
"vector_index_name": "MY_INDEX",
"embedding_model": "cohere.embed-multilingual-v3.0",
"model": "cohere.command-r-plus-08-2024"
}');
end;
/
3-5. ベクトル索引作成
DBMS_CLOUD_AI.CREATE_VECTOR_INDEXプロシージャを使用して、ベクトル索引を作成します。
-
索引名:MY_INDEX(プロファイル作成時に指定した索引名)
-
vector_db_provider:oracle
-
location:先程作成したオブジェクトストレージのURI
-
object_storage_credential_name:OBS_CRED(先ほど作成したオブジェクトストレージのクレデンシャル)
-
profile_name:RAG_PROFILE(先程作成したプロファイル名)
-
vector_dimension:1024(Embedding Modelは、Cohere multilingualを使うので、dimensionは1024に設定)
-
vector_distance_metric:cosine
-
chunk_overlap:128
-
chunk_size:400(Embedding Modelは、Cohere multilingualを使うので、chunk_sizeはそのトークン数上限である512以下に設定)
-
refresh_rate:1(ベクトル索引を更新する間隔。本記事では1分毎に索引を更新するように設定します)
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": "OBS_CRED", "profile_name": "RAG_PROFILE", "vector_dimension": 1024, "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の準備は完了です。
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プロファイルを変更するだけで質問する事が出来る様になります。
是非こちらもお試し下さい。