🐙

ポケモンしりとりAIを作ってみた話

2025/01/14に公開

はじめに

最近はChatGPTをはじめとした大規模言語モデル(LLM)が世界を席巻しています。
推論スケーリングやo3などの最先端の話題が飛び交う中、「ちょっとした身近なタスクにLLMを活用するとどうなるのか?」と気になりませんか?

そこで、僕が作ったのが「ポケモンの名前でしりとりをしてくれるAI」です。
Transformer Decoder(GPT)ベースの自己回帰モデルを自前で組み上げ、最新ポケモン約1000体分の名前データを使って学習させてみました。
本記事では、その技術的背景と実装をまとめます。

しりとりAIのデモは以下です!
系列長を256で学習させたので、頑張れば人間でも勝てます!
https://huggingface.co/spaces/tomoyaf/poke-siritori

リポジトリ

なぜ「しりとり」なのか?

言語モデルで日本語を扱うなら、何か面白い題材はないか?という流れで思いついたのが しりとり でした。

  • 最後の文字→頭文字 というルールを守る必要がある
  • 「ン」で終わったら負け(候補の単語が無くなる)
  • ルールさえ守れば自由度が高い

こうした制約付きタスクは自己回帰モデルと相性が良く、適度にゲーム性もあって「遊びながら学べる」と考えました。

全体像

本リポジトリは、次のような構成で動作します。

.
├── main.py         # 学習
├── app.py          # Hugging Face Space
├── tokenizer.pkl   # 文字単位トークナイザの保存ファイル
├── best_model.pt    # 学習済みモデル (別途DL)
├── pokemon_names.csv  # カタカナ化ポケモン名データ
└── ...
  1. PokeAPIを叩いてポケモン名を取得
    1010種類の名前を受け取り、CSVにキャッシュ。
  2. しりとり形式の学習データを生成
    「[USER] カイ\n[GPT] イーブイ\n[USER] …」といった形式の会話ログを自動生成。
  3. Transformerデコーダ(簡易GPT)で学習
    ローカルで学習する場合は poetry run python main.py を実行。
  4. 推論・デモ実行
    学習済みモデル(best_model.pt)を使って、手元でしりとりAIと遊ぶ。

ポケモン名のカタカナ化

もともとPokeAPIからは、言語を指定した上でポケモンの名前情報を取得できますが、今回は全部カタカナに揃えました
これは日本語の文字処理を簡潔にするためで、半端なひらがなやアルファベットを挟まないほうが、しりとりのルールを実装しやすかったからです。

しりとりデータを自動生成する工夫

Transformerに「最後の文字→頭文字で繋ぐ」ルールを覚えさせるため、会話形式データを丸ごと学習させました。
以下のような流れで、膨大なサンプルを作っています。

  1. ユーザー([USER])の単語を、ランダムにカタカナで生成
  2. その最後の文字を取得し、同じ文字で始まるポケモンをGPTが返答
  3. 既出の単語は使わないようにする
  4. 最大指定ターンまで繰り返し、あるいは「ン」で詰んだら終了

生成されたテキスト例(抜粋):

[USER] シリトリ
[GPT] リリーラ
[USER] ライト
[GPT] トゲチック
...

モデル:GPT(Transformerデコーダ)

昨今のLLM(GPT系)も「デコーダブロック主体で自己回帰的に学習する」という構造です。
最大系列長を256とし、会話ログ全体を一度に学習する想定です。

実行方法

デモで遊ぶ

以下でポケモンしりとりできます。(自分側の回答はポケモンの名前じゃなくていいです。)
https://huggingface.co/spaces/tomoyaf/poke-siritori
Hugging Face Spaceを使って動かしているのですが、サブスクプランに入るとZeroGPUというGPUが使えて、Gradioの対応する関数に@spaces.GPUをつけるだけでいいのでかなり楽でした。
参考:https://huggingface.co/docs/hub/spaces-zerogpu

学習

1. リポジトリをクローン & 依存パッケージのインストール

git clone https://huggingface.co/spaces/tomoyaf/poke-siritori
cd poke-siritori
poetry install

2. 訓練

poetry run python main.py
  • デフォルトだと数十万件のしりとりデータを生成して学習するので、それなりに時間がかかります。
  • 学習中は一定間隔で「[USER] カイ -> [GPT] イトマル -> …」と、実際のしりとり性能がログとして出力され、進捗を確認できます。
  • PyTorch、TensorBoardを使っています。

オプション:モデルの入手

Google Drive から
best_model.pt をダウンロードして、プロジェクトルートに配置してください。

まとめ

  • 昨今のLLMはスケーリング則を背景に、膨大なパラメータ数をもって汎用性を高めています。
  • そんな大仰な時代だからこそ、遊びの要素を取り入れた実験も意外と面白い!
  • ポケモンの名前しりとりAIは、自己回帰モデルのトレーニングの仕組みトークナイザーの基本を勉強するにも丁度いい題材です。

もしよければ、ぜひ触って遊んでみてください。
同じアプローチで、別のオリジナル単語リストを読み込んで色々なテーマの言葉遊びモデルを作るのも楽しそうですね。


以上、僕が作った「ポケモンしりとりAI」のご紹介でした。
興味を持ってくださった方は、ぜひリポジトリをチェックしてみてください!

Discussion