2024年4月26日金曜日

Oracle APEXのアプリからいろいろなローカルLLMを呼び出してみる

Apple MシリーズのDocker/Colima上にOracle APEXが動作する環境を作成し(こちらの記事)、Ollamaを使って動かしたローカルLLMを呼び出すAPEXアプリケーションも作成しました(こちらの記事)。

この環境を使って、最近話題のMicrosoftのphi3(Mini, 3.8B, 4bit)、Googleのgemma(7B, 4bit)、Metaのllama3(8B, 4-bit)を動かして、APEXアプリケーションからOpenAI互換のChat Completions APIで呼び出してみます。

呼び出すモデルを変更する度に、アプリケーション・ビルダーを呼び出して置換文字列を変更するのは面倒なので、APIのエンドポイントモデル名Web資格証明をアプリケーションから変更できるように、ページ・アイテムを追加します。

ページ・アイテムP1_TOOL_SETの下に、APIエンドポイントを設定するページ・アイテムP1_API_ENDPOINTを作成します。タイプテキスト・フィールドラベルAPI Endpointとします。

レイアウト新規行の開始オン検証必須の値オンデフォルトタイプ静的を選択し、静的値として&G_API_ENDPOINT.を指定します。

セッション・ステートストレージセッションごと(永続)を選択します。


モデル名を設定するページ・アイテムP1_MODEL_NAMEを作成します。タイプテキスト・フィールドラベルModel Nameとします。

レイアウト新規行の開始オフとしてページ・アイテムP1_API_ENDPOINTの右に配置します。検証必須の値オンデフォルトタイプ静的を選択し、静的値として&G_MODEL_NAME.を指定します。

セッション・ステートストレージセッションごと(永続)を選択します。


Web資格証明の静的IDを設定するページ・アイテムP1_CREDENTIAL_STATIC_IDを作成します。タイプテキスト・フィールドラベルCredential Static IDとします。

レイアウト新規行の開始オフとしてページ・アイテムP1_MODEL_NAMEの右に配置します。検証必須の値オフ(ローカルLLMでは指定不要)、デフォルトタイプ静的を選択し、静的値として&G_CREDENTIAL_STATIC_ID.を指定します。

セッション・ステートストレージセッションごと(永続)を選択します。


カード・リージョンChat HistoryソースSQL問合せを以下に変更し、送受信したメッセージの文字数を検索結果に含めます。

select seq_id, c001, c002, clob001, n001, n002, n003, dbms_lob.getlength(clob001) cnt
from apex_collections
where collection_name = :G_CHAT_HISTORY order by seq_id desc


属性2次本体HTML式を以下に変更し、メッセージの文字数を表示します。
char count: &CNT.
{if N001/}
, prompt_tokens: &N001. completion_tokens: &N002. total_tokens: &N003.
{endif/}


プロセスSend Messageを選択し、パラメータの設定を変更します。

パラメータp_api_endpointタイプアイテムに変更し、アイテムとしてP1_API_ENDPOINTを指定します。


パラメータp_model_nameも同様に、アイテムとしてP1_MODEL_NAMEを指定します。


パラメータp_credential_static_idアイテムとしてP1_CREDENTIAL_STATIC_IDを指定します。


以上でAPEXアプリケーションから呼び出すモデルを変更できるようになりました。

最初にMicrosoftのphi3を呼び出してみます。

% ollama run phi3  

>>> Send a message (/? for help)


API Endpointhttp://host.docker.internal:11434/v1/chat/completionsModel Namephi3です。

以下のメッセージを送信しました。

織田信長が活躍した時代は、一般に何時代と呼ばれていますか?


同様にGoogle gemmaを呼び出してみます。

% ollama run gemma

>>> Send a message (/? for help)


Model Namegemmaを指定します。


Metaのllama3を呼び出してみます。

% ollama run llama3

>>> Send a message (/? for help)


Model Namellama3を指定します。

英語で回答されました。


プロンプトとして「日本語で回答してください。」を設定し、同じ質問をしてみました。


OpenAIのgpt-4-turboを呼び出してみました。


Cohereのcommand-r-plus:104b-q2_Kを呼び出してみました。回答はあっさり「戦国時代」です。


もう少し詳しく回答してもらうために、プロンプトとして「あなたは日本史の先生です。」を設定し、同じ質問をしてみました。


OpenAI Chat Completions APIを呼び出す形でアプリケーションを作成することにより、本家OpenAIとOllamaのローカルLLMの切り替えが容易にできるようになりました。

今回機能を追加したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/chat-with-generative-ai-hc.zip

Oracle APEXのアプリケーション作成の参考になれば幸いです。