こちらの記事「OpenAIのChat Completions APIを呼び出すAPEXアプリを作成する」で作成したAPEXアプリケーションに、ツール呼び出し(以前のFunction Calling)の機能を追加します。このアプリケーションが呼び出しているパッケージUTL_OPENAI_CHAT_APIには、すでにツール呼び出しをハンドリングするコードが含まれているため、主な作業はユーザー・インターフェースの追加になります。
作成したアプリケーションは以下のGIF動画のように動作します。
プロンプトとして「あなたはお天気お兄さんです。」を設定し、メッセージ「現在の東京とパリの天候を教えてください。」を送信します。
LLMはtool_callsとして引数をTokyoとしたツール呼び出しと、Parisを引数としたツール呼び出しを返します。ツールの並列呼び出しは2023年11月に追加された機能です。
TokyoとParisの現在の天候をOpenMeteo.comに問合せて回答を返し、最終的に「現在の東京とパリの天候はどちらも晴れです。」という回答を得ています。
以下より追加した実装について紹介します。
はじめに呼び出すツールに関する設定を保存する表OPENAI_TOOLSを操作するために、対話モード・レポートとフォームのページを作成します。
ページの作成をクリックします。
対話モード・レポートのページの名前はToolsとし、フォーム・ページを含めるをオンにします。フォーム・ページ名はTool Detailとします。
データ・ソースの表/ビューの名前にOPENAI_TOOLSを選択します。
次へ進みます。
主キー列1にID(Number)を選択します。
ページの作成をクリックします。
以上でツールの設定画面が作成できました。
ツール呼び出しに登録するツールは、PL/SQLのストアド・ファンクションとして作成します。OpenAIではLLMのレスポンスとしてツール呼び出し(roleがtool_calls)を返す時は、呼び出すファンクション名とその引数となるJSONドキュメントをレスポンスに含めます。
レスポンスとしてツール呼び出しを受け取った場合は、ファンクション名として返されたPL/SQLファンクションにJSONドキュメントを引数として渡して、動的にファンクションを呼び出します。呼び出したファンクションの戻り値(これもJSONドキュメント)をツールの応答(roleがtool)としてLLMに戻します。
ページを実行し、指定した都市(首都)の天候を取得するファンクションget_current_weatherを設定します。
作成をクリックします。
Tool SetはWeatherとします。Tool Typeはfunctionを指定します。現時点で指定できるTool Typeはfunctionのみのようです。DescriptionはGet the current weather in a given location、Tool Nameはget_current_weather、Parametersには以下のJSON Schemaを記述します。
{
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city name, e.g. Tokyo"
}
},
"required": [
"location"
]
}
作成をクリックします。
実際に呼び出されるPL/SQLファンクションget_current_weatherを作成します。
ファンクションget_current_weatherのコードは以下です。
都市名から緯度経度を求めるために、アマノ技研様が公開している「世界の百万都市の位置データ Location Data of Megacities」のCSVデータをダウンロードし、表AMANO_CITY_LOCATIONS(新規作成)にロードしています。データのロードには、SQLワークショップのデータ・ワークショップを使用しています。
また、weathercodeについては「気象関連コード表」に記載されているWMO 4501のHTML表を表WMO4501、WMO 4677のHTML表を表WMO4677として、データをロードします。双方の表は列CODE(NUMBER)、列DESCRIPTION(VARCHAR2(4000))の列を持ちます。データ・ワークショップを使ってHTML表をコピペし、それぞれの表にロードします。
ファンクションget_current_weatherの作成は以上です。
ページ・デザイナでホーム・ページを開きます。
リージョンSystem Promptに、チャット呼び出しの際に含めるTool Setを選択するページ・アイテムを作成します。
識別の名前はP1_TOOL_SET、タイプは選択リスト、ラベルはTool Setとします。
LOVのタイプにSQL問合せを選択し、SQL問合せとして以下を記述します。
select tool_set d, tool_set r from openai_tools group by tool_set
追加値の表示はオフ、NULL値の表示をオンとし、NULL表示値は-- Select Tool Set --とします。
左ペインでプロセス・ビューを開き、プロセスSend Messageのパラメータp_tool_setを選択します。
値のタイプをアイテムに変更し、アイテムとしてP1_TOOL_SETを指定します。
アプリケーションを実行すると、記事の先頭にあるGIF動画のように動作します。
今回作成したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/chat-with-generative-ai-0-fc.zip
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完