![見出し画像](https://assets.st-note.com/production/uploads/images/123781258/rectangle_large_type_2_8d8cab8349619f09262f61706633d52a.jpeg?width=800)
cluster にローカル処理のチャットボットを構築した話
メタバースプラットフォーム「cluster」向けに、ユーザーとコメント・音声で対話できるチャットボットを自宅のパソコン内に構築・運用してみた話
はじめに
こんにちは。やまちゃんと申します。
私はメタバースプラットフォーム「cluster」において、チャットボットによるテキスト・音声対話システムを構築・運用しています。
本システムは、以下のワールドで試すことができます。
そもそもチャットボット(chatbot, chatterbot, bot)とは、人間の発言に対して機械が自動的に応答するシステムのことです。
メタバースの場合、通常は人間のユーザー同士が会話を行いますが、ユーザーの代わりにチャットボットが受け答えする形になります。
![](https://assets.st-note.com/img/1701988147450-xGm2CeEhTO.png?width=800)
チャットボットは、ユーザーの発言を理解するための文字認識や音声認識、自然な応答を行うための言語処理、応答文をユーザーに返すための文字入力や音声合成などを組み合わせて構築します。
これらの処理は計算量が多いため ChatGPT などのクラウド API を用いるケースが多いですが、今回は手元の PC 内部で完結する形で実現しました。処理をローカルで完結させる利点として、「クラウド API サービスの仕様変更や利用規約に左右されない」「通信環境が無くても使用できる」といったものが挙げられます。
この記事では、cluster におけるローカル処理のチャットボットの構築・運用を行った上での気付きをご紹介します。
他者事例
cluster においてチャットボットを動かす試みは、2023 年 12 月現在多くの検討・実装例が存在します。
チャットボットの実現方法の検討・実装の例。
「ユーザーと同様にクライアントを操作する」「ワールドの仕組みとして組み込む」の二つの案が提示されています。
チャットボット用のアカウントを用意し、通常のユーザーと同様のクライアント操作を自動化ツールで行うことでコメントでのやり取りを実現している例。
ワールドの仕組みとして、プレイヤーのコメントに反応する仕掛けでコメントでのやり取りを実現している例。
また、クラスター自身が法人顧客向けに cluster に会話型 AI を実装することを発表しています。
他のメタバースプラットフォームでは、例えば VRChat において音声でのやり取りが実装されたケースがあるようです。
このように、メタバースにおいてチャットボットは 2023 年 12 月時点で既に一般化しています。
一方で、処理の全てをローカルで行い、ある程度柔軟なやり取りが行えるものはあまり見られないようです。
ハードウェア構成
チャットボットを実行するハードウェアは、cluster クライアントを動かす Windows PC と、大規模言語モデルおよび音声認識・合成を担う Ubuntu PC のパソコン 2 台構成となっています。
![](https://assets.st-note.com/img/1702013384319-4wD3UJwVYD.png?width=800)
cluster クライアントを起動していると常時負荷が掛かるため、高性能な PC で実行すると必要以上に電力を消費します。そこで敢えてモバイル向け CPU 搭載の小型 PC で実行しています。
一方、Ubuntu PC は通常は軽量な音声区間検出処理のみでほぼアイドル状態、特に GPU は完全にアイドル状態となり、会話のやり取りの際のみ高負荷となります。そこで、レスポンスを確保するためにそこそこ速い構成としています。
2 台のパソコンの間は、コメント文字列などのやり取りを行うためのネットワークケーブルと、音声のやり取りを行うための一対のアナログ音声ケーブルとで接続されています。
ソフトウェア構成
コメント応答
ざっくりとした構成は以下となります。
cluster クライアントのコメント欄の画像を切り出す
コメント欄の画像を文字認識して、文字列を取り出す
ユーザーが話し掛けていると判断した場合、その文字列と過去の履歴を用いて応答文を生成する
応答文の文字列を cluster クライアントのコメント欄で送り返す
![](https://assets.st-note.com/img/1702001226588-3Qp7FWSBwj.png?width=800)
最初に、パソコン操作の自動化 (RPA) ツールの PyAutoGUI を使って cluster クライアントのコメント欄のスクリーンショットを撮ります。
スクリーンショットが直前の画像と変化したかどうかを OpenCV でチェックし、差分があれば新しいコメントが来ていると判断します。
新しいコメントを取り出すため、画像に含まれる文字列を光学文字認識 (OCR) ツールの EasyOCR で抽出します。
応答文を生成するために、大規模言語モデル (LLM) を使用します。ChatGPT に用いられている GPT-3.5 や GPT-4 の名前は聞いたことがある方もいらっしゃるかと思います。しかしながら、高性能なモデルは計算量が多いので家庭用のパソコンでは動きません。
そこで、ローカルで動作する大規模言語モデルとして、パラメータ数約 70 億の Japanese Stable LM Base Gamma 7B (Stability AI) を使用しています。パラメータは 4bit 量子化したものを用いることで、VRAM 消費量を抑えています。
最後に、PyAutoGUI を用いてマウスとキーボードを操作して cluster クライアントでコメントを送信します。
音声応答
音声応答の構成について、コメント応答との違いに注目して解説します。
cluster クライアントから音が出ているかどうか、スピーカ出力を監視する
音が出ていたら、その音に対して音声認識を行い文字列を取り出す
ユーザーが話し掛けていると判断した場合、その文字列と過去の履歴を用いて応答文を生成する
応答文の文字列を音声合成する
cluster クライアントに、マイク入力を使って応答音声を送り返す
![](https://assets.st-note.com/img/1702002441236-gqXGVpsGLs.png?width=800)
最初に、PyAudio を使って cluster クライアントから音が鳴っているかどうかをチェックします (音声区間検出、VAD)。
一定以上の音量で音が鳴っていたら、その部分を切り出して音声から文字列に変換する「音声認識」を行います。音声認識には、Whisper (OpenAI) を基に軽量化された Faster Whisper を使用しています。
応答文生成はコメント応答と同じく Japanese Stable LM を使用しています。
応答文をユーザーに届けるためには文字列を人の声にする「音声合成」を行います。音声合成には VOICEVOX を使用しています。"ずんだもん" や、本チャットボットで使用している "四国めたん" の声は聞き覚えのある方も多いかと思います。
最後に、PyAudio を使って合成された応答文の音声を再生し、cluster クライアントのマイク入力に流すことでユーザーに応答が返ります。
大規模言語モデル・音声認識モデル共に軽量化されたものを用いることで、VRAM 12GB の GPU 一枚で運用可能となっています。
運用上の気付き
2023 年 12 月現在、チャットボットを運用開始して 4 か月ほどが経過しました。この間に起きた色々な出来事と運用上の気付きについてご紹介します。
興味深かったできごと
チャットボットと並んで写真を撮る人がたくさんいた
![](https://assets.st-note.com/img/1702004322689-S8GykVMEn0.jpg?width=800)
当チャットボットがいるワールドのフィード (メタバース内で撮った写真の投稿欄) を見ていると、チャットボットのアバターの隣に並んで記念写真を撮る人が大勢いることに気づきました。
チャットボットのアバター (上図右側) は、ファンタジー感のある服装、妖精の羽、髪色はピンク、瞳は青と緑のオッドアイ…と非現実寄りのデザインにしています。
これは、チャットボットの応答が日本語話者としては少々不自然なものであること、とりわけ文法要素の正確さの一方で常識問題に弱いことから、ファンタジー世界から来た異種族なので日本の常識分かりません!という期待値コントロールを目的としたものでした。
もっとロボット然とした外見にすることも考えたのですが、そうするとスマートスピーカに話し掛けるような機械的な質問や、命令口調の会話をしたくなるかと思い、人型の外見にしたうえでファンタジー要素を強めた経緯があります。
写真に添えられたコメントも「かわいい」などと褒めてくださるものが多く、直立不動でコメントと音声応答しかしないチャットボットながら、そこに人格を感じていただけているのかなと思っています。
フレンド申請がいっぱい飛んできた
当初チャットボットを設置した際は、あくまでも人工知能が機械的に返答しているだけなので、ためしに少し触ってそれっきり…という方がほぼ全てだろうと想像していました。が、この想像は良い方に裏切られました。
当初想定していなかったチャットボットへのフレンド申請がいっぱい飛んできて、フレンドになった人の中には繰り返し遊んで下さるケースも複数あり、とても興味深く見ています。
困ったできごと
不適切な語句・NG ワードを言わせようとする試みが繰り返された
チャットボットに、暴力・セクシャルな単語、いわゆる NG ワードを言わせようとする試みが繰り返されるケースがありました。
大規模言語モデルは文章の繋がりを見てもっともらしい応答を作ろうとするので、NG ワードをユーザーが繰り返し使うと、それに繋がるもっともらしい応答として、チャットボットも NG ワードを使って会話しようとしてしまいます。
これを放置するとチャットボットが NG ワードの使用を繰り返すことにより BAN される可能性が出てくるため、最も対処に悩んだ事案となります。
このような事例に対しては、明確な NG ワードは応答を返す前に予めフィルタリングする必要があると思われます。
また、セクシャルな単語をジョークのレベルを越えて繰り返すなどの悪質なケースにおいては、当該ユーザへの通報やブロックにて対処するしかないと思われます。
短い応答、砕けた文章や記号列などに対して正常に応答できなかった
「そう」「なるほど」などの短い応答や、ネットミームなどの砕けた文章、「wwwww」などの記号列に対して正常に応答できず、同じことを繰り返したり意味不明な応答を返すようになったケースが見られました。
大規模言語モデルの学習に用いているデータが Wikipedia やブログ投稿・ニュース記事など、ある程度整った文章が主であることに起因すると思われます。また会話履歴を数ターン分保存していることから、記号列や砕けた文章が履歴に溜まるとそういった応答を返すのが正しいと判断するようになるのかもしれません。
履歴保持の仕方やプロンプト文字列を見直す、砕けた表現に強くなるような追加学習を行うなどの対策が必要になると思われます。
多人数で一斉に入力されると対応できなかった
複数のユーザーがワールド内に居て、各々が自分のタイミングでチャットボットに話し掛けたり、ユーザー同士が会話を始めたりした場合に正常に対応できなくなりました。
これは現状のチャットボットが話者を識別していないのが原因です。
各々が一斉に話し掛けるパターンは、コメント対話の場合はコメント欄の表示名を見て話者識別する、音声対話の場合はネームプレートの発話インジケーターを検出したり、声紋分析により音声ベースで話者識別したりする必要があると思われます。
ユーザー同士の会話を適切に無視するには、アバターの位置や顔の向き、話の文脈などを総合的に判断する必要があるので相当難易度が高そうですね…。今のところ思いつく解はありません。なにかいい解決手段があれば教えてほしいです。
運用コスト(電気代など)
そしてローカル処理となると避けられないのが、パソコンつけっぱなしによる電気代やらなんやらの話ですね!
電気代を厳密に確認したことはないのですが、消費電力は大雑把に測定したことがあります。
Windows PC (Ryzen 3 4300U) … 常時 25 W 程度
Ubuntu PC (Ryzen 7 1700 + GeForce RTX 3060) … アイドル時 40 W 程度、対話処理時 200 W 程度
…何もしないでも常時 65 W くらいは使っている、ということですね。
照明 1 つを 24 時間付けっぱなしにしているような感じになります。月の電気代に換算すると 1000 円強くらいでしょうか。
そしてそれ以上に、2 台の PC をチャットボット目的で占有してしまうという事実もあります。特に Ubuntu PC の方はそれなりに高性能なため結構な金額であり、コストだけならクラウドの方が安いんじゃないか?と思えます。
最後に
というわけで、cluster で動くチャットボットを自宅の PC 上に構築・運用してみた話でした。
つたない内容ですが、ご指摘やご質問など頂けましたらうれしいです!
そして…みなさんもチャットボット作りましょう!
作った暁には、是非 うちのこ と雑談しましょう!
この記事が気に入ったらサポートをしてみませんか?