清水理史の「イニシャルB」

賢いと噂の日本語LLM「ELYZA」をウェブAPIで使う! Power Automateなどからも呼び出せる完全ローカル環境の構築

LangChainのGUI版となるFlowiseから、ローカルで動かしたELYZAにAPIでアクセス。既存のOpenAIノードの接続先をローカルに変えるだけでELYZAを使える

 rinnaやOpenCalm、さらには賢いと噂のELYZAなど、GPU搭載の家庭用PCでも動く日本語大規模言語モデル(LLM)が増えてきた。こうした日本語LLMは、現状ならPythonで動かすのが一般的だが、APIアクセス可能にすることで、さまざまな機器から、より手軽に扱えるようにしようというのが今回のテーマだ。

 FastChatを使ったAPI化をDockerを使って実現することで、はじめてでも数コマンドで実装できるようにしてみた。

賢いELYZA

 「ELYZA-japanese-Llama-2-7b」は、東京大学松尾研究所発のAIスタートアップ企業である株式会社ELYZAから8月末にリリースされた、商用利用可能な小型の日本語LLMだ。

ELYZAがリリースしたLlama 2をベースにした日本語LLM

 少し前に話題になったMetaのLlama 2をベースに日本語での追加事前学習を実施したモデルで、日本語の各種性能評価で高い結果を出しており(詳細は以下のリンク参照)、現状、日本語LLMとしてはトップクラスの実力を持つ存在となっている。

 なぜ英語モデルをベースにしたのか、どのように事前学習させたのかは、開発者の手によって以下のZennの記事で説明されているが、簡単に言えば、Llama 2のLLMとしての基本性能(指示に従う能力など)を維持しながら、日本語に対応させようという狙いだったという。記事では、その経緯やより詳しい方法が丁寧に解説されているので、ぜひ一読をおすすめする。

▼ELYZAによる解説記事
ELYZAが公開した日本語LLM「ELYZA-japanese-Llama-2-7b」についての解説(株式会社ELYZA:Zenn)
「Llama 2」をベースとした商用利用可能な日本語LLM「ELYZA-japanese-Llama-2-7b」を公開しました(ELYZAの研究&開発:note)

 実際に使ってみると、海外製LLMならではの指示追従能力の高さと、日本語LLMらしい日本に関する知識の豊富さの中間をうまく混ぜ合わせたような印象だ。小型のLLMなので限界はあるにせよ、かなり使い勝手がいいと感じた。以下のサイトで試せるので、興味がある人は触ってみることをおすすめする。

 70億パラメーターなので、VRAM 16~24GB搭載のGPUがあれば家庭用のPCで動かせるのも魅力で、社内情報などを活用したクローズドなシステムへの応用も可能となっている。こうした日本語対応の賢いLLMを誰もが簡単に試せるようになったことは、大変ありがたいことだ。

▼オンラインデモ
ELYZA-japanese-Llama-2-7b-instructオンラインデモ(Hugging Face)

APIアクセスでELYZAを利用可能にする

 さて、今回は、このELYZAのモデルのうち、ユーザーからの指示(INSTRUCT)に従って回答できるように学習された「elyza/ELYZA-japanese-Llama-2-7b-instruct」を、API経由で利用できるようにしてみる。

 PCローカルでLLMを利用する方法としては、text-generation-webuiなどのGUI環境が使われる場合もあるが、日本語LLMを対象に開発されていないこともあり、トークナイザーでエラーが発生したり、必要なパラメーター設定が欠けることで意図せぬ応答がなされたりすることが多い。実際、今回の「elyza/ELYZA-japanese-Llama-2-7b-instruct」も筆者が試した時点のバージョンでは、エラーが発生してモデルの読み込みに失敗してしまった。

 確実なのはPython環境で動かすことだが、今回は、さまざまなアプリやIoT機器などからの連携もしやすくするために、APIアクセス可能にすることにした。OpenAI互換のAPIを利用できる環境で、ベースURLをローカルのアドレスに変更できるアプリなどであれば、ChatGPT用の設定をほぼ流用して、ローカルLLMを使えるようになる。

 そこで、今回は、Dockerを利用して、なるべく簡単に、こうした環境を構築できるように工夫してみた。

STEP 1:事前準備

 事前の準備として、Windows PCにWSLとDocker Desktopをインストールしておく。WSLはターミナルから以下のコマンドで、Docker DesktopはDockerのサイトからインストールできる。

wsl --install
WSL2とDocker Desktopをインストールしておく

STEP 2:docker-compose用ファイルを取得する

 続いて、Dockerコンテナを作るためのファイルを取得する。筆者が作成したものを以下に置いておくので、ターミナルからgitでcloneするか、ダウンロードして展開しておく。なお、あくまでも参考用として公開しているので、自己責任で使ってほしい。

git clone https://github.com/shimiz9/elyza-fschat-api.git
dockerのコンテナを作成するために必要なファイルをgitからコピーしておく

STEP 3:コンテナを作成する

 以上の工程が完了したら、ダウンロード先のフォルダー(docker-compose.ymlがあるフォルダー)に移動して、以下のコマンドを実行すれば、自動的にイメージの作成と、モデルのダウンロードが実行され、コンテナが起動する。作成時のみ以下のコマンドを利用し、2回目以降はDocker Desktopでコンテナの起動や削除などができる。

docker-compose up --build
ダウンロードしたフォルダーに移動して、コンテナを作成する

 なお、イメージ自体で13GBほど必要なうえ、ELYZAのモデルをダウンロードする必要があるため、さらに13GBほどの容量が必要になる。初回はこれらの操作のため、起動するまでに10分ほど時間がかかる。2回目以降はもう少し早く起動するが、GPUへのモデル読み込みが必要なので、完全に起動するまでに30~40秒はかかる。

 詳細については、ダウンロードした各ファイルの中身を参照してほしいが、「content」フォルダーに保存されている「apiserver.sh」にて、FastChatのコントローラー、ワーカー、APIサーバーの3つのサーバープログラムを起動している。

起動用スクリプトの内容(見やすいように一部抜粋)。3つのサーバープログラムを起動する

 このうち、ワーカーでELYZAのモデルを指定して読み込んでいるので、ここを変更することで別のモデルも利用可能だ。

 なお、今回の例では、下図のようにモデル名をOpenAIで提供されているGPT-3.5 Turboなどと同じモデル名にフェイクしている(中身はELYZAだが名前がgpt-3.5-turboになっている)。

起動用スクリプトの内容(見やすいように一部抜粋)。3つのサーバープログラムを起動する

 これにより、クライアントからAPIを呼び出すときのモデル名として、OpenAIのAPIと同じ「gpt-3.5-turbo」などを利用できる。OpenAIのAPIを使えるソフトなどであれば、モデル名をそのまま流用しつつ、エンドポイントのベースURLを後述するローカルに変更するだけでAPIを利用できる。

APIの仕様やモデル名が同じなので、Flowiseなどに標準で用意されている「ChatOpenAI」ノードでも、「BasePath」をローカルに変更するだけで使える

 なお、このテクニックは、noteで公開されている以下の記事で紹介されている。この場で著者に感謝しつつ、ありがたく使わせていただくことにした。

▼参考記事
OpenAI互換APIサーバーたてて、LangChainで遊ぶ(はまち氏)

APIを利用してみる

 以上で、APIアクセスが可能になったはずだ。早速、正常に動作しているか確認してみよう。

 まずは、モデルが読み込まれているかどうかを確認する。タスクマネージャーを起動し、GPUの項目で「専用GPUメモリ」の値が14GB前後になっていれば、問題なくELYZAが読み込まれている。

ELYZAが読み込まれていれば14GB前後消費しているはず

 もちろん、16GB以上のVRAM搭載GPUが装着され、NVIDIAのドライバーがインストールされている環境でないと動作しないので注意してほしい。

 次にAPIのレスポンスを確認する。ブラウザーを起動して、「http://localhost:8000/v1/models」や「http://PCのIPアドレス:8000/v1models」などにアクセスすると、利用できるLLMとして、上記「apiserver.sh」で指定した3つのモデルが表示される。

モデル名が一覧表示される

 最後に、実際にELYZAにリクエストを投げて回答してもらう。ターミナルを起動し、以下のコマンドでコマンドプロンプトに切り替えて、curlを実行する(PowerShellのままだとcurlの仕様が違うので必ずコマンドプロンプトを利用)。

cmd

curl http://localhost:8000/v1/completions -H "Content-Type:application/json" -d "{\"model\":\"gpt-3.5-turbo\",\"prompt\":\"今日のためになる一言を教えてください。\",\"max_tokens\":60,\"temperature\":0.5}"

 きちんとコンテナが起動し、モデルが読み込まれていれば、しばらくして回答が表示されるはずだ。このほか、Power AutomateからELYZAを使うこともできる。

curlを使ってELYZAに質問を送ると回答が表示される
Power Automateの「Webサービスを呼び出します」からも利用可能。なお、詳細設定の「要求本文をエンコードします」をオフにして実行のこと

LangChainのGUI版「Flowise」や「LangFlow」から使える

 今回、筆者がこの環境を用意した主な目的は、LangChainのGUI版となるFlowiseやLangFlowから使うことだ。これらの場合は、OpenAIのノードをそのまま活用し、エンドポイントを「http://PCのIPアドレス:8000/v1」に変え、トークンを空または「EMPTY」などに設定するだけで利用できる。

FlowiseからAPI経由でELYZAを利用。OpenAI用のノードのエンドポイントを書き換えるだけで利用できる

 全ての環境での動作を保証するものではないが、汎用的なHTTPリクエスト(POST)が使える環境なら、いろいろなアプリやデバイスから使えるだろう。外部のサービスを使わずに、自前のLLMでドキュメントQAアプリなどを作成できる。小規模な環境なら、これで十分というケースも多そうだ。

Flowiseで作ったPDFのQAアプリ。Flowiseはもちろんのこと、ELYZAも、ベクトルデータベースのChromaもローカルで動かしているので、完全ローカルで動いている。外部にデータを出したくないという場合に最適

 このように、賢くて小規模なLLMをローカルでAPI化しておけば、いろいろな用途に活用できるようになる。小規模な環境での自社システムへのLLMの組み込みのハードルが、かなり下がった印象だ。

清水 理史

製品レビューなど幅広く執筆しているが、実際に大手企業でネットワーク管理者をしていたこともあり、Windowsのネットワーク全般が得意ジャンル。最新刊「できるWindows 11」ほか多数の著書がある。