SlashGPTのプラグインを使って新しいLLMを追加する

SlashGPTは、No CodeでLLMエージェント/LLMアプリを作成、利用できるツールです。
利用できるLLMは事前に用意されているOpenAIのAPI経由でのGPT3.5, GPT4や、palm, llama2 などがありますが、プラグインを書くことにより、簡単に他のLLMを使うことも可能です。

LLM独自の動作部分だけプラグインを記述することにより、SlashGPTのすべての機能をそのLLMで使うことが可能となります。API経由でのLLM利用だけでなく、オープンソースで公開されているLLMモデルをlocal環境で呼び出すことも可能です。

今回はLLMを追加するために、LLMプラグインの作り方と、設定方法を解説します。

LLMプラグインの追加

今回はbilingual-gpt-neox-4b-instruction-sftをプラグインとして追加します。

このモデルは、huggingfaceで配布されていますが、SlashGPTでhuggingfaceを使うプラグインはplugins/engine/from_pretrained.py に用意されています。

実装の処理が同じであれば、このプラグインをそのまま使うことができますが、プロンプトの作り方とmodelに渡すパラメーターが異なるので、新しいプラグインとして追加が必要です。

from_pretrained.pyをコピーしてfrom_pretrained2.pyを作ります。
クラス名は、LLMEngineFromPretrained2とします。
bilingual-gpt-neox-4b-instruction-sftの使い方は、bilingual-gpt-neox-4b-instruction-sftREADMEに書いてありますが、from_pretrained.pyと異なるのは、

なので、そこを変更します。変更点が気になる方は

diff from_pretrained.py from_pretrained2.py

で差分を確認をしてください。

変更後のfrom_pretrained2.pyはこちらです。
これでプラグインの実装は終わりです。
ほとんど、bilingual-gpt-neox-4b-instruction-sftのREADMEをコピーするだけです。

動作が異なる新たなプラグインを作る場合でも、LLMEngineBaseを継承したクラスを作り、chat_completion methodを実装するだけです。

プラグインを利用するための設定追加

作成したLLMプラグインをSlashGPTで利用するには設定の変更が必要です。
LLMの設定ファイルは config/llm_config.py です。

llm_modelsはSlashGPTのプロンプトで/llmコマンドでllmを指定したときに使われる設定、llm_engine_configsがLLMエンジンの設定です。

llm_modelsは、llmを指定したときに利用するエンジンとそのモデルの設定、llm_engine_configsはエンジンのクラス、もしくはクラスのパスとクラス名を指定します。

さて、今作ったプラグインを追加します。

llm_engine_configs

エンジン名はfrom_pretrained-rinnaとして、llm_engine_configsにクラス名をパス(module_name)を追加します。プラグインのパスはplugins.engineなので、それにファイル名を追加したものを指定、class_nameはそのファイルのクラス名を指定します。

    "from_pretrained-rinna": {
        "module_name": "plugins.engine.from_pretrained2",
        "class_name": "LLMEngineFromPretrained2",
    },

llm_models

SlashGPTのプロンプトからは

/llm rinna

で呼び出すとします。

この設定をllm_modelsに追加します。
エンジン名は先程追加したfrom_pretrained-rinna、モデル名は実装時にfrom_pretrainedに渡す値にしているのでrinna/bilingual-gpt-neox-4b-instruction-sftを指定します。

    "rinna": {
        "engine_name": "from_pretrained-rinna",
        "model_name": "rinna/bilingual-gpt-neox-4b-instruction-sft",
        "max_token": 4096,
    },

これで設定は完了です。

LLMの動作が同じであれば、model_nameを変えたものをllm_modelsに追加すれば、複数のmodelを試すこともできます。

今回実装したものはGitHubのcommitとして差分を確認できます
https://github.com/isamu/SlashGPT/commit/e471e287f7346cadb7e431668aec1b2b19f24394

動作確認

slashGPT起動時に、編集した設定を読み込むため、moduleの形式でoption指定をします。git cloneしたものであれば、config/llm_config.pyに設定ファイルがあるのでmoduleはconfig.llm_configと指定します。

./SlashGPT.py --llm-config config.llm_config

プロンプトでllmをrinnaに指定します。

You(dispatcher): /llm rinna

初回はモデルデータをダウンロードするので(8Gくらい!!)少し時間がかかります。

(transformersのwarningがでますが、ひとまず気にしない)

サンプルにある質問を試す

You(dispatcher): VRはなんですか。
Dispatcher: 「VR」は「Virtual Reality」の略語であり、仮想現実を利用して、現実のような感覚を提供する技術です。VRヘッドセットを着用することで、ユーザーは周囲の世界や仮想的な世界を感じることができます。

VRヘッドセットにはさまざまな種類があり、仮想現実内でさまざまな活動を行うことができます。たとえば、仮想的なオフィス環境を作成して作業したり、仮想的なペットを世話したり、仮想的なゲームで遊んだりすることができます。</s>

動きました!!!

まとめ

今回、SlashGPTのプラグイン機能を使って、localで動かすLLモデル、bilingual-gpt-neox-4b-instruction-sftを追加しました。
簡単に実装ができました!!