生成AIを活用するにはアプリが必要ですが、アプリはなるべく手間を掛けずに実装できた方がありがたいです。
という訳で、OCIのマネージド生成AIサービス「OCI Generative AI Service」とローコード開発プラットフォームの「Oracle APEX」を使って、簡単な生成AIアプリを作ってみました。
結果、シンプルなものであれば、ローコードでお手軽に作れることを確認できました。
環境
今回はAPEXインスタンスをADBで作成しました。
リージョンは Generative AI Service がGAとなっている「US Midwest (Chicago)」を選択しました。
ADBの作成については割愛します。
APEXでWeb資格証明を作成
まずはAPEXからOCIの各サービスを利用するために「Web資格証明」を作成します。
APEXワークスペースのトップ画面にて「アプリケーション・ビルダー」を選択します。
赤枠の部分に記入していきます。
「静的ID」の入力値は後ほどPL/SQLコード実装で使います。
OCI秘密キー、OCI公開キー・フィンガープリントに関しては、OCIコンソールから作成して入力します。
秘密キーの作成にあたり、OCIコンソールから「ユーザーの詳細」へアクセスし「APIキーの追加」を選択します。
「APIキー・ペアの生成」を選択し、秘密キーと公開キーをダウンロードします。
OCI秘密キー、OCI公開キー・フィンガープリントの内容をWeb資格証明の作成画面で入力します。
APEXアプリの作成(コンポーネントの配置)
APEXワークスペースのトップ画面に戻り「アプリケーション・ビルダー」へアクセスし「作成」を選択します。
アプリケーション名を入力し「アプリケーションの作成」を選択します。
アプリケーションのトップ画面にて「ページの作成」を選択します。
下段のアイテムからBODYに「テキスト・フィールド」をドラッグ&ドロップします。
ここに質問を入力します。
アイテムの名前を任意に設定します。
ここで設定した名前は後ほどPL/SQLのバインド変数で使います。
同様にボタンの「Text」をドラッグ&ドロップします。
このボタンを押すとGenerative AI Serviceに質問を連携します。
アイテムの名前を任意に設定します。
ここで設定した名前は後ほどプロセスの設定で使います。
APEXアプリの作成(OCIサービスとの連携)
以降の手順はノーコード、ローコード双方の実装方法を記載します。
APEX標準機能を使ったノーコードの実装
まずはノーコードで実装する手順になります。
アプリケーションのトップ画面から「共有コンポーネント」を選択します。
以下画像の通りに入力します。
URLエンドポイントは下記になります。
https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/generateText
資格証明は先ほど作成したものを選択します。
記入したら「詳細」を選択します。
赤枠の通りに入力したら「検出」を選択します。
なおリクエスト本文は下記になります。
コンパートメントIDはご自分のものを入力します。
{
"inferenceRequest": {
"runtimeType": "COHERE",
"prompt": "#AI_INPUT#",
"maxTokens": 500,
"numGenerations": 1,
"returnLikelihoods": "GENERATION",
"isStream": false
},
"servingMode": {
"servingType": "ON_DEMAND",
"modelId": "cohere.command"
},
"compartmentId": "<Your-Compartment-OCID>"
}
以下のように出力されれば Generative AI Service との連携が出来ています。
問題なければ「RESTデータ・ソースの作成」を選択します。
赤枠の通りに入力したら「パラメータの追加」を選択します。
これでリクエスト本文に動的な値を格納できるようになりました。
ページ・デザイナに戻り、下段の「リージョン」から「クラシック・レポート」をドラッグ&ドロップし、BODYに配置します。
ID と LIKELIHOOD はコメントアウトし、画面に表示されないようにします。
タイトルには任意の名前を入力します。
ソースは「RESTソース」を選択し、先ほど作成したRESTデータ・ソースを設定します。
パラメータの「AI_INPUT」を選択した状態で、右カラムの値のタイプを「アイテム」にします。
対応するアイテムとして、プロンプトを入力するテキストフィールドに付けたアイテム名を設定します。
クラシック・レポートの列にある「TEXT」を選択し、右カラムのタイプを「リッチ・テキスト」に設定します。
以上で完成です。
最後に出来たアプリの動作を確認します。
プロンプトに以下文章を入力すると、C++のサンプルコードが出力されました。
Please show me a sample code to implement an application calculating fibonacci sequence by C++.
PL/SQLを使ったローコードの実装
次にPL/SQLを使ったローコード実装の手順になります。
下段のアイテムからBODYに「リッチ・テキスト・エディタ」をドラッグ&ドロップします。
ここにGenerative AI Serviceからの回答が出力されます。
アイテムの名前を任意に設定します。
ここで設定した名前は後ほどPL/SQLのバインド変数で使います。
このアイテムはユーザは編集しないため、以下の通り読取り専用にしておきます。
ページ・デザイナのプロセスから「プロセスの作成」を選択します。
作成したプロセスの設定について、以下赤枠の通りになっているか確認します。
「ボタン押下時」の設定値はボタンのアイテム名を選択します。
ソース・プロパティの「PL/SQLコード」にGenerative AI Serviceと連携するコードを実装します。
今回のコードは下記サイトを参考にさせて頂きました。
https://www.linkedin.com/pulse/how-build-intelligent-apps-oracle-generative-ai-apex-madhusudhan-rao-z423f
DECLARE
l_genai_rest_url VARCHAR2(4000) := 'https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/generateText';
l_web_cred CONSTANT VARCHAR2(50) := 'OCI_WebCred'; -- Web資格証明で入力した「静的ID」を記入
l_input varchar2(4000) := :AI_INPUT; -- テキスト・フィールドのアイテム名を記入
l_response_json CLOB;
l_text varchar2(4000);
-- JSON形式のリクエスト情報 (compartmentIdにはご自分のコンパートメントIDを記入)
l_ocigabody varchar2(1000) := '{
"inferenceRequest": {
"runtimeType": "COHERE",
"prompt": "'||l_input||'",
"maxTokens": 500,
"numGenerations": 1,
"returnLikelihoods": "GENERATION",
"isStream": false
},
"servingMode": {
"servingType": "ON_DEMAND",
"modelId": "cohere.command"
},
"compartmentId": "<Your-Compartment-OCID>"
}';
-- レスポンス取得用のカーソル
CURSOR C1 IS
SELECT jt.*
FROM JSON_TABLE(l_response_json, '$'
COLUMNS (text VARCHAR2(4000) PATH '$.inferenceResponse[0].generatedTexts[0].text' )) jt;
BEGIN
if l_input is not null then
apex_web_service.g_request_headers.DELETE;
apex_web_service.g_request_headers(1).name := 'Content-Type';
apex_web_service.g_request_headers(1).value := 'application/json';
l_response_json := apex_web_service.make_rest_request
(p_url => l_genai_rest_url,
p_http_method => 'POST',
p_body => l_ocigabody,
p_credential_static_id => l_web_cred);
For row_1 In C1 Loop
l_text := row_1.text;
-- 生成AIからの回答を表示 (AI_ANSWERの部分はリッチ・テキスト・エディタのアイテム名を記入)
:AI_ANSWER := l_text;
End Loop;
end if;
END;
以上で完成です。
出来上がった画面が以下になります。
例として以下の質問を投げており、サンプル・コードが表示されています。
Please show me a sample code to implement an application calculating fibonacci sequence by JavaScript.
もう一つ例としてタワー型PCの組み立て手順を聞いてみました。
What is the process to build a tower PC?
以上の通りOCI Generative AI Serviceとの連携、リッチ・テキストを使った回答の表示ができました。
APEXを使えば生成AIアプリもノーコード / ローコードで手軽に開発できますね。