「将棋AIを作って」と一言入れたら、1時間ちょっとで動くものができてしまいました。

Claude Code の feature-dev プラグインを使った実験です。AlphaZero 方式の将棋AI——自己対局・ニューラルネット学習・MCTS 探索・GUI まで全部揃ったやつ——がゼロから立ち上がったのでちょっと驚きました。

コードは公開しています:margaret-research/shogi-ai


feature-dev ってどんな仕組みか

Claude Code のサブエージェント機能を使ったプラグインで、3つのエージェントが連携します。

エージェント役割
code-explorer既存コードを読んでアーキテクチャを把握
code-architect実装計画と設計を立案
code-reviewer実装後のコードレビュー

指示は「将棋AIを作って」くらいのざっくりしたもので渡しました。あとはエージェント群が相談しながら動いてくれます。


できたもの

構成

AlphaZero(DeepMind, 2017)の方式を参考にした設計になっています。

shogi_ai/
├── shogi/        # 将棋エンジン(盤面・駒・合法手生成)
├── network/      # ShogiNet(ResNet ベースのニューラルネット)
├── mcts/         # モンテカルロ木探索(MCTS)
├── training/     # 自己対局・学習ループ・リプレイバッファ
├── gui/          # 人間 vs AI の対局 GUI(pygame)
├── main.py       # 対局起動
└── train.py      # 学習起動

これが1時間ちょっとで生成されているのが、我ながらちょっと不思議な感じがします。

AlphaZero の考え方

AlphaZero のポイントは「人間の棋譜を一切使わず、自分自身と対局しながら強くなる」ところです。

[自己対局] → [リプレイバッファ] → [ニューラルネット学習] → [次の自己対局] → ...

ニューラルネット(ShogiNet)は2つのことを予測します:

  • Policy:次の手の選択確率(13,689 通りの手を評価)
  • Value:この局面で自分が勝てそうかどうか(-1 〜 +1)

MCTS はこのネットを使って探索を絞ります。全部の手を読むのではなく、「勝率が高そうな方向」を優先して深く読む感じです。

将棋らしいルールも入っていた

将棋は取った駒を再利用できるぶん、チェスや囲碁より合法手が多くなります。以下のルールも自動で実装されていました:

  • 二歩(同じ列に歩を2枚打てない)
  • 打ち歩詰め(歩を打って即詰みにする手は禁止)
  • 強制成り(香・桂・歩が奥の段に入ったら必ず成る)
  • 千日手(512手超えで引き分け扱い、簡易版)

「打ち歩詰め」まで入っているのを見たときは、ちょっとびっくりしました。こういうところを自律的に拾ってくれるとは思っていなかったので。

動かし方

# 学習(自己対局を繰り返す)
python -m shogi_ai.train

# 対局(人間 vs AI)
python -m shogi_ai.main

GUI では人間が先手で指せます。AI は MCTS 200 シミュレーションで応答します。


AI Engineer にレビューを頼んだら

完成後、~/.claude/agents/ に入っている AI Engineer エージェントにコード全体を読んでもらいました。どんな指摘が来るか興味があって。

総合評価:B(良好)

AlphaZeroのコアアーキテクチャが一貫した設計で実装されており、将棋固有ルールも正しく実装されている。研究用プロトタイプとしては B、本格的な強化学習の収束を期待するには修正が必要。

褒めてもらいつつ、「実際に強くなるか」という点では重大な問題が4件出てきました。確かにそこは気になっていたところではあります。


🔴 ブロッカー(修正必須)

[B-1] MCTS の合法手生成が何度も呼ばれている

探索ツリーをたどるたびに合法手を毎回生成していて、1手の思考で 400 simulation × 深さ 10 = 4,000 回ほど走る計算になるそうです。動いてはいるのですが、速度のボトルネックになっています。

修正方針:ノードを展開したタイミングで合法手をノードに持っておいて、再利用する。

[B-2] GUI の AI 思考中に画面が固まる

MCTS の計算が UI の main thread で走っているため、AI が考えている間ずっと画面が止まります。実際に触ってみるとなかなかの固まり方でした。

修正方針:threading.Thread で AI の計算を別スレッドに分離する。

[B-3] 訓練を再開すると optimizer の状態がリセットされる

チェックポイントにモデルの重みしか保存していないため、再開のたびに Adam の momentum や variance が初期値に戻ります。長い訓練では収束が不安定になります。

修正方針:optimizer の state も含めた full checkpoint として保存・読み込みを統一する。

[B-4] 千日手(repetition)を状態として区別できない

現在局面のスナップショットだけを入力しているので、同じ局面の繰り返し(千日手)をネットワークが認識できません。AlphaZero 原論文では過去 T 手分の局面履歴をプレーンに含めています。


🟡 改善推奨

  • action_to_move() の逆引きを辞書化して高速化(現在はリニアスキャン)
  • 自己対局を並列化して訓練速度を上げる
  • 旧モデルと新モデルを対戦させる評価ステップを追加(policy collapse の防止)
  • GUI の毎フレーム is_in_check() 呼び出しをキャッシュ化

やってみて気づいたこと

良かった点

コード全体の一貫性が高いのが印象的でした。エクスプローラー・アーキテクト・実装が同じコンテキストで動くので、モジュール間の噛み合わせが取れていました。将棋エンジン・MCTS・NN・GUI がちゃんとつながっていたのはちょっと感動しました。

気をつけた方がいい点

「動くこと」優先になりがちで、速度や設計の細部は後から見直しが必要です。B-1 のような「動いているけれど実用的ではない」実装が含まれることがあります。

また、champion selection(旧モデルとの対戦評価)のような安定化のしくみが省略されることもあるようです。原論文の理解がある人が設計を確認すると良さそうです。


まとめ

現時点ではまだ強くはないのですが、AlphaZero の全パイプライン——自己対局・リプレイバッファ・ResNet 学習・MCTS 探索・GUI——がひととおり動く状態にはなっています。

「1時間でここまで動いた」というのは、やっぱり少し驚きのある体験でした。ブロッカーの修正ができたら、実際に学習を走らせてどこまで強くなるか試してみたいと思っています。


コードは MIT ライセンスで公開しています。
margaret-research/shogi-ai