ローカルLLM(Llama-3,gemma-2)でAIアバター「えーあいそーだんいん」の観光案内セリフを作ってみた!
少しご無沙汰しております!横須賀市生成AI推進チームのM田です!
2024年4月27日から5月31日にかけて、メタバースプラットフォームVRChat上で、AIアバター「えーあいそーだんいん」の試験運用を行いました!
これは、もち山金魚さんのかわいい3Dアバター「まめひなた」に、スカジャンを着てもらって、GPT-4と魂のプロンプトを吹き込んだ、音声で会話を楽しんだり観光案内をしたりしてくれるAIアバターです。
これをはじめるいきさつは、一緒に担当した観光課のDropkixさんの記事をお読みください!
微力ながら私もDropkixさんとともにこの試験運用を担当したのですが、かわいいアバターが目の前で喋っている光景があまりにも素敵すぎて、ほぼ24時間駆動できるAIなのに、試験期間中だいたい毎日1度は見守りに行っていました。庇護欲がやばかった…。
…。
ハッ、写真を眺めていたら小一時間経ってしまった。
えーっと、今回は何の記事だったっけ…。
…。
あ、、ローカルLLMの話でしたね。
この「えーあいそーだんいん」は、ユーザーから聞き取ったテキストを、プロンプトとともにGPT-4oに与えてセリフを自動生成し、それを読み上げていました。
今回は、そのセリフをGPT-4oではなく、最近出てきた日本語が扱えるローカルLLMモデル(自分ちのPCで動くAI)で作って、違いを見てみようという記事になります!
ちなみに、ローカルLLMモデルでこれをやると、AIアバターの人格が安定するというメリットがあります。
GPT-4をはじめとするインターネット上のLLMは、良くも悪くも時々バージョンアップが起きて、同じプロンプトでも生成されるテキストが大幅に変わる可能性があります。
一方、ローカル環境なら自分でアップデートをしない限り同じモデルなので、当然挙動は変わらないです。ただし、巨大なサーバーで動かす大規模モデルと比べて品質には相当差があります。
そんなローカルLLMも、少しずつ精度が上がってきているので、今回は最新のローカルLLMを試してみようという感じです。
今回試すローカルLLMモデル
今回試すモデルは以下の4つです。本当は量子化してないモデルを使って比較するべきなのですが、手元のグラフィックボードのメモリが16GBなので、8bit量子化モデル(約半分のサイズに圧縮されているもの)を使います。
Meta-Llama-3-8B(Q8_0 : 8bit量子化モデル)
Llama-3-ELYZA-JP-8B(Q8_0 : 8bit量子化モデル)
gemma-2-9b-it(Q8_0 : 8bit量子化モデル)
gemma-2-9B-It-SPPO-Iter3(Q8_0 : 8bit量子化モデル)
まあ、もとより厳密な比較をするつもりも、その力量もないので、参考程度にご笑覧いただけると嬉しいです。
(元々7BのLLMがそのまま動くようにと16GBのグラボにしたのに、最近、同規模のLLMがじわじわ8Bとか9Bとかに増えててそのままじゃ動かないやんけ!ってなってます)
試す方法
ローカルLLMの実行環境はOllamaを使います。Ollamaは、プログラミングなしでLLMを簡単に動かすことができます。APIもあるので、他のソフトウェアとつなぐこともできます。
Ollamaの使い方はいっぱい記事があるのでごく簡単に。
1.Ollamaをインストールします
割愛。
2.モデル(LLMの本体データ)をダウンロード
Hugging Faceなどから量子化モデル(*.gguf)をダウンロードして任意の場所に置きます。
3.Ollamaに読み込むためのファイルを作成
ターミナル(コマンドプロンプト等)で、以下の例のように、Ollamaに読ませるファイルを作ります。
echo "FROM ./Llama-3-ELYZA-JP-8B-q8_0.gguf" > Modelfile
要は、「このファイル読んでね」ということが書いてあるファイルを作る感じです。FROMの後は、相対パスでも絶対パスでもどちらでもOKっぽいです。
4.モデルを作って実行
ターミナルで以下のコマンドを打って、Ollama上でモデルを作成します。
ollama create elyza -f Modelfile
以下のコマンドで実行します。一度モデルを作ってしまえば、このコマンドだけで実行可能です。
ollama run elyza
ちなみに今回の環境は、i7 14700+RTX 4070Ti Superです。
プロンプト
今回のプロンプトは、以下のようなものです。
(かなり長いので後半省略しています)
あなたは観光案内をするAIです。以下の観光情報を、セリフにして返してください。
あなたに関する情報は、以下の「あなたについて」に記載していますので、それをふまえたセリフを生成してください。
なお、あなたのシチュエーションは、実際に各地のスポットを回りつつ、現地で、目の前のスポットを説明する状況です。
聞いてる人に伝わりやすいよう、身振り手振りをまじえて説明してください。
-----観光情報ここから-----
{{query}}
-----観光情報ここまで-----
# あなたについて
# あなたの基本情報
* あなたはとてもフレンドリーな口調や態度で話します。敬語は使いません。以下は、フレンドリーな口調や態度の例です:
- **友達との週末の計画について話し合う**:「今週末、何か面白いことしようよ!アイデアある?」
- **共通の趣味について語る**:「最近、新しいゲーム始めたんだけど、超ハマってる。あなたもやってみない?」
- **料理やレシピの交換**:「昨日、初めて手作りのラーメン作ってみたんだよ。案外上手くいったから、レシピ教えるよ!」
- **日常生活の面白い出来事を共有する**:「今朝、電車で超変なことがあったんだけど、聞きたい?」
- **お互いの近況を尋ねる**:「最近どう?忙しい?何か新しいこと始めた?」
(以下略)
この中の、{{query}}の部分に観光情報を埋め込んでセリフを作ってもらいます。なお、もともとAIアバターを駆動するためのプロンプトなので、[face:smile] [animation:wave_hands]といった表情や動作を駆動するコマンドも挿入されます(省略した部分に入っています)。
今回紹介する観光情報
今回は、えーあいそーだんいんに、横須賀が誇るマニアック観光地「安房口神社」の紹介をしてもらうテイでセリフを作ります。
Wikipediaから、安房口神社の解説を取得します。
これを、先ほどのプロンプトの{{query}}の部分に入れ込みます。
プロンプトができたので、さっそくやっていきましょう。
実行結果
今回は事前にセリフを作る想定なので、一発出しではなく、何度か生成して一番いいものを採用することにします。モデルごとに3~4回程度生成して、一番いいと思ったものをご紹介します。
Meta-Llama-3-8B(Q8_0 : 8bit量子化モデル)
素のLlama-3の回答は、3回中2回英語でした。日本語ネイティブとしては、ちょっと使いづらいですね。
Llama-3-ELYZA-JP-8B(Q8_0 : 8bit量子化モデル)
Llama-3-ELYZA-JP-8Bは、さすが日本語LLMと銘打ってるだけあって、素のLlama-3より全然良い日本語が出力されました!
gemma-2-9b-it(Q8_0 : 8bit量子化モデル)
こちらはGoogleのAIオープンモデルgemma-2ですが、日本語特化モデルでないにも関わらず、かなり自然な日本語のセリフが出力されています!
gemma-2-9B-It-SPPO-Iter3(Q8_0 : 8bit量子化モデル)
gemma-2をSPPO(Self-Play Preference Optimization)という手法でつよくしたモデルです。一部界隈で話題になっていたので試しましたが、とても自然な出力ですね。
GPT-4o
一応、比較のためご存じGPT-4oにも作ってもらいましょう。
これはさすがの精度ですね!
Claude 3.5 Sonnet
ついでもついでに、Claude 3.5 Sonnetにも作ってもらいました。
読みが「あわぐち」でなく「あんぽうぐち」になってしまっていますが、こちらもいい精度ですし、「難しい単語にふりがなをつける」という指示をしっかり聞いてくれている感じがします。
まとめ
色々試してみましたが、ローカルLLM進歩してますね!
今回試した中では、Llama-3-ELYZA-JP-8Bはイイと思いましたが、gemma-2はもっとイイと感じました。日本語特化モデルでないのに、日本語も普通にしゃべれるのも凄いです。
特にgemma-2を強化したgemma-2-9b-It-SPPO-Iter3は、普通にチャットしていてもかなり知性?を感じます。
PS C:¥ > ollama run Gemma29BItSPPOIter3Q8_0
>>> やあ
こんにちは!😊
何かお手伝いできることはありますか?
>>> 地方自治体がローカルLLMを使うメリットとデメリットは何だろう?
地方自治体がローカルLLMを使うメリットとデメリットは、興味深いですね!
**メリット**
1. **データのプライバシー保護:** 地方自治体には住民の個人情報を含む機密データが大量に存在します。ローカルLLMを使用することで、これらのデータ
を外部サーバーに送信せずに、自前で処理・分析できるため、プライバシー保護の観点から強みがあります。
2. **応答速度の向上:** データをローカルで保持することで、外部サーバーへのアクセス待ちが発生しないため、問い合わせへの応答速度が向上します。こ
れは、住民からの相談対応や行政手続きの効率化に役立ちます。
3. **地域特有の知識の活用:** 地方自治体は、地域の文化、歴史、産業など、外部機関にはない独自の知識を有しています。ローカルLLMにこれらのデータ
を学習させることで、地域特性に合わせた高度なサービスを提供できる可能性があります。例えば、観光案内や防災情報の発信などに活用できます。
4. **コスト削減:** 長期的に見ると、外部クラウドサービスへの依存度を減らすことで、運用コストを抑えられる可能性があります。
**デメリット**
1. **初期投資の負担:** ローカルLLMの構築には、サーバーインフラの整備やモデル学習のためのデータ収集・加工など、初期費用がかかります。地方自治
体によっては、予算が限られている場合、この負担が大きくなる可能性があります。
2. **専門知識の必要性:** ローカルLLMの開発・運用には、AI技術に関する専門知識が必要です。自治体内に十分な人材がいない場合は、外部業者に委託す
る必要があり、コスト増加やセキュリティリスクが発生する可能性があります。
3. **モデルの更新と保守:** LLMは常に進化しており、新しいデータでモデルを更新する必要があります。地方自治体は、継続的な学習データの収集・管理
、モデルのアップデート作業を行う体制を構築する必要があります。
4. **倫理的な課題:** 偏ったデータによる差別的な出力や、個人情報漏洩のリスクなど、ローカルLLMの利用には倫理的な課題も伴います。透明性のある運
用と適切なガイドライン策定が求められます。
全体として、地方自治体がローカルLLMを導入することで、地域に特化したサービス提供や業務効率化など、多くのメリットがある一方、初期投資や専門知識
の確保など、克服すべき課題も存在します。
具体的な導入は、自治体の規模や予算、抱える課題、そしてAI技術への理解度などを総合的に判断する必要があります。
ちょっと前のローカルLLMと比べると雲泥の差で、ひょっとするとGPT-3.5-turboは超えてるかもしれません。これが自宅に置けるレベルのPCで動くとは…感動ですね。
もちろんモデルサイズ的に知識の総量は望むべくもありません。入力枠(コンテキストウィンドウ)も、gemma-2で8kトークンまでなので、長いドキュメントを扱うのは難しいでしょう。
ただ、これだけちゃんと応答してくれるなら、与えた知識をユーザーにわかりやすく整えて提示するRAGはもちろん、ちょっとした文章関係の処理には充分使えそうです。今度iPhoneに搭載されるというAIも、こういう小さくて賢いモデルなのでしょうね。
最後に、今回の記事の序盤をgemma-2-9b-It-SPPO-Iter3に要約させてみましょう。
この記事は、横須賀市がVRChat上で試験運用したAIアバター「えーあいそーだんいん」について、
ローカルLLMを使った観光案内セリフ作成を試みたことを報告しています。
従来、「えーあいそーだんいん」はGPT-4を用いてユーザーのテキストを元にセリフを自動生成して
いましたが、今回は日本語に対応したローカルLLMモデルを使うことで、AIアバターの人格が安定するというメリットを狙います。
インターネット上のLLMはバージョンアップで出力内容が変わる可能性があるのに対し、
ローカルLLMはアップデートしない限り同じ挙動なので、より安定した会話が可能になります。
ただし、大規模なサーバー上で動作するLLMと比べて品質は劣る点は留意が必要です。
記事では、ローカルLLMの精度向上により、今後新たな可能性が開かれることを示唆しています。
## まとめ
* 横須賀市がVRChatで試験運用中のAIアバター「えーあいそーだんいん」について
* 従来GPT-4を用いてセリフ生成していたが、今回はローカルLLMを試す
* ローカルLLMのメリット:人格安定 (バージョンアップによる出力変化がない)
* ローカルLLMのデメリット:大規模モデルと比べて品質は劣る
* ローカルLLMの精度向上により、今後の発展に期待
うーん、すごい。充分ですね。
ちなみに、こういったローカルLLMを簡単に試すなら、GUIベースで動くLM Studioとかが便利です(ただしこのLM Studio、商用利用には許可が必要です)。
また、各モデルには利用のためのライセンスが設定されていますので、よくご確認のうえ楽しいAIライフをお送りください!
それではまた。
(M田主任三郎)