OpenAIのChatGPTのAPIを呼び出すAPEXアプリを作る
作成したアプリケーションは以下のように動作します。
関数呼び出しが行われた場合(Chat HistoryのタイプでfunctionResponseが現れた場合)関数呼び出しの戻り値をGeminiに渡すため、Textを空白にしてRunをクリックする必要があります。
クイックSQLの以下のモデルより、表GEMINI_FUNCTIONSを作成します。
この表はOpenAIでの作業の際に作成した表OPENAI_FUNCTIONSとOPENAI_FUNCTION_SETを(不具合の修正も合わせて)簡素にしています。この表にサンプルとして設定するファンクションとして、OpenAIのときと同じget_current_weatherを使用します。
表を作成した後、この表にデータを投入するためにフォーム付き対話モード・レポートのページを作成します。
ページの作成をクリックします。
対話モード・レポートを選択します。
対話モード・レポートのページのページ名はFunctionsとします。フォーム・ページを含めるをチェックします。フォーム・ページ名はFunction Detailとします。
データ・ソースの表/ビューの名前にGEMINI_FUNCTIONSを指定します。
次へ進み、主キー列1にID (Number)を選択しページの作成をクリックすると、表GEMINI_FUNCTIONSの対話モード・レポートとフォームのページが作成されます。
ファンクションGET_CURRENT_WEATHERも作成しておきます。元記事に説明がありますが、このファンクションは引数である都市名から座標を得るために、アマノ技研さんより提供されている「世界の百万都市の位置データ Location Data of Megacities」のCSVファイルを表AMANO_CITY_LOCATIONSにロードしています。
アプリケーションを実行しFunctionsのページを開き、作成をクリックします。
ファンクションGET_CURRENT_WEATHERを登録します。
Function nameとしてget_current_weather、Function Set NameとしてWeather、DescriptionとしてGet the current weather in a given location、Parametersには以下のJSONドキュメントを記述します。
{
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city name"
},
"unit": {
"type": "string",
"enum": [
"celsius",
"fahrenheit"
]
}
},
"required": [
"location"
]
}
これらはOpenAIでFunction Callingを行う際に設定した内容とほぼ同じです。双方とも関数呼び出しの引数の定義は、OpenAPI 3.0に準拠しています。作成をクリックします。
ファンクションget_current_weatherが設定されます。
APEXアプリケーションへマルチターンの処理を行うページを追加します。
ページの作成をクリックします。
空白のページを選択します。
ページ番号は6、ページの名前はChatとします。
ページの作成をクリックします。
空白のページが作成されます。
会話を初期化するボタンINIT_CONVERSATIONを作成します。ラベルはInitialize Conversation、動作のアクションはデフォルトのページの送信です。テンプレート・オプションのWidthをStretchに変更しています。
作成したプロセスの識別の名前をInitialize Conversationとします。タイプはコードを実行です。ソースのPL/SQLコードに以下を記述します。チャット履歴を保持するAPEXコレクションGEMINIを初期化しています。
apex_collection.create_or_truncate_collection(
p_collection_name => 'GEMINI'
);
サーバー側の条件のボタン押下時にINIT_CONVERSATIONを指定します。
レンダリング・ビューに戻ります。
テキストを入力するページ・アイテムP6_TEXTを作成します。タイプはテキスト領域、ラベルはTextとします。
セッション・ステートのデータ型にCLOBを選択し、続けて同じテキストを送信してしまわないように、ストレージとしてリクエストごと(メモリーのみ)を選択します。
ファンクション・セットを選択するページ・アイテムP6_FUNCTION_SETを作成します。
タイプは選択リスト、ラベルはFunction Setとします。LOVのタイプにSQL問合せを選択し、SQL問合せとして以下を記述します。
select function_set_name d, function_set_name r from gemini_functions group by function_set_name order by 1 asc
追加値の表示はオフ、NULL値の表示をオンとし、NULL表示値として- ファンクション・セットを選択 -と記述します。
セッション・ステートのストレージはセッションごと(永続)を選択します。
会話を実行するボタンRUNを作成します。ラベルはRun、動作のアクションはデフォルトのページの送信です。外観のホットをオンにします。テンプレート・オプションのWidthをStretchに変更しています。
プロセス・ビューを開き、このボタンRUNがクリックされたときに実行されるプロセスを作成します。
作成したプロセスの識別の名前をRun Conversationとします。タイプはコードを実行です。ソースのPL/SQLコードに以下を記述します。
サーバー側の条件のボタン押下時にRUNを指定します。
レンダリング・ツリーに戻り、チャット履歴を表示するクラシック・レポートのリージョンを作成します。
識別のタイトルはChat History、ソースのタイプとしてSQL問合せを選択し、SQL問合せとして以下を記述します。
select c001, c002, clob001 from apex_collections where collection_name = 'GEMINI' order by seq_id
列C001のヘッダーをroleとします。
列C002のヘッダーをtypeとします。
以上でアプリケーションは完成です。アプリケーションを実行すると、記事の先頭のGIF動画のように動作します。
今回作成したアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/google-gemini2.zip
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完