
이번 글에서 만드는 것
첫 단계의 결과물은 화려한 모델이 아니라 한 장짜리 설계표입니다. 바둑 AI는 수를 추천하는 모델, 규칙을 판정하는 엔진, 대국을 저장하는 서버와 사용자가 돌을 놓는 화면이 함께 움직여야 합니다. 이 경계를 정하지 않고 모델부터 학습하면 불법수와 저장 오류를 모델 성능 문제로 잘못 판단하기 쉽습니다.
- 19×19 정규 바둑판을 사용합니다.
- 사람은 흑, AI는 백을 맡습니다.
- 사람의 착수에는 시간 제한을 두지 않습니다.
- 모델의 답은 규칙 엔진이 다시 검사합니다.
- 매 수의 판과 수순을 서버에 저장합니다.
1단계: 모델과 규칙 엔진을 분리합니다
모델의 책임은 현재 판을 보고 다음 좌표 후보를 내는 데까지입니다. 해당 점이 비어 있는지, 자충인지, 직전 판을 반복하는 패인지는 규칙 엔진이 판정합니다. 모델이 이미 돌이 있는 점을 답하면 후보를 거절하고 다시 요청합니다. 재요청도 실패했을 때는 임의의 수로 바꾸지 않고 오류를 기록합니다.
이 분리가 중요한 이유는 재현성입니다. 같은 판에서 문제가 생겼을 때 모델의 선택이 나빴는지, 규칙 코드가 틀렸는지를 따로 확인할 수 있습니다. 규칙은 테스트로 고정하고 모델은 교체 가능한 부품으로 남겨 둡니다.
2단계: 대국 상태를 한 객체로 정의합니다
최소 상태에는 19×19 판, 다음 차례, 잡은 돌 수, 패 금지 좌표, 전체 수순과 마지막 저장 시각이 들어갑니다. 화면만 보고 상태를 복구하려 하지 말고 서버가 원본을 보관해야 합니다. 브라우저를 새로 열어도 같은 대국을 이어 가려면 대국 코드와 접근 키도 필요합니다.
3단계: 완료 조건을 적습니다
첫 버전의 완료 조건은 ‘강한 AI’가 아닙니다. 사람이 합법적으로 착수할 수 있고, AI의 불법 답을 거절하며, 새로고침 뒤에도 수순이 남고, 두 번 연속 패스하면 종료되는 상태면 됩니다. 이 기준을 통과한 뒤에 학습 데이터와 기력을 개선해야 문제의 원인을 한 번에 하나씩 추적할 수 있습니다.
다음 글에서는 SGF 기보 한 판을 학습용 입력과 정답 좌표로 나누는 과정을 설명합니다.
이 단계의 실제 코드
MariaGO 웹 대국은 2단계에서 말한 ‘대국 상태 한 객체’를 아래 GameRow 타입으로 서버에 저장합니다. 판, 다음 차례, 패 좌표, 잡은 돌, 연속 패스 횟수와 전체 수순이 한 행에 들어가고, 다른 기기에서 이어 두기 위한 접근 키도 함께 보관합니다.
mariago-web/lib/gameTypes.ts
export type MoveRec = {
ply: number;
color: 1 | 2;
pass?: boolean;
r?: number;
c?: number;
};
export type GameWinner = "black" | "white" | "draw";
export type GameRow = {
code: string;
guest_id: string;
/** 비공개 키 — 다른 기기 이어두기용. 남에게 코드만 공유하면 안 됨 */
access_key: string;
board: number[];
to_play: number;
ko: { r: number; c: number } | null;
last_move: { r: number; c: number } | null;
move_no: number;
cap_b: number;
cap_w: number;
pass_streak: number;
epoch: number;
started: boolean;
status: "playing" | "ended";
end_text: string | null;
winner: GameWinner | null;
moves: MoveRec[];
created_at: string;
updated_at: string;
};사용한 모델: Qwen3-VL-8B-Instruct + LoRA 어댑터(lora_mix_qwen_r5). 전체 소스와 모델 설명은 ‘8. 전체 소스 코드와 사용한 모델’ 글에서 볼 수 있습니다.
COMMENTS · CHAPTER 01
바둑 AI의 범위부터 정하기 댓글 0
아직 댓글이 없습니다. 읽다가 궁금한 점이나 보탤 내용을 남겨 주세요.
댓글을 등록하려면 구글로 시작하기를 눌러 닉네임과 메일 주소를 등록해 주세요.
구글로 시작하기