이 글의 목적

1~7편에서 단계별로 설명한 내용을 실제로 구현한 MariaGO 소스 코드 전체를 공개합니다. 파일이 많아 폴더별로 접어 두었고, 파일을 펼칠 때만 코드를 불러옵니다.

사용한 모델

  • 운영 모델: Qwen3-VL-8B-Instruct + LoRA 어댑터 lora_mix_qwen_r5 (rank 16, alpha 32)
  • 입력 방식: 판 이미지 대신 두 자리로 정렬한 텍스트 판(aligned)을 넣는 text-only 모드
  • 학습·추론 환경: Mac Studio(Apple Silicon)에서 MLX(mlx-vlm)로 LoRA 학습과 서빙
  • 학습 데이터: u-go.net의 KGS 4단 이상 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 웹 대국 화면과 기보 저장 API

서버 배포 설정, 원격 접속·감시 스크립트, 학습 자동화·실험용 스크립트, 학습 데이터와 모델 가중치(수백 GB)는 공개 범위에서 제외했습니다. 광고·로그인·랭킹 같은 웹 운영 코드와 설정 파일, 디버그용 도구, 예전 Gemma 모델 내려받기 스크립트도 빼서 일부 import는 공개하지 않은 파일을 가리킵니다. 코드 안의 /Volumes/MY_WORK/... 같은 경로는 작성자의 맥 기준이므로 실행할 때 자신의 경로로 바꿔야 합니다.

전체 소스

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

코드를 불러오는 중입니다…