2024年4月26日金曜日

LLMのツール呼び出しで呼び出されるファンクションをJavaScriptで記述する

Oracle Database 23cよりMLE(MultiLingual Engine - GraalVMのこと)が組み込まれ、データベースでJavaScriptを実行することができます。

今までローカル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のファンクションと全く同じです。


SQLコマンドより、作成されたJavaScriptのファンクションを呼び出してみます。以下のコマンドを実行します。



動作が確認できました。

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のアプリケーション作成の参考になれば幸いです。