2024年5月21日火曜日

LM Studioのローカル・サーバーをOracle APEXのアプリケーションから呼び出す

AppleのMシリーズのMacbookにLM Studioをインストールして、 ローカル・サーバー(Local Inference Server)を実行してみます。OpenAI互換のChat Completions APIを呼び出すOracle APEXアプリケーションから、このローカル・サーバーを呼び出しLLMとチャットを行います。

以下のようにAPEXアプリケーションよりChat Completions APIを発行し、LM Studioのローカル・サーバーで処理を行います。


私のMacbookはメモリに余裕があるので、実行するモデルとして
ELYZA-japanese-Llama-2-7b-fast-instruct-q8_0.ggufをロードしてみます。使用できるメモリが少ない場合は、低いビット数で量子化されたモデルを選ぶと良いでしょう。

LM Studioをインストールして起動した状態から、作業を始めます。

検索(Search)画面を開き、検索ボックスからELYZAを検索します。検索結果より
ELYZA-japanese-Llama-2-7b-fast-instruct-q8_0.ggufをダウンロードします。


ダウンロードされたら、モデル(My Models)の画面を開き、ダウンロードされたモデルがあることを確認します。


ローカル・サーバー(Local Server)の画面を開きます。


ローカル・サーバーの構成を指定します。

Server Port8080とします。すでにポートが使用中であれば違う番号にします。Cross-Origin-Resource-Sharing(CORS)OFFRequest QueuingVerbose Server LogsApply Prompt FormattingONとします。


画面上部のSelect a model to loadをクリックし、ダウンロード済みのモデルELYZA japanese Llama 2 fast instructを選択します。


モデルがロードされるとローカル・サーバーが起動します。

OpenAI互換のChat Completions APIは以下のURLより呼び出すことができます。

http://localhost:8080/v1/chat/completions


OpenAI互換のサーバーが起動したので、Oracle APEXの準備に移ります。

macOSでのOracle APEXの構成手順は、以下の記事にまとめられています。

単一のデータベース・コンテナだけで構成する手順は「podmanを使ってOracle Database FreeとOracle REST Data Servicesをコンテナとして実行する」、データベースとORDSのコンテナで構成する手順は「podmanを使ってOracle Database FreeとOracle REST Data Servicesをコンテナとして実行する」です。

Oracle APEX 24.1.0では、LM StudioのAPIを呼び出すためにAPEX_WEB_SERVICE.MAKE_REST_REQUESTを実行するとORA-1841が発生しました。Oracle APEX 24.1.5のパッチを適用することにより、エラーは解消しました。

Oracle APEXのパッチは、以下のリンクより参照できます。

ワークスペースも続けて作成します。手順についてはこちらの記事「APEXのワークスペースを作成するコードを記述する」で紹介しているcreate_workspace.sqlを実行します。

作成したワークスペースにサインインします。本記事ではワークスペースapexdevユーザーapexdevとして作成しています。



Oracle APEXの開発画面が開きます。


これからは、以下の記事で作成しているAPEXアプリケーションをインストールします。

OpenAIのChat Completions APIを呼び出すAPEXアプリを作成する
https://apexugj.blogspot.com/2024/04/chat-with-generative-ai-sample-app-0.html

OpenAIのChat Completions APIを呼び出すパッケージUTL_OPENAI_CHAT_APIは、表OPENAI_TOOLSを参照するため、あらかじめ表OPENAI_TOOLSを作成します。


SQLワークショップSQLスクリプトより、作成を実行します。


実行するスクリプトを貼り付け、スクリプト名を入力して実行します。


スクリプトは即時実行します。


表OPENAI_TOOLSが作成されます。


同様の手順にて、パッケージUTL_OPENAI_CHAT_APIのパッケージ定義部と本体を作成します。

パッケージ定義
パッケージ本体

エクスポートされたAPEXアプリケーションをダウンロードし、ワークスペースにインポートします。
https://github.com/ujnak/apexapps/blob/master/exports/chat-with-generative-ai-0.zip

アプリケーション・ビルダーからインポートを実行します。


インポートするファイルとしてchat-with-generative-ai-0.zipを選択します。

へ進みます。


アプリケーションのインストールを実行します。


アプリケーションがインポートされました。

接続先となるLLMを設定するため、アプリケーションの編集を実行します。


アプリケーションの編集画面が開きます。

アプリケーション定義の編集を開きます。


アプリケーション定義置換タブを開きます。

置換文字列のG_API_ENDPOINTの置換値は以下です。
http://host.containers.internal:8080/v1/chat/completions

置換文字列G_CREDENTIALの置換値は空白にします。G_MODEL_NAMEにはローカル・サーバーにロードしたモデルmmnga/ELYZA-japanese-Llama-2-7b-fast-instruct-gguf/ELYZA-japanese-Llama-2-7b-fast-instruct-q8_0.ggufを設定します。


変更を適用し、アプリケーションを実行します。


ワークスペースに作成されている唯一のユーザーapexdevにて、アプリケーションにサインインします。


Promptに「あなたは日本語を話す親切なアシスタントです。」と入力し、Set Promptをクリックします。


User Messageに「東京から大阪まで一番早く着く方法と、その時間を教えてください。」と入力し、Send Messageをクリックします。


内容はさておき、日本語としては正確な回答が得られます。


LM StudioのトップページにMade possible thanks to the llama.cpp project.との記載があるため、LLMの処理にはllama.cppの実装が使われている模様です。

LM Studioを使うとllama.cppをそのまま使用するより、はるかに簡単にローカル・サーバーを立てることができます。

今回の記事は以上になります。