27B 로컬 모델로 게임을 만들었다고? — BONESMITH 개발 이야기
외부 에셋 제로, 로컬 추론만으로
클라우드 API 요금 청구서 보고 식은땀 흘리던 참인데, 로컬 모델 하나로 게임을 통째로 뽑아낸 용자가 등장했다.
r/LocalLLM에 올라온 u/BodegaOneAI의 글은 제목부터 가슴을 뛰게 만들었다. “Built a playable roguelite locally with Qwen3.6:27b.” 번역하자면 방구석에서 Qwen 3.6 27B 모델을 돌려 플레이 가능한 로그라이트 액션 게임을 하나 뚝딱 만들었다는 거다.
게임 이름은 BONESMITH. 해골 기사가 나와서 칼 휘두르고 점프하는 액션 플랫폼 로그라이트다. 여기까지 들으면 “요즘 AI로 게임 만드는 게 뭐 대수냐” 싶을 거다(나도 처음엔 그랬다). 하지만 이 프로젝트에 걸린 제약 조건을 보면 턱이 떡 벌어진다. 외부 파일이 단 하나도 없다. PNG 이미지도, MP3 사운드도, 그 흔한 외부 자바스크립트 라이브러리조차 없다. 스프라이트는 순수 코드로 HTML5 캔버스에 찍어내고, 효과음과 배경음은 WebAudio API로 실시간 주파수를 쏴서 합성한다. 서버도 필요 없다. 딱 index.html 파일 하나만 있으면 인터넷 끊긴 비행기 안에서도 완벽하게 돌아간다.
이 모든 무친 짓(?)을 유료 클라우드 API 한 푼 안 쓰고, 방구석 워크스테이션에서 돌아가는 27B 오픈 모델로 끝냈다는 게 핵심이다.
첫 번째 시도는 처참했다
물론 처음부터 술술 풀렸을 리가 없다. 글쓴이가 공개한 실패담이 진짜 눈물겹다(그리고 너무나 공감 간다).
첫 프롬프트의 결과물은 그야말로 재앙이었다. 첫 방에 들어가자마자 먹통(소프트 락)이 걸려 게임이 멈추고, 텍스트는 뭉개져서 읽을 수도 없었으며, 소리는 아예 나지도 않았다. 모델한테 “쩌는 로그라이트 게임 만들어줘!” 하고 한 방에 모든 걸 시키려다 장렬하게 터진 거다. 27B 모델의 컨텍스트 한계를 생각하면 당연한 결과다. 솔직히 Claude Opus나 GPT 최신 플래그십을 데려와도 단일 프롬프트로 완전한 게임을 뽑아내진 못한다.
보통 사람이면 여기서 “에이, 역시 로컬 장난감 모델로는 한계가 명확하네” 하고 때려치웠을 거다(나였으면 진작에 브라우저 닫고 맥주나 마셨다). 하지만 이 유저는 포기 대신 판을 다시 짰다.
프롬프트 구조가 결과를 바꾼다
실패 원인을 파헤친 뒤 프롬프트 설계 자체를 싹 갈아엎었다. 전략은 딱 세 가지였다.
명시적 범위 제어 (Explicit Scope Control). 모델한테 “게임 만들어” 같은 뜬구름 잡는 소리를 절대 안 한다. 이번 턴에 구현할 단 하나의 작업만 칼같이 지정한다. “이번 단계는 오직 캐릭터 좌우 이동과 점프만 짠다. 적 몬스터 생성은 다음 단계니 손도 대지 마라” 식으로 안전펜스를 친다.
수직 슬라이스 먼저 (Vertical Slice First). 모든 시스템의 껍데기만 얕게 건드리는 게 아니라, 실제로 조작 가능한 최소한의 루프를 끝까지 관통시킨다. 캐릭터 조작 → 적과의 칼질 전투 → 방 클리어 → 다음 방으로 전환. 이 핵심 루프 하나가 완벽하게 돌아갈 때까지 다른 기능은 쳐다보지도 않는다.
QA 게이트 (QA Gate). 각 단계가 끝나면 직접 돌려보고 검증을 통과해야만 다음 코드로 넘어간다. “지금 상태에서 버그 없이 조작되는가?” 확인도 안 하고 코드를 덮어쓰다간 나중에 어디서 터졌는지도 모른 채 프로젝트가 산으로 간다(경험담 맞다).
이 세 가지 파이프라인을 세우고 나니 결과물이 180도 달라졌다. 똑같은 27B 모델인데, 프롬프트 엔지니어링 구조만 바꿨을 뿐인데 게임이 굴러가기 시작한 거다.
27B가 혼자서 넣은 게임 디테일
진짜 소름 돋는 순간은 여기서부터다. 프롬프트로 시키지도 않았는데, 모델이 알아서 게임의 ‘손맛’을 채워 넣기 시작했다.
공격이 몬스터에 박히는 순간 화면이 몇 밀리초 동안 멈추는 히트스탑(Hitstop), 폭발이나 피격 때 진동이 서서히 잦아드는 스크린 셰이크 트라우마 감소, 발판 끝에서 발이 허공으로 벗어난 직후에도 찰나의 순간 점프를 허용해 주는 코요테 타임(Coyote Time)까지.
이 세 가지는 액션 게임 개발자라면 모를 수가 없는 ‘게임 필(Game Feel)’, 즉 조작감의 알파이자 오메가다. 사람이 “코요테 타임 넣어줘”라고 콕 집어 말한 게 아니다. 27B 모델이 “액션 플랫폼 로그라이트”라는 맥락을 쥐고 있다가, 자발적으로 적재적소에 이 디테일을 쑤셔 넣은 거다.
물론 100% 무결하진 않았다. 픽셀 아트 스타일을 잡을 때는 인간이 가이드를 줘야 했고, 혼자 두면 파일 크기를 통제 못 하고 비대해지는 한계도 보였다. 하지만 로컬 27B 모델이 게임의 손맛을 이해하고 알아서 구현한다는 건 불과 1~2년 전만 해도 상상도 못 하던 일이다.
API 비용이 제로라는 것
여기서 진짜 중요한 본질이 나온다. 바로 비용이다.
클라우드 플래그십 API로 이런 짓을 했다면 어떻게 됐을까? 캔버스 그래픽 코드 뽑고, WebAudio 파형 계산식 수정하고, 버그 터져서 고치고 또 고치다 보면 토큰 태우는 소리가 방 안을 가득 채웠을 거다. 한 번 실패하고 재생성할 때마다 내 피 같은 달러가 실시간으로 증발한다.
로컬 환경에선 그딴 걱정이 1도 없다. 코드가 터졌다고? 다시 돌리면 된다. 프롬프트가 마음에 안 든다고? 고쳐서 엔터 치면 끝이다. 속도 제한(Rate limit)도 없고, 월 구독료 압박도 없다(누진세 붙은 전기세는 잠깐 눈감아주자). 이 “실패 비용이 0원”이라는 압도적인 자유로움이 무한 반복 실험을 가능하게 만들고, 그 무한 반복이 결국 결과물의 완성도를 끌어올린다.
왜 주목해야 할까
BONESMITH가 스팀에 올려서 떼돈을 벌 상업용 대작 게임은 아니다. 하지만 이 시도가 보여주는 이정표는 대단히 선명하다.
그동안 로컬 LLM은 “채팅이나 가벼운 요약이나 하는 방구석 장난감” 취급을 받았다. 70B 넘는 모델을 집에서 돌리려면 수백만 원짜리 장비가 필요했고, 막상 돌려도 실망스러운 경우가 태반이었다. 하지만 지금은 Qwen 3.6:27b 수준만 돼도 적당한 단일 그래픽카드에서 쌩쌩 돌아간다. 그리고 이 녀석이 복잡한 멀티시스템 코드를 조율하고, 게임 조작감을 챙기며, 단일 파일 완성작을 뽑아낸다.
요즘 유행하는 ‘바이브 코딩’에 대한 시선도 다시 보게 된다. 레딧에 올라온 우스갯소리 중에 “내가 짠 바이브 코딩은 혁신적인 프로젝트고, 남이 짠 건 쓸모없는 디지털 쓰레기(slop)”라는 말이 있다(격하게 공감한다). 실제로 아무 생각 없이 AI한테 다 떠넘기면 쓰레기만 나온다. 하지만 BONESMITH처럼 명확한 안전펜스를 치고, 프롬프트를 모듈화하며, 엄격한 QA 게이트를 통과시키는 구조를 짜면 결과물은 완전히 달라진다. 도구의 한계가 아니라 쓰는 사람의 워크플로우 문제인 셈이다.
정리
한 명의 방구석 개발자가 27B 로컬 모델을 쥐어짜서 플레이 가능한 단일 파일 게임을 만들어냈다. 외부 에셋 제로, API 비용 제로. 첫 시도는 보기 좋게 말아먹었지만 치밀한 프롬프트 파이프라인으로 역전승을 거뒀다.
결국 로컬 모델의 한계선은 우리가 생각했던 것보다 훨씬 저 멀리에 있다. 중요한 건 모델 덩치가 몇백B냐, 클라우드 API를 쓰느냐가 아니라, 문제를 얼마나 잘게 쪼개서 모델이 소화할 수 있는 형태로 먹여주느냐다. BONESMITH는 로컬 AI 개발의 미래가 어디로 가고 있는지를 아주 유쾌하게 증명해 준 멋진 사례다.