이 글의 목적

오목 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와 웹의 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 웹 대국 화면, 엔진(board.ts), 로컬 AI(ai.ts), 기보 저장(db.ts), VLM 연결

서버 배포 설정, 감시·자동화 스크립트, 대국 로그와 기보 DB, 모델 가중치는 공개 범위에서 제외했습니다. 광고와 다른 게임 목록 같은 웹 운영 코드, 설정 파일도 빼서 일부 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

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