【個人開発】ローカルLLM+Godot+CeVIOで「会話を覚えるホムンクルス育成ゲーム」を作った

AI関連の記事

以前から「AIキャラクターとただ会話するだけではなく、過去の会話を覚えて、関係性そのものがゲームになるものを作れないか」と考えていました。

そこで今回、GodotとローカルLLM、さらにCeVIO AIを組み合わせて、 30日間AIホムンクルスを育てるゲームを個人開発しました。

プレイヤーがホムンクルスと会話すると、その内容によって知識や魔法などを学習。 さらに過去の会話も記憶し、最終日には30日間の思い出を振り返ってくれます。

単純なチャットAIではなく、 「前に話したことを覚えているAIキャラクター」をゲームとして成立させるのが今回の目標です。

実際に30日間育ててみた動画

まずは実際に30日間育てたときの動画です。

最初はほとんど何も知らない状態ですが、会話や行動を繰り返していくことで少しずつ成長していきます。

今回のプレイでは魔法について一緒に勉強することが多かったため、 最終的には魔法寄りのホムンクルスへ成長しました。

どんなゲームなのか

ゲームの基本コンセプトはシンプルです。

  • ホムンクルスと30日間生活する
  • 自由入力でAIと会話できる
  • 会話内容によって能力が変化する
  • 過去の会話を短期・長期で記憶する
  • 能力や関係性によって成長方向が変わる
  • 最終日に30日間を振り返る

普通の育成ゲームなら「勉強する」ボタンを押せば知力が上がります。

今回はそうではなく、

「今日は一緒に魔導書を読もう」

のように実際の会話内容をLLMに判定させて、ゲーム側の成長に反映させています。

この「自然な会話」と「従来のゲームシステム」をどう接続するかが、一番面白く、同時に難しい部分でした。

開発環境

今回の主な構成は以下です。

用途 使用したもの
ゲームエンジン Godot 4.7.1
ローカルLLM実行 LM Studio
LLM Gemma系 26Bモデル
LLM API OpenAI互換 Chat Completions API
音声合成 CeVIO AI 小春六花
音声連携 Godot → Python Bridge → CeVIO AI COM
画面サイズ 960 × 540

クラウドAPIを前提にせず、会話部分はLM Studioで動かしているローカルLLMへ送っています。

Godot側からはLM StudioのOpenAI互換APIへアクセスするため、 ゲーム側から見ると一般的なChat Completions APIとほぼ同じ感覚で扱えます。

ただのチャットAIにしなかった理由

最初に重要だと考えたのが、 AIに自由にしゃべらせるだけではゲームにならないという点でした。

LLMだけに任せてしまうと、

  • 存在しないアイテムについて話す
  • まだ起きていない出来事を知っている
  • 昼なのに夜だと思っている
  • ゲーム内の能力値と会話内容が一致しない

といった問題が簡単に起こります。

そこで会話を生成するときに、 現在のゲーム状態をLLMへ渡すWorld State Groundingを実装しました。

World State Groundingで「今の世界」を教える

会話するたびに、ゲーム側が持っている現在の状態をLLMへ渡します。

例えば、

  • 現在の日数
  • 現在の時間帯
  • ホムンクルスの成長状態
  • 現在の能力
  • プレイヤーの名前
  • 現在ゲーム内で起きていること

などです。

これによってLLMに、

「あなたは自由なAIではなく、今このゲーム世界に存在しているホムンクルスです」

という制約を与えています。

完全にハルシネーションを無くすことはできませんが、 ゲーム世界と会話が食い違うケースはかなり減りました。

短期記憶と長期記憶を分けた

今回かなり力を入れたのが記憶です。

全部の会話履歴を毎回LLMへ渡せば簡単ですが、 30日分すべてを送るとコンテキストが膨大になります。

そこで記憶を2種類に分けました。

短期記憶

直近6会話ペアを保持します。

例えば、

プレイヤー「明日は魔法の勉強をしよう」
ホムンクルス「うん、約束だよ」

と話した直後なら、次の会話でも自然にその流れを維持できます。

長期記憶

一方で、重要な出来事は長期記憶として別に保存します。

長期記憶はゲームのセーブデータとは別にJSON形式で保持し、 必要なときだけLLMへ渡します。

これによって、 何日も前に話した内容を突然思い出すという演出ができるようになりました。

今回作っていて、一番「AIキャラクターらしさ」を感じた部分でもあります。

最終日に「思い出」を選んで話してもらう

30日目では、ただエンディング画面を表示して終わるのではなく、 長期記憶の中から重要なものを選び、 最後にホムンクルス自身の言葉で振り返ってもらうようにしています。

最大3件の記憶を選択し、それをLLMへ渡して最終会話を生成します。

生成された文章はそのままCeVIO AIへ送り、小春六花の音声で再生します。

この仕組みのおかげで、 固定されたエンディング文章ではなく、 そのプレイヤーと30日間過ごした結果としての最後の言葉を作れるようになりました。

ここは今回のゲームで最も実現したかった部分です。

会話から能力値を上げるLearning Classifier

もう一つ実装したのが、会話内容から学習内容を判断する仕組みです。

現在は大きく以下の4種類に分類しています。

  • knowledge:知識・勉強
  • magic:魔法
  • sensitivity:感性・交流
  • physical:身体能力

例えば一緒に魔導書を読んだ場合はmagic、 知識について勉強した場合はknowledgeといった形です。

ただし、ここは現在も調整中です。

誤判定を防ごうとして条件を厳しくしすぎると、 本当に一緒に勉強した会話まで「学習していない」と判断されてしまいます。

自然言語をゲームの数値へ変換する場合、 LLMを賢くすることより「どこまでをゲームルールとして認めるか」を設計する方が難しい と感じました。

CeVIO AIで会話をそのまま音声化

テキストだけでも遊べますが、 キャラクターゲームならやはり声が欲しくなります。

今回はCeVIO AIの小春六花を使用しています。

処理の流れは、

Godot
  ↓ HTTP
Python Bridge
  ↓ COM
CeVIO AI
  ↓
小春六花が発話

という構成です。

LLMが文章を生成すると、そのままCeVIOへ送って読み上げます。

そのためプレイヤーから見ると、 入力した文章にAIキャラクターが声で返事をするように見えます。

さらに会話中はBGMを少し下げるダッキング処理も入れ、 声が聞き取りやすくなるよう調整しています。

30日後の成長は4方向

ホムンクルスには大きく4方向の成長傾向を用意しました。

  • Scholar:知識寄り
  • Arcane:魔法寄り
  • Companion:プレイヤーとの関係性寄り
  • Independent:自立寄り

ゲーム中の行動や会話によって内部パラメータが変化し、 最終的な方向性が決まります。

今回動画にしたプレイでは、 魔法について話したり、一緒に魔導書を読んだりした結果、 Arcane系の成長になりました。

重要なのは「魔法ルートを選択する」というボタンを用意していないことです。

30日間どんな会話をしてきたかによって、 結果的にその方向へ成長する設計にしています。

作って分かったこと

実際に作ってみて感じたのは、 AI NPCはLLMを接続するだけでは面白くならないということです。

むしろ重要だったのは、

  • 何を覚えさせるか
  • 何を忘れさせるか
  • 今の世界状態をどう伝えるか
  • 会話をどこまでゲームの結果へ反映するか
  • AIに自由を与えすぎないこと

といった、LLMの外側の設計でした。

特に長期記憶は効果が大きく、 以前の会話を踏まえた言葉が返ってきた瞬間、 普通のNPCとはかなり違った感覚があります。

ゲームとして見るとまだ改善できる部分は多いですが、 「AIと会話した履歴そのものをゲーム体験にする」 という方向にはかなり可能性を感じました。

まだ改善したいところ

現在もいくつか調整を続けています。

  • 会話から学習したと判定する条件の調整
  • 最終日の会話とエンディング開始タイミングの安定化
  • BGM ON/OFFなど基本設定の追加
  • 長期記憶を使ったイベントの追加

機能を大量に追加するより、 まずは会話・記憶・育成の3つが自然につながることを優先していく予定です。

ショート版はこちら

約23秒のショート版も作りました。 ゲームの雰囲気だけ見たい場合はこちらの方が分かりやすいと思います。

約23秒のショート版はこちらです。

30日育てたAIホムンクルス、最後の日に【ショート版】

▶ ショート版をYouTubeで見る

まとめ

今回は、 Godot+LM Studio+ローカルLLM+CeVIO AIを組み合わせて、 会話を覚えながら30日間成長するホムンクルス育成ゲームを作ってみました。

技術的にはLLMとの会話生成よりも、

  • World State Grounding
  • 短期記憶
  • 長期記憶
  • 会話から成長への変換
  • CeVIOとのリアルタイム連携

といった周辺システムの方が重要でした。

LLMをゲームに組み込むときは、 「AIに何でもさせる」のではなく、 AIが自由に動ける範囲をゲーム側で設計することが大切なのだと思います。

今回のゲーム自体はまだ実験的な作品ですが、 過去の約束を覚えていたり、 最後の日に30日間の思い出について話してくれたりすると、 単なるチャットボットとは違うキャラクター性が生まれます。

このあたりは今後も色々試していきたいと思います。

実際の30日間のプレイはこちらから見ることができます。

30日育てたAIホムンクルス、最終日にまさかの一言【自作ゲーム】

コメント

タイトルとURLをコピーしました