この記事の目的

五目並べAIの実験に使ったソースコードを公開します。ファイルを開いたときだけコードを読み込みます。

使用したモデル

  • VLM: Hugging Face の Qwen3-VL-8B-Instruct で対局の25,413手を打ちました。今のサーバーは既定値の Qwen3-VL-2B-Instruct で動いています。盤の画像と文字の盤を一緒に渡し、"row col" の二つの数字を受け取ります。
  • LoRA: peft、r=8、alpha=16。勝った側の手だけを集めて学習します。MPS では fp16 で動き、損失が NaN になりました。
  • ローカルAI: Qt アプリの C++ AiPlayer と Web の ai.ts。勝つ手や止めるべき手を先に見て、残りは四方向の点数を足して選ぶヒューリスティックです。
  • エンジン: 黒・白で同じ禁じ手(三三・長連は禁じ手、四四は許可)、ちょうど5つだけが勝ち。

フォルダ構成

  • src: Qt6/C++ の五目並べエンジン、ローカルAI、盤の画面、VLM サーバーと通信する TCP クライアント
  • ルートの .py: VLM 推論サーバー(vlm_pva_server.py)、ログを学習データに変える dataset_omook.py、LoRA 学習の train_vlm.py、モデルのダウンロード
  • scripts: VLM の座標確認と文字の盤のクライアント
  • omook-web: Next.js のWeb対局画面、エンジン(board.ts)、ローカルAI(ai.ts)、棋譜の保存(db.ts)、VLM 接続

サーバーのデプロイ設定、監視・自動化スクリプト、対局ログと棋譜DB、モデルの重みは公開範囲から除外しました。広告やほかのゲームの一覧のようなWeb運用のコード、設定ファイルも除いたため、一部の import は公開していないファイルを指しています。

全ソース

38ファイル · 8,212行 — フォルダを開いてファイルを押すとコードを読み込みます。

プロジェクトルート7ファイル
CMakeLists.txttext · 30行 · 663B

コードを読み込んでいます…

dataset_omook.pypython · 347行 · 12KB

コードを読み込んでいます…

download_qwen3vl.pypython · 42行 · 1KB

コードを読み込んでいます…

requirements.txttext · 20行 · 725B

コードを読み込んでいます…

train_vlm.pypython · 360行 · 13KB

コードを読み込んでいます…

TRAINING.mdmarkdown · 136行 · 6KB

コードを読み込んでいます…

vlm_pva_server.pypython · 1,475行 · 54KB

コードを読み込んでいます…

omook-web/18ファイル
omook-web/app/api/game/[code]/route.tstypescript · 59行 · 2KB

コードを読み込んでいます…

omook-web/app/api/game/route.tstypescript · 32行 · 1KB

コードを読み込んでいます…

omook-web/app/api/vlm/move/route.tstypescript · 58行 · 2KB

コードを読み込んでいます…

omook-web/app/globals.csscss · 48行 · 864B

コードを読み込んでいます…

omook-web/app/layout.tsxtsx · 33行 · 944B

コードを読み込んでいます…

omook-web/app/page.tsxtsx · 71行 · 2KB

コードを読み込んでいます…

omook-web/app/play/page.tsxtsx · 773行 · 23KB

コードを読み込んでいます…

omook-web/app/play/play.module.csscss · 189行 · 3KB

コードを読み込んでいます…

omook-web/components/OmokBoard.module.csscss · 116行 · 2KB

コードを読み込んでいます…

omook-web/components/OmokBoard.tsxtsx · 85行 · 3KB

コードを読み込んでいます…

omook-web/lib/ai.tstypescript · 160行 · 4KB

コードを読み込んでいます…

omook-web/lib/board.tstypescript · 337行 · 9KB

コードを読み込んでいます…

omook-web/lib/db.tstypescript · 190行 · 6KB

コードを読み込んでいます…

omook-web/lib/gameTypes.tstypescript · 43行 · 855B

コードを読み込んでいます…

omook-web/lib/guest.tstypescript · 48行 · 2KB

コードを読み込んでいます…

omook-web/lib/omk3Client.tstypescript · 184行 · 5KB

コードを読み込んでいます…

omook-web/lib/renderBoardPng.tstypescript · 118行 · 3KB

コードを読み込んでいます…

omook-web/lib/vlmClient.tstypescript · 104行 · 3KB

コードを読み込んでいます…

scripts/2ファイル
scripts/probe_vlm_coords.pypython · 182行 · 5KB

コードを読み込んでいます…

scripts/vlm_text_client.pypython · 418行 · 15KB

コードを読み込んでいます…

src/11ファイル
src/aiplayer.cppc++ · 136行 · 4KB

コードを読み込んでいます…

src/aiplayer.hc++ · 9行 · 237B

コードを読み込んでいます…

src/boardmodel.cppc++ · 505行 · 16KB

コードを読み込んでいます…

src/boardmodel.hc++ · 127行 · 6KB

コードを読み込んでいます…

src/boardwidget.cppc++ · 198行 · 6KB

コードを読み込んでいます…

src/boardwidget.hc++ · 45行 · 1KB

コードを読み込んでいます…

src/main.cppc++ · 21行 · 543B

コードを読み込んでいます…

src/mainwindow.cppc++ · 962行 · 35KB

コードを読み込んでいます…

src/mainwindow.hc++ · 90行 · 3KB

コードを読み込んでいます…

src/tcpvlmclient.cppc++ · 386行 · 12KB

コードを読み込んでいます…

src/tcpvlmclient.hc++ · 75行 · 3KB

コードを読み込んでいます…