名古屋出身ソフトウェアエンジニアのブログ

ELYZA Japanese LLaMA 2 (CPU) を Chatbot UI から遊ぶ

公開:
更新:

先回記事の続きです。前回紹介した Elyza の日本語言語モデル ELYZA Japanese LLaMa 2Chatbot UI から使えるようにしてみました。

Llama.cpp の Python バインディングである llama-cpp-python は OpenAI 互換の API サーバーを内蔵しているので、ここに Chatbot UI を接続することで、ChatGPT のように WEB から ELYZA Japanese LLaMa 2 を使うことができます1

Chat

検証環境

  • MacBook Pro 14" (2023)
  • Apple M2 Pro
  • 16GB RAM
  • macOS Ventura

仮想環境を切る

python3 -m venv venv
. ./venv/bin/activate

サーバープログラムの用意

仮想環境に llama-cpp-python をインストールします。[server] エクストラをつけてインストールする必要があります。 Llama.cpp 本体も含まれているので、別で用意する必要はありません。

pip3 install "llama-cpp-python[server]"

オリジナルの LLaMA 2 と Elyza モデルでは、プロンプトのフォーマットが異なるので、ソースコードを少し修正します。

仮想環境内の llama-cpp-python パッケージの llama_cpp/llama.py を以下のように書き換えます。

--- a/llama_cpp/llama.py
+++ b/llama_cpp/llama.py
@@ -1574,12 +1574,27 @@ class Llama:
         stop = (
             stop if isinstance(stop, list) else [stop] if isinstance(stop, str) else []
         )
-        chat_history = "".join(
-            f'### {"Human" if message["role"] == "user" else "Assistant"}:{message["content"]}'
-            for message in messages
-        )
-        PROMPT = chat_history + "### Assistant:"
-        PROMPT_STOP = ["### Assistant:", "### Human:"]
+
+        B_INST, E_INST = " [INST] ", " [/INST] "
+        B_SYS, E_SYS = "<<SYS>>\n", "\n<</SYS>>\n\n"
+        chat_history = ""
+        for i, message in enumerate(messages):
+            if message["role"] == "system":
+                if i + 1 < len(messages) and messages[i + 1]["role"] == "user":
+                    chat_history += B_INST + B_SYS + message["content"] + E_SYS
+                else:
+                    chat_history += B_INST + B_SYS + message["content"] + E_SYS + E_INST
+            elif message["role"] == "user":
+                if i - 1 >= 0 and messages[i - 1]["role"] == "system":
+                    chat_history += message["content"] + E_INST
+                else:
+                    chat_history += B_INST + message["content"] + E_INST
+            else:
+                chat_history += message["content"]
+
+        PROMPT = chat_history
+        PROMPT_STOP = ["[end of text]", "### Assistant:", "### Human:"]
+
         completion_or_chunks = self(
             prompt=PROMPT,
             stop=PROMPT_STOP + stop,

サーバー起動

--model オプションで gguf ファイルへのパスを指定して、API サーバーを起動します。

python3 -m llama_cpp.server --model ../ELYZA-japanese-Llama-2-7b-instruct-q5_K_M.gguf

外に公開する場合は、オプションに --host 0.0.0.0 を付けます。

http://localhost:8000/docs へアクセスして、FastAPI ではお馴染みの Swagger 画面が出ていれば起動できています。

Swagger (OpenAPI)

WEB クライアントを用意する

Chatbot UI をクローンします。

mckaywrigley/chatbot-ui: An open source ChatGPT UI.
An open source ChatGPT UI. Contribute to mckaywrigley/chatbot-ui development by creating an account on GitHub.
git clone https://github.com/mckaywrigley/chatbot-ui.git
cd chatbot-ui

npm パッケージをインストールします。

npm i

環境変数ファイルを作成します。

cp .env.local.example .env.local

.env.local に、いくつか環境変数を設定する必要があります。以下のように OPENAI_API_HOSTOPENAI_API_KEY を設定します。本物の OPENAI_API_KEY を入れる必要はありません。SYSTEM_PROMPTTEMPERATURE はお好みで指定して OK です。

# Chatbot UI
OPENAI_API_HOST="http://localhost:8000"
OPENAI_API_KEY=fake_key
NEXT_PUBLIC_DEFAULT_SYSTEM_PROMPT="あなたは誠実で優秀な日本人のアシスタントです。"
NEXT_PUBLIC_DEFAULT_TEMPERATURE=1

WEB フロントエンドを起動

Next.js の開発サーバーを起動します。

npm run dev

http://localhost:3000 にアクセスすると、以下のようにお話しができるようになっています。

Chat

プロンプトを探索するときは、WEB のほうがやりやすいと思うので、活用してみてください。

Elyza LLaMA 2 Japanese

2024/01/27 追記

llama-cpp-python の内部が変わり、構築手順が一部簡単になりました。新しい構築手順は新しい 13B モデルの記事を見てください。

ELYZA Japanese LLaMA 2 13B を WEB デプロイ
ELYZA Japanese LLaMA 2 の 13B モデルがリリースされたのでお試しです。量子化済みモデルの中から fast-instruct-q5_K_M を選びました。7B を扱った先回記事とだいたい同じ内容を Ubuntu で行っています。Llama.cpp の Python バインディング (CPU) である llama-cpp-python は OpenAI 互換の API サーバーを内蔵しているので、ここに Chatbot UI (WEB フロントエンド) を接続することで、ChatGPT サービスのように WEB から ELYZA Japanese LLaMa 2 を使うことができます。

  1. ただし、Chatbot UI は ChatGPT 前提で作られているので、一部 UI 表示におかしい点がでます。 ↩︎