ARTICLE

AIとポケモン対戦するためのシステムを作ったので構築記事を書きました

AIとポケモン対戦するためのシステムを作ったので構築記事を書きました

目次

こんにちは、ニケです。

7月4日にあいちゅーばーわーるどのDiscordサーバーで、AIキャラクターがポケモンチャンピオンズで対戦する大会が開かれました。
参加者はそれぞれ自分のAIキャラクター向けのシステムを作り、実際の対戦で競います。

第1回あいちゅーばー杯の大会サムネイル

あいちゅーばーわーるどのDiscordはこちらから。

Discordサーバー「あいちゅーばーわーるど@本店」に参加しよう!
あいちゅーばーわーるどは、AITuberやAIキャラクターが好きな人のための日本最大級のコミュニティです。推し語り、雑談、作品紹介、企画相談に加えて、AIキャラクターとおしゃべりできるスペースもあります! | 2151人のメンバー
discord.gg

私もAIニケちゃんと参加するため、対戦状況を音声で伝えると、盤面を整理して次の一手を提案してくれる Pokemon Battle Partner を作りました。

GitHubでリポジトリを公開しているので気になる方は見てください。

GitHub - tegnike/pokemon-battle-partner
Contribute to tegnike/pokemon-battle-partner development by creating an account on GitHub.
github.com

大会は12人を4人ずつ3グループに分けた総当たり戦から始まり、各グループ1位が決勝リーグへ進む形式でした。
私はグループCを全勝し、決勝リーグでは2敗して、最終結果は3位です。

配信で使う前は、AIがどこまでまともに判断できるか少し不安でした。
ところが実際には思っていたより精度が高く、視聴者の方からも良い反応をもらえました。

今回は、このシステムがどう動いているのか、そして AIに任せすぎないために何を作ったのか を紹介します。

画面を見せるのではなく、私が状況を話す

AIにゲームを遊ばせる方法として、まず思いつくのはゲーム画面をマルチモーダルAIへ渡す構成です。
私も以前、同じ方法でAIゲーム実況やAIプレイを作り、別の記事で構成と課題をまとめました。

AIにゲーム実況をさせてみよう! AIプレイも含めて考える | AIニケちゃんオフィシャルサイト
1年半前にnoteで書いたAIゲーム実況システムの続編。マルチモーダル処理の遅さ・コストという課題に対して、今なら取れるアプローチを紹介します。
nikechan.com

ただ、ポケモンバトルでは、残りHP、状態異常、能力変化、天候、設置技、判明している技や持ち物など、判断に使う情報がかなり多いです。
スクリーンショット方式は、読み取りに時間がかかり、表示内容を誤認しやすいのが課題です。

そこで今回は、私が対戦状況を音声で伝えることにしました。

スクリーンショット方式と音声入力方式の違い

「相手は初手ゲンガー、こちらはガブリアスです。シャドーボールで半分くらい削られました」のように話し、音声をテキストに変換してAIへ渡します。
AIの提案を聞いたあと、実際の技や交代先をゲームへ入力するのは私です。

完全自動ではなく、人間が正確な状態を渡し、AIが判断し、人間が操作する共同プレイになっています。

音声から次の一手が返るまで

このシステムでは、相談結果、現在対面、場の状態、自分と相手の選出、これまでの履歴をまとめて確認できます。

Pokemon Battle Partnerの相談画面

処理の流れは次の通りです。

  1. 私がマイクで現在の状況を話す
  2. 音声認識モデルで日本語テキストへ変換する
  3. 私が相談内容に合うボタンを押す
  4. 入力から対戦情報を抽出し、保存している盤面状態を更新する
  5. ローカルのポケモン情報やダメージ計算を材料に、AIが次の一手を決める
  6. AITuberKit経由でAIニケちゃんが発話し、私がゲームを操作する

音声入力からゲーム操作までのシステム構成

対戦状態は試合ごとに保存するため、毎回すべてを言い直す必要はありません。
AIニケちゃんのセリフはOBSにも表示し、視聴者が判断内容を確認できるようにしました。

AIに任せすぎないため、ボタンで役割を固定する

このシステムで一番工夫したのは、LLMのプロンプトよりも 操作画面のボタン かもしれません。

入力欄の下には、4つの相談ボタンがあります。

  • 選出相談: 自分の6体から、対戦に出す3体と先発を決める
  • 対戦相談: 現在の盤面から、次に使う技または交代先を決める
  • 会話: 対戦指示ではなく、私や視聴者との会話として返す
  • 反省会: 保存した試合履歴をもとに、対戦後の振り返りを行う

1つの入力文には、対戦状況の報告、次の一手の相談、視聴者との会話、対戦後の振り返りなど、複数の用途がありえます。
この用途の分類から回答までをAIへまとめて任せると、「相談」と「状況の解説」のどちらを優先するかが毎回一定になりません。
その結果、技や交代先が欲しい場面で一般的な解説だけ返したり、会話をしたい場面で対戦指示を返したりします。

配信中は、対戦相談を押したら必ず技か交代先とその理由が返り、会話を押したら対戦操作ではなく会話が返るほうが扱いやすいです。
そこで、何をさせるかは押したボタンで決め、ボタンごとにAIへ渡す指示と期待する出力を切り替える構成にしました。
AIには用途の分類をさせず、その範囲内の判断だけを任せます。
人間が仕事の種類を決め、AIがその仕事の中で考える分担です。

用途判断をAIへ任せる場合とボタンで役割を固定する場合の違い

AIの回答をそのまま採用せず、システム側でも確認を通します。

  • 選出は自分の6体から必ず3体を選ぶ
  • 対戦相談では、解説だけで終わらせず技か交代を返す
  • 覚えていない技、ひんしの交代先、タイプ相性と矛盾する指示を補正する

判断する部分はAIに残しつつ、判断してよい範囲はシステム側で管理する。
思ったより精度よく動いた理由は、モデルだけでなく、この境界の作り方にあったと思います。

一番大変だったのは、ポケモンの情報を揃えること

今はVibe codingで、音声入力のあるWebアプリ自体はかなり速く作れます。
一方で、ポケモンの判断に必要な情報は膨大です。

技、タイプ、特性、持ち物、能力値、覚える技、メガシンカ、現在の対戦環境に加え、ポケモンチャンピオンズ固有の仕様や自分の構築意図もあります。

LLMの一般知識だけでは現在のゲーム仕様と一致するとは限らず、すべてを長いプロンプトへ詰め込むと判断がぼやけます。
そこで基礎データはローカルに持ち、今回の対面に必要なものだけを読み込むようにしました。

音声で崩れやすい名前には別名テーブルを用意し、環境知識はポケモン別のMarkdownに分割しました。
使える技や双方のダメージもローカルで計算し、関係する材料だけをAIへ渡します。
システムを作るより、AIが使える形へポケモン情報を整えるほうが大変でした。

音声認識モデルは、固有名詞・速度・価格で選んだ

音声入力では、ポケモン名を正しく拾えることが特に重要です。
「ウォッシュロトム」や「マスカーニャ」が別の名前になると、その後の盤面更新も判断も崩れます。

そこで、17秒の同じ実音声を複数モデルへ渡して比較しました。
OpenAI系6モデル、Gemini系5モデルの計11モデルを試し、以下の表には精度・速度・価格を比べたうえで、最終候補として残った3モデルを抜粋しています。
速度は各モデル1回の実測、料金はテスト時点の単価から計算した概算です。

モデル文字起こしの傾向速度17秒あたりの概算
gemini-3.5-flash正解文と一致。フィラーも残る4.3秒$0.0076
gpt-4o-transcribe固有名詞は正確。フィラーをかなり削る1.2秒$0.0017
gpt-4o-mini-transcribe一部のポケモン名が崩れる1.2秒$0.0009

文字を忠実に残すなら gemini-3.5-flash が最も正確でしたが、このシステムで必要なのは議事録ではありません。
対戦相手の名前、HP、技、場の状態が正しければよく、フィラーは消えても困りません。

gpt-4o-transcribe はポケモン名を保ちながら1.2秒で返り、今回の試算では1回あたり約$0.0017でした。
固有名詞の精度、配信中の待ち時間、繰り返し使うコストのバランスから採用しています。

現在の仕様と料金は、OpenAIのGPT-4o Transcribe公式ページとGemini APIの料金ページを参照してください。
表の金額は今回の検証時点の概算です。

GPT-4o Transcribe Model | OpenAI API
developers.openai.com
Gemini Developer API pricing  |  Gemini API  |  Google AI for Developers
Gemini Developer API Pricing
ai.google.dev

配信では、強さとAIらしい変な行動の両方が出た

配信では、私が状況を話し、相談ボタンを押し、AIニケちゃんが発話し、私がゲームへ入力する流れを繰り返しました。

実際の配信はこちらです。

AIは思っていたより良い判断を返し、予選グループを全勝できました。
視聴者から精度を評価してもらえたのも嬉しかったです。

もちろん、あまり意味のない交代を繰り返すなど、人間なら選びにくい動きをする場面もありました。
AI側のエラーもありましたが、完璧ではない行動まで含めて、一緒に対戦している感覚はかなりありました。

次は「理由のある一手」を安定させたい

今回使ってみて、速度は大きな問題になりませんでした。
今後一番改善したいのは 判断精度 です。

単に一番ダメージが出る技ではなく、相手の交代やこちらの温存価値まで含めて、「この理由があるから、この一手を選ぶ」と判断してほしいです。

一方で、ルールを増やしてすべてを決め打ちすると、AIの応用力を消してしまいます。
ローカル計算とガードで明らかな間違いを防ぎ、複数の材料から最後の一手を選ぶ部分はAIに残す。

今回作ったものは完全自動化ではありませんが、この分担でAIニケちゃんと大会へ出て3位まで進めました。
AIにゲームを遊ばせる方法として、人間とAIが一緒に操作する形も十分面白いと思います。

宣伝

Pokemon Battle PartnerはGitHubで公開しています。

GitHub - tegnike/pokemon-battle-partner
Contribute to tegnike/pokemon-battle-partner development by creating an account on GitHub.
github.com

AIニケちゃんの発話にはAITuberKitを使っています。

GitHub - tegnike/aituber-kit: A web application for chatting with AI characters that anyone can easily set up and deploy.
A web application for chatting with AI characters that anyone can easily set up and deploy. - tegnike/aituber-kit
github.com

普段XでAIツールやAIキャラクターについて発信しているので、興味があったらフォローしていただけると大変喜びます🙇‍♀️

x.com
前の記事
AIニケちゃんの活動方針を見直しました
次の記事
AIキャラクターの「キャラ追従性」を測るベンチマークを作って11モデル試した