오델로 AI의 구성

오델로는 바둑 클라이언트를 본떠 만들었습니다. Qt 앱, VLM 서버, 웹 대국(othello.mariago.kr) 세 부분입니다. 웹에서는 사람이 흑을 잡고 상대를 로컬 AI와 VLM 중에서 고릅니다.

사람과 둔 기록

웹에서 끝난 판은 31판입니다. 사람이 23판, AI가 7판을 이겼고 1판은 비겼습니다.

사람이 이긴 23판 중 12판은 9수 만에 끝났습니다. 결과는 모두 13–0으로, 백 돌이 판에 하나도 남지 않았습니다. 수순은 두 가지뿐이었습니다.

  • C4 C3 C2 C5 C6 D6 E6 F4 G4: 8판
  • D3 C3 B3 E3 F3 F4 F5 D6 D7: 4판

두 번째는 첫 번째를 대각선으로 뒤집은 수순입니다. 12판 모두 같은 브라우저에서 나왔습니다. 한 번 찾은 길을 계속 다시 간 것입니다.

사람과 둔 31판
사람과 둔 31판

상대가 누구였나

대국 기록에는 상대가 로컬 AI였는지 VLM이었는지 남지 않습니다. 그래도 12판은 로컬 AI가 둔 판으로 볼 수 있습니다. 같은 수순이 여덟 번, 네 번 그대로 되풀이됐기 때문입니다. 3편에 적겠지만 VLM 서버는 이 기간에 무작위로 수를 골랐고, 무작위로는 같은 수순이 반복되지 않습니다.

전멸 수순은 두 개뿐이었다

로컬 AI가 백일 때 흑이 둘 수 있는 모든 수를 11수까지 펼쳐 봤습니다. 백을 전멸시키는 수순은 정확히 두 개였고, 기록에 남은 두 수순과 같았습니다. AI에게 있던 구멍은 이 둘뿐이었고, 그 구멍을 찾아 계속 이긴 것입니다.

이 단계의 실제 코드

대국 기록 테이블입니다. 수순(moves)과 결과(end_text)는 있지만 상대 종류는 없습니다.

othello-web/lib/db.tsts · 18줄
CREATE TABLE IF NOT EXISTS games (
  code TEXT PRIMARY KEY,
  guest_id TEXT NOT NULL,
  access_key TEXT,
  size INTEGER NOT NULL DEFAULT 8,
  board TEXT NOT NULL,
  to_play INTEGER NOT NULL,
  last_r INTEGER,
  last_c INTEGER,
  move_no INTEGER NOT NULL DEFAULT 0,
  epoch INTEGER NOT NULL,
  started INTEGER NOT NULL DEFAULT 0,
  status TEXT NOT NULL DEFAULT 'playing',
  end_text TEXT,
  moves TEXT NOT NULL DEFAULT '[]',
  created_at TEXT NOT NULL,
  updated_at TEXT NOT NULL
);

다음 글은 ‘2. 한 수만 보는 AI: 배포된 AI와 소스가 달랐다’입니다.