今までローカルLLMを呼び出す際に使用しているデータベースがOracle Database 23c Freeなので、JavaScriptを使うことができます。LLMを扱うような開発者がPL/SQLでコードを書くということはあまり無さそうなので、ツール呼び出しで呼び出されるファンクションをJavaScriptで書けるようにしてみました。
以下のようにツールを登録する際に、JavaScriptのファンクション本体を記述するページ・アイテムを追加します。
ツールの情報を入力するフォームにページ・アイテムP3_JAVASCRIPT_FUNCTION_BODYを作成します。
タイプはテキスト領域、ラベルはJavaScript Function Bodyとします。
セッション・ステートのデータ型はCLOB、ストレージはリクエストごと(メモリーのみ)を選択します。
ツールの作成または変更の適用を実行したときに、本体がJavaScriptで記述されたファンクションの作成または更新を行います。
プロセスを新規に作成します。
識別の名前はCreate or Replace JavaScript Function、タイプはコードを実行を選択します。ソースのPL/SQLコードには以下を記述します。ファンクションの本体としてJavaScriptがインラインで記述されたファンクションを、動的に作成しています。
サーバー側の条件のタイプに式を選び、PL/SQL式として以下を記述します。ボタン作成または変更の適用がクリックされたときに、JavaScript Function Bodyが空でなければファンクションの作成または更新を行います。
:REQUEST in ('SAVE', 'CREATE') and :P3_JAVASCRIPT_FUNCTION_BODY is not null
フォームが開く時にページ・アイテムP3_JAVASCRIPT_FUNCTION_BODYを初期化するプロセスを作成します。
レンダリング前のヘッダーの前、初期化フォームTool Detailの下にプロセスを作成します。
識別の名前はLoad JavaScript Source、タイプはコードを実行を選択します。ソースのPL/SQLコードに以下を記述します。
JavaScriptのファンクションが作成されているときにソースコードを取得するように、サーバー側の条件を設定します。
タイプに行が返されるを選択し、SQL問合せとして以下を記述します。
select 1 from user_mle_procedures where object_name = upper(:P3_TOOL_NAME)
以上でアプリケーションの変更は完了です。
ファンクションGET_CURRENT_WEATHERの本体を以下のJavaScriptコードに置き換えてみます。
処理の内容はPL/SQLのファンクションと全く同じです。
動作が確認できました。
RESTサービスの呼び出し時にACLのエラーが発生することがあります。
PL/SQLの場合は一般的にAPEX_WEB_SERVICEパッケージを使ってRESTサービスを呼び出します。このときはAPEXスキーマからUTL_HTTPパッケージが呼び出されるため、ACLはAPEXスキーマをプリンシパルとして許可が与えられています。今回の処理はAPEXのワークスペース・スキーマがUTL_HTTPを呼び出しているため、プリンシパルをAPEXのワークスペース・スキーマとしてACLを追加する必要があります。
以下のようにして、DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACEを呼び出します。principal_nameとしてワークスペース・スキーマ名を指定します。
begin
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => '*',
ace => xs$ace_type(
privilege_list => xs$name_list('connect'),
principal_name => 'APEXDEV',
principal_type => xs_acl.ptype_db));
commit;
end;
/
今回作成したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/chat-with-generative-ai-fc-js.zip
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完