この記事の目的

1〜7回で段階ごとに説明した内容を実際に実装した、MariaGO のソースコード全体を公開します。ファイルが多いのでフォルダごとに折りたたんであり、ファイルを開いたときだけコードを読み込みます。

使用したモデル

  • 運用モデル: Qwen3-VL-8B-Instruct + LoRA アダプター lora_mix_qwen_r5(rank 16、alpha 32)
  • 入力方式: 盤の画像の代わりに、2桁で整列したテキストの盤(aligned)を入れる text-only モード
  • 学習・推論環境: Mac Studio(Apple Silicon)で MLX(mlx-vlm)による LoRA 学習とサービング
  • 学習データ: u-go.net の KGS 四段以上の SGF 棋譜。勝者の手を中心に、アタリ・取りの局面に重みを付け、座標読み取り専用のデータを混ぜました
  • 学習の順序: 座標専用アダプターから出発し、座標と手のデータの比率を変えながら r1 から r5 まで五ラウンド学習。各ラウンドで座標テストの正答率90%以上を通過したアダプターだけを次のラウンドに進めました

最初に試したモデル

最初は Gemma 4 E4B-it 4bit(mlx-community)に LoRA(rank 8、後に16)を付けました。モデルが座標を片側に寄せて読む問題が観測されたため、学習とサービングの盤の形式を aligned に統一し、ベースモデルを Qwen3-VL-8B に替えました。

補助として使ったもの

  • KataGo(b18c384nbt): 形勢の分析と、複数のアダプターが出した候補から一つを選ぶアンサンブル判定の実験
  • NumPy 2層 MLP ポリシー: 合法手マスクをかけた REINFORCE 自己対局の実験(rl_env)
  • C++ ヒューリスティックAI: アタリへの応手の安全網と、モデルの応答失敗時の代わりの手

フォルダ構成

  • src, tests: Qt6/C++ の囲碁クライアント、ルールエンジン(goboard)、整地(gamejudge)、ヒューリスティックAI
  • vlm_server: SGF の解析、学習データの生成、LoRA 学習、座標テスト、手の推薦サーバー
  • rl_env: NumPy の強化学習の実験
  • mariago-web: Next.js のWeb対局画面と棋譜保存 API

サーバーのデプロイ設定、リモート接続・監視スクリプト、学習の自動化・実験用スクリプト、学習データとモデルの重み(数百GB)は公開範囲から除外しました。広告・ログイン・ランキングのようなWeb運用のコードと設定ファイル、デバッグ用ツール、以前の Gemma モデルのダウンロードスクリプトも除いたため、一部の import は公開していないファイルを指しています。コード内の /Volumes/MY_WORK/... のようなパスは作者の Mac 基準なので、実行するときは自分のパスに置き換えてください。

全ソース

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

プロジェクトルート2ファイル
CMakeLists.txttext · 34行 · 759B

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

README.mdmarkdown · 63行 · 5KB

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

mariago-web/25ファイル
mariago-web/app/api/analyze/route.tstypescript · 86行 · 2KB

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

mariago-web/app/api/game/[code]/route.tstypescript · 57行 · 2KB

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

mariago-web/app/api/game/list/route.tstypescript · 17行 · 545B

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

mariago-web/app/api/game/route.tstypescript · 24行 · 914B

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

mariago-web/app/api/player/route.tstypescript · 12行 · 420B

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

mariago-web/app/globals.csscss · 53行 · 995B

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

mariago-web/app/kibo/kibo.module.csscss · 149行 · 2KB

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

mariago-web/app/kibo/page.tsxtsx · 115行 · 4KB

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

mariago-web/app/layout.tsxtsx · 33行 · 935B

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

mariago-web/app/page.tsxtsx · 40行 · 982B

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

mariago-web/app/play/page.tsxtsx · 1,104行 · 34KB

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

mariago-web/app/play/play.module.csscss · 252行 · 4KB

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

mariago-web/components/GoBoard.module.csscss · 115行 · 2KB

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

mariago-web/components/GoBoard.tsxtsx · 71行 · 3KB

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

mariago-web/components/ModelSelector.module.csscss · 38行 · 636B

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

mariago-web/components/ModelSelector.tsxtsx · 53行 · 1KB

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

mariago-web/lib/board.tstypescript · 260行 · 7KB

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

mariago-web/lib/db.tstypescript · 431行 · 13KB

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

mariago-web/lib/gameTypes.tstypescript · 67行 · 1KB

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

mariago-web/lib/guest.tstypescript · 40行 · 1KB

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

mariago-web/lib/katagoTypes.tstypescript · 14行 · 284B

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

mariago-web/lib/vlmClient.tstypescript · 98行 · 3KB

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

mariago-web/lib/vlmModels.tstypescript · 39行 · 2KB

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

mariago-web/package.jsonjson · 28行 · 708B

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

mariago-web/README.mdmarkdown · 53行 · 2KB

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

rl_env/11ファイル
rl_env/__init__.pypython · 18行 · 500B

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

rl_env/board.pypython · 196行 · 6KB

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

rl_env/env.pypython · 79行 · 2KB

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

rl_env/eval_policy.pypython · 68行 · 2KB

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

rl_env/policy_numpy.pypython · 157行 · 5KB

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

rl_env/requirements-train.txttext · 2行 · 104B

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

rl_env/test_legal.pypython · 76行 · 2KB

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

rl_env/test_phase2.pypython · 34行 · 917B

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

rl_env/test_phase3.pypython · 35行 · 1003B

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

rl_env/train_reinforce.pypython · 90行 · 3KB

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

rl_env/train_selfplay.pypython · 137行 · 5KB

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

src/13ファイル
src/aiplayer.cppc++ · 531行 · 20KB

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

src/aiplayer.hc++ · 26行 · 1KB

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

src/boardwidget.cppc++ · 309行 · 10KB

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

src/boardwidget.hc++ · 72行 · 3KB

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

src/gamejudge.cppc++ · 427行 · 15KB

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

src/gamejudge.hc++ · 95行 · 4KB

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

src/goboard.cppc++ · 419行 · 12KB

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

src/goboard.hc++ · 189行 · 7KB

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

src/main.cppc++ · 23行 · 662B

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

src/mainwindow.cppc++ · 2,698行 · 107KB

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

src/mainwindow.hc++ · 288行 · 12KB

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

src/tcpvlmclient.cppc++ · 469行 · 15KB

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

src/tcpvlmclient.hc++ · 91行 · 4KB

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

tests/4ファイル
tests/atari_smoketest.cppc++ · 341行 · 13KB

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

tests/test_cross_lessons.pypython · 129行 · 4KB

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

tests/test_monitor_heuristic.pypython · 135行 · 5KB

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

tests/test_pass_guard.pypython · 192行 · 6KB

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

vlm_server/21ファイル
vlm_server/__init__.pypython · 6行 · 202B

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

vlm_server/__main__.pypython · 372行 · 13KB

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

vlm_server/cross_lessons.pypython · 428行 · 13KB

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

vlm_server/dataset_baduk.pypython · 734行 · 26KB

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

vlm_server/dataset_coords.pypython · 190行 · 6KB

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

vlm_server/dataset_hogu.pypython · 214行 · 8KB

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

vlm_server/dataset_ladder.pypython · 396行 · 16KB

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

vlm_server/dataset_opening.pypython · 127行 · 4KB

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

vlm_server/eval_vlm_vs_vlm.pypython · 458行 · 16KB

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

vlm_server/ladder.pypython · 322行 · 10KB

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

vlm_server/policy_backend.pypython · 164行 · 5KB

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

vlm_server/README.mdmarkdown · 91行 · 3KB

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

vlm_server/requirements.txttext · 7行 · 195B

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

vlm_server/server.pypython · 2,474行 · 99KB

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

vlm_server/sgf_download.pypython · 215行 · 7KB

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

vlm_server/sgf_parser.pypython · 196行 · 6KB

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

vlm_server/shapes.pypython · 83行 · 3KB

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

vlm_server/train_lora.pypython · 294行 · 11KB

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

vlm_server/TRAINING.mdmarkdown · 437行 · 18KB

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

vlm_server/verify_board.pypython · 331行 · 11KB

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

vlm_server/verify_coords.pypython · 418行 · 13KB

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