見出し画像

日本語使用可能LLM rinnaをDiscordでチャットボット化してみた

先日から手をつけているLLM Rinnaですが、Webでの受け答えシステムができてきましたので、今度はDiscordを使ってチャットボット化していきたいと思います。

前回の記事はこちら

次回はこちら


Webチャットアプリの紹介

さて、まず前回の記事で作成したWebのチャットアプリですが、最終的に手を加えて多少仕様が変わっていますので、再度ここで紹介させていただきます。

画面構成

  • 設定
    一部のバラメーター設定および何回前の会話履歴まで考慮して演算を行うかの設定ができます。
    また、複数の言語モデルをダウンロードしている場合、この画面で選択することができます。
    ただし、プロンプトはsft仕様のままなのでご注意ください

  • 通知
    ソケットIOを使用して裏で通信していますので、処理の状況が分かりづらいという欠点があります。(コンソールには出力されていますが)
    そのため、ソケットIOからやってくる通知を左上の通知画面に五秒間だけ表示できるようにしました。

  • 通知音
    通知が来たり、AIからの返事が来た時に音が鳴ります。
    たまに返事が遅いときがあり、ずっと画面見てるのも辛いので…

設定ウィンドウはこのような感じ
言語モデルの変更のみボタンが別で、それ以外の設定は全て右上のOKボタンで適用されます。
固定メッセージを使用に関しては現在使用できません。
パラメーターに関してmin_tokensは汎用言語モデルを使用するとき設定が必要になるので項目があります。今回扱っているsftモデルの場合はこの値は無視されます。

導入方法

前回の紹介時と少しフォルダ構成が変わっています。
今回配布しているツールは展開すると以下のようになりますが、その中に"rinna"フォルダを作成してください。

ここに各モデルにフォルダ分けしてモデルのデータを格納してください。
中身に関しては前回と同様です。
ちなみにここでのフォルダ名は言語モデルがsftかどうか判断するのにも使いますので、言語モデルの名前をそのまま持ってくるか、名前を使わないようにプログラムを書き換えてください。

必要なライブラリがきちんと導入できていれば、ローカルホストのポート番号25565でアクセスすることができます。

ちなみに起動時はモデルを読み込まないので、最初必ず言語モデル設定をしてください。

読み込んだ後はとりあえずメッセージを送信してみましょう。問題なくやり取りできるはずです。

Discord BOTの紹介

さて、メインディッシュのDiscordチャットボットの紹介です。
以下のように"りんな"から始めてメッセージを入力することでチャットすることができます。

回答を生成中はちんと処理中であることを伝える
処理後はメッセージが編集される
この時のプロプトは上記のようになっている

設定変更

ウェブページで設定を変更したように、Discordからも一部の設定を変更することができます。
設定を変更するには"/rinna"からメッセージを始めます

  • param パラメータ名 値
    ウェブアプリで右側に有ったパラメーター設定をチャットで変更できます。
    例:/rinna param max_tokens 128

  • clear
    やりとりの履歴をクリアします。

  • histry 値
    何回前のやり取りまでを考慮するか設定します。デフォルトは5です。

動作原理

さて、このボットはどんな原理で動いているのか、簡単に説明しましょう。
以下の部分がユーザーからのメッセージが入力された際に実行される部分です。
見てなんとなくわかる方は分かると思いますが、javascriptでやっていたプロンプトの組み立てを行い、前回作ったWebサーバーに対してリクエストを投げているんですね。
なのでおわかりかと思いますが、このボットはWebサーバーと同時に立ち上げる必要があります。

以下が回答を受信して、メッセージを編集する部分になります。
WebサーバーがソケットIOを使用していますので、今回はソケットIOが結果を受信した時にメッセージを書き換えられるようにしています。

さて、一番苦労した部分が実はここなんですが、DiscordのクライアントもSoketIOのクライアントもどっちもループ関数を持っていて、それを実行した瞬間処理が止まっちゃうんですよね…
この辺の知識があんまりなくて無理やりthreadingとか試したんですけど、それはエラーでダメでしたので、最終的に以下の形に落ち着きました。
もともとDiscordの方が非同期関数で作られていましたので、SoketIIOの方も非同期版を使用して非同期関数を並列実行する機能で、なんとか動いてる感じです。
ちなみにDiscordの方はRun関数じゃなくてStartというのを使ってます。
正直、この辺はちゃんとした人が見ると突っ込みどころがたくさんあるような気がしますので、詳しい方がいれば訂正コメント頂けると幸いです。

まとめ

今回はDiscord botを作成しました。
とうとう個人でチャットボット持てる時代が来たんですね。
まぁチャットボットを持ったからと言って何をするかって話ではあるんですが…
できればAlOxaOOしてみたいなことをAIに入力して、"分かりません"と言ったようなことが起こらないようなアシスタントができれば面白いんですけど、そこら辺はさすがに自分で追加学習とかできないと難しいですかね。
例えば、前回作ったゲームサーバー管理サーバーに統合して、一言OOのサーバー起動してと言えば起動してくれたり、稼働状況教えてと言えば教えてくれたり、できたら面白いんですけどね。

配布情報

動画より今回作成したサーバーおよび、discord BOTを配布しています。
興味がある方はぜひダウンロードしてみてくださいね。


情報が役に立ったと思えば、僅かでも投げ銭していただけるとありがたいです。