この記事の目的

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

使用したモデル

  • Qwen3-VL-2B-Instruct: 最初の学習(lora_stoku)、試行錯誤学習(lora_move)、確定マス探し(lora_cell)、盤の読み取りと数字1の判定の 2B 版に使いました。
  • Qwen3-VL-8B-Instruct: 盤の読み取り(lora_board_read_8b)と数字ごとの置けないマス(lora_digit1_illegal_8b)を学習しました。4回目の記事の解き方は15サイクルのアダプターで行い、写真の取り込みは盤読み取りのアダプターを使います。
  • LoRA: peft、r=8、alpha=16。すべてのアダプターが同じ設定です。
  • Qwen2.5-1.5B-Instruct: Webチャットで一手の要求かどうかを見分けます。
  • Gemma 4(31B、E4B、mlx 4bit): 盤の座標を読めるかどうかだけをテストしました。
  • Webの一手: 今は VLM なしで、コードで確実な手を選びます。

フォルダ構成

  • ルートの dataset_*.py: 学習データの生成
  • ルートの *_train_loop.py、train_vlm.py: LoRA 学習とサイクルの繰り返し
  • sudoku_engine.py、sudoku_human_solver.py、vlm_digit_strategy.py: パズルの生成、人式の解き方、確実な手の探索
  • human_judge_*.py: 4回目の記事の判定デモ
  • sudoku_vlm_server.py、chat_bridge_server.py: VLM サーバーとチャットサーバー
  • main.py、main_window.py、photo_board_*.py: PyQt6 アプリと写真の取り込み
  • web: Next.js のWeb数独画面、解いた記録(db.ts)、AIチャットパネル
  • solve.md: 人の解き方を書いた文書

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

全ソース

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

プロジェクトルート48ファイル
board_read_demo.pypython · 256行 · 10KB

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

chat_bridge_server.pypython · 415行 · 13KB

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

dataset_digit_illegal.pypython · 128行 · 4KB

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

dataset_experience.pypython · 116行 · 4KB

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

dataset_human_solver.pypython · 205行 · 7KB

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

dataset_sudoku_coords.pypython · 159行 · 5KB

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

dataset_sudoku_read.pypython · 147行 · 5KB

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

dataset_sudoku.pypython · 104行 · 3KB

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

human_judge_one_game.pypython · 369行 · 14KB

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

human_judge_solve_cycle.pypython · 598行 · 22KB

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

main_window.pypython · 1,348行 · 47KB

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

main.pypython · 30行 · 662B

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

make_board_snapshot.pypython · 107行 · 3KB

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

photo_board_prep.pypython · 761行 · 25KB

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

photo_board_read.pypython · 132行 · 4KB

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

README.mdmarkdown · 70行 · 2KB

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

requirements-train.txttext · 3行 · 62B

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

requirements-vlm.txttext · 7行 · 107B

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

requirements.txttext · 1行 · 13B

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

solve.mdmarkdown · 45行 · 6KB

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

sudoku_engine.pypython · 259行 · 9KB

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

sudoku_human_solver.pypython · 997行 · 33KB

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

sudoku_vlm_server.pypython · 825行 · 30KB

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

sudoku_vlm_solver.pypython · 111行 · 4KB

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

train_vlm.pypython · 491行 · 17KB

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

vlm_agent.pypython · 212行 · 7KB

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

vlm_board_read_sim.pypython · 527行 · 18KB

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

vlm_board_read_train_loop.pypython · 767行 · 23KB

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

vlm_board.pypython · 701行 · 22KB

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

vlm_cell_train_loop.pypython · 852行 · 28KB

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

vlm_coord_probe_gemma.pypython · 392行 · 12KB

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

vlm_coord_sim.pypython · 349行 · 12KB

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

vlm_curriculum_loop.pypython · 496行 · 15KB

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

vlm_diag.pypython · 426行 · 14KB

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

vlm_digit_illegal_sim.pypython · 181行 · 5KB

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

vlm_digit_illegal_train_loop.pypython · 717行 · 22KB

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

vlm_digit_strategy.pypython · 304行 · 10KB

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

vlm_experience.pypython · 279行 · 9KB

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

vlm_human_probe.pypython · 331行 · 10KB

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

vlm_human_train_loop.pypython · 177行 · 5KB

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

vlm_human.pypython · 137行 · 4KB

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

vlm_loader.pypython · 95行 · 3KB

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

vlm_play_sim.pypython · 454行 · 14KB

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

vlm_play_train_loop.pypython · 380行 · 13KB

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

vlm_prompt.pypython · 386行 · 16KB

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

vlm_protocol.pypython · 310行 · 8KB

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

vlm_qwen8b_base_probe.pypython · 274行 · 9KB

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

vlm_stage_sim.pypython · 357行 · 11KB

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

web/27ファイル
web/next.config.mjsjavascript · 4行 · 92B

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

web/package.jsonjson · 26行 · 569B

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

web/postcss.config.mjsjavascript · 8行 · 135B

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

web/src/app/api/chat/route.tstypescript · 78行 · 2KB

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

web/src/app/api/session/move/route.tstypescript · 60行 · 2KB

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

web/src/app/api/session/route.tstypescript · 146行 · 4KB

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

web/src/app/globals.csscss · 33行 · 564B

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

web/src/app/layout.tsxtsx · 43行 · 1KB

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

web/src/app/page.tsxtsx · 5行 · 112B

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

web/src/components/AiChatPanel.tsxtsx · 117行 · 4KB

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

web/src/components/BottomNav.tsxtsx · 65行 · 2KB

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

web/src/components/GameScreen.tsxtsx · 382行 · 13KB

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

web/src/components/HomeScreen.tsxtsx · 197行 · 8KB

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

web/src/components/Logo.tsxtsx · 45行 · 1KB

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

web/src/components/NumberPad.tsxtsx · 35行 · 991B

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

web/src/components/SettingsScreen.tsxtsx · 63行 · 3KB

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

web/src/components/SudokuApp.tsxtsx · 716行 · 19KB

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

web/src/components/SudokuBoard.tsxtsx · 96行 · 3KB

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

web/src/lib/db.tstypescript · 283行 · 7KB

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

web/src/lib/device-id.tstypescript · 21行 · 659B

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

web/src/lib/move-kinds.tstypescript · 1行 · 60B

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

web/src/lib/notes.tstypescript · 31行 · 916B

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

web/src/lib/sudoku.tstypescript · 232行 · 6KB

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

web/src/lib/types.tstypescript · 73行 · 2KB

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

web/src/types/node-sqlite.d.tstypescript · 13行 · 326B

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

web/tailwind.config.tstypescript · 43行 · 970B

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

web/tsconfig.jsonjson · 26行 · 578B

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