見出し画像

日本語使用可能LLM rinnaでチャットしてみる【ツール配布有】

前回の記事は以下

次回は以下

前回はオープンソースLLM Rinna の稼働までやってみました。
前回はサンプルのプロンプトを使用して回答を得ただけでしたが、今回は自分で任意の入力ができるようにして会話してみたいと思います。


前提

さて、今回やるのはお得意の"FlaskWebサーバー"にリンナを追加して、超簡易チャットアプリを作ることになります。
Flask WEBサーバーに関しては以下の動画をご視聴ください

作成

プロンプトの解析

さて、まずは会話の入力に使うプロンプトのフォーマットを確認しましょう。
サンプルを見るとリストの中に会話の一つが辞書で入っているフォーマットですね。

そしていくつかの処理を経て、AIに渡す最終的なフォーマットにして確認した結果が以下

単純に先頭に人物:を挟んで内容+改行という風になっていますね。
つまりはこれ改行はできないということなんですかね?
それとも先頭にユーザーorシステムがつかない場合は継続行として認識されるのか…?

というわけで試しました。
最後の"VRは何ですか"の後に改行を入れてみましたが、正常に受け答えされることがわかりました。どうやら継続行として認識されるみたいですね。
ですので、改行は気にせずプロンプトを作成することができそうです。

回答

WEBアプリの作成

Flaskを使用して適当にプロンプト生成と応答を受け取れるチャットアプリを作成します。
画面の構成としては、入力ボックスと送信ボタンがあり、チャットのやり取り、履歴はテーブルに保持しておくというやり方をします。

Python側

というわけで、以下がAIに指示を出すcgiの部分になります。
ポイントとしては回答の生成に時間がかかってしまうことがあり、Fetchだとタイムアウトになる可能性があるので、ソケットIOを使用しているところです。
また、プロンプトはJSON形式でフォームデータに入力してPOSTで送信します。Pythonのサンプルではその中でプロンプトの作成もしていましたが、今回はJavaScriptでやります
ソケットIOについては以下をご確認ください。
※以下はソケットIOのベースとなっているWebソケットについての記事ですが、大体のイメージがつかめればOKです。

JavaScript側

そして、相手側のJavaScript側は以下のようになります。
やっていることは、入力されたメッセージを使ってプロンプトの辞書を作成することと、それをサーバーに送信するということです。
入力したメッセージは配列に保持しており、会話の履歴をくっつけてから送信する機能もあります。

指示を送る部分

応答を受け取る部分は以下のようになっています。
ソケットIOからaimsgでデータを受け取った場合に応答が来たとして処理しています。

応答を受ける部分

色々試す

話しかけてみる

とりあえず"こんにちは"と話しかける。まずまずな回答です。

追加でよくあるキャラ設定のようなものをしてみる。
これは理解されなかった。
難しいかと聞いたら明後日の回答に…。

翻訳できないか聞いてみた
まずはどんな指示が有効か聞いてみたところ、文を教えてとのことなので、そのまま入力してみた…。
「とは何ですか」じゃなくてそれが翻訳してほしいテキストだよ!!
難しいかな?

何回かトライしたらキレられました…w
たまに応答が異常に長いことがあるんですが、そういう時は大体こんな感じか意味不明な回答が来ますね

以下の入力でやっと翻訳されました。

でも何度か試すとやはり明後日の回答が。

なにやら詳細?な回答も。


パラメーターをいじる

さて、ここまでいろいろ試してきたわけなんですが、LLMの基本について少し調べたところ、どうもパラメーターがランダム性に富んでいるものだったようです。
この辺を少し変更して、できる限り同じような回答を正確に返すように変更してみようと思います。
また、プロンプトについても多少を調べたので、もう少しまともな入力をしてみます。

変更するパラメーターは以下になります。

  • max_new_tokens=512
    回答の長さを制御します

  • temperature=1.0
    1に近いほど生成されるテキストがランダムになりやすいそうです。

  • top_p=0.85
    回答のランダム性を制御するそうです。
    低い方が事実に基づいた回答を行い、高くすると多様な回答になるとのことです。

ねこについてお話してみた

あんまり"OOして"のような指示は上手く行かなかったので雑談はどうか試してみた。
結果、すごくどうでもいい会話が安定して成り立っている…w


多様性パラメーターをデフォルト付近に引き上げたところ一発目からイカれた回答が…。かわいいのは認めるが、最後の何??

まとめ

さて、色々試してきてしまったので、ちょっと長くなってしまったのでこの辺でまとめておきたいと思います。
りんなでチャットアプリを作った件については、Pythonはライブラリが豊富で普段からよく使う言語で簡単にWebアプリ化できました。
正直なところ、つい先日やったばかりのWebソケットなどを盛り込むことができたので、かなりちょうどいいネタでした。
次に言語パラメーターについてですが、ある程度数値を小さくして厳密な回答をさせた方が明後日の回答が出づらくなりましたね。
あと、やってて思ったのが、明後日の無駄に長い回答を生成させないように、max_tokensをは小さくしておいた方がいいかもしれないと思いました。
次回はもう少しアプリの方を深く掘り下げて、記事にするだけのネタがあればまとめようと思います。

配布情報

今回作成したPython&javastriptによるRinnaチャットアプリは動画よりダウンロードできます。
最終的に少し変えた部分があるので、使う前に次回の記事を見てください
配布されるのは私の書いた分だけですので、別途環境構築やライブラリのインストール、言語、モデルのダウンロードなどが必要です。


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