dev.to

The Goblin Warren: an AI Dungeon Master that never invents a rule

규칙을 지어내지 않는 AI 던전 마스터, The Goblin Warren

The Goblin Warren은 Sanity에 저장한 D&D 5e 규칙을 조회하고 근거 문서를 인용하는 브라우저 기반 던전 크롤입니다. 자연어 규칙 질문은 Knowledge Base로, 정확한 능력치 조회는 GROQ로 나눠 처리하며, 답변 추적 화면에서 조회 과정도 확인합니다.

AI 요약

The Goblin Warren은 세 명의 영웅을 이끌고 다섯 층을 탐험하는 브라우저 기반 D&D 5e 던전 크롤입니다. 턴제 d20 전투와 3D 주사위를 제공하며, AI Dungeon Master(DM)가 규칙 질문에 답합니다. 설계 원칙은 DM이 규칙을 지어내지 않는 것입니다. 판정마다 Sanity에서 자료를 조회하고 출처를 인용하며, 플레이어는 각 답변의 조회 내역을 추적 화면에서 확인합니다.

게임 구성

탐험은 클릭 이동 방식이며, 시야 밖 공간을 가리는 fog of war, 미니맵, 금화, 상자, 함정, 설정 설명을 담은 lore stone을 포함합니다. 전투 화면에는 선공 순서 표시줄, 방어도(AC)를 상대로 굴리는 d20 판정, 3D 주사위, 주문책이 나옵니다. 파티는 Fighter, Wizard, Cleric으로 구성합니다. 다섯 층은 The Collapsed Gate에서 Throne of the Bugbear Chief까지 이어지며, 탐험과 전투에 서로 다른 음악을 사용합니다.

자연어 질의와 정확한 수치 조회

DM은 역할이 다른 Sanity Context MCP 엔드포인트 두 개를 사용합니다. dnd-kb Knowledge Base는 “Prone 상태가 무엇인가요?”처럼 규칙 설명과 판본 간 차이를 묻는 질문을 처리합니다. dnd-groq는 AC, HP, 명중 보너스, 주문 피해 주사위처럼 정확한 수치를 가져옵니다. 두 경로를 분리해 설명형 규칙과 정형 데이터를 각자 맞는 조회 방식으로 다룹니다.

규칙과 게임 데이터는 Sanity에 저장합니다. 데이터셋에는 규칙 87개, 상태 이상 33개, 주문 14개, 몬스터 15개가 있으며 2014년판과 2024년판 자료도 포함합니다. 게임은 몬스터, 영웅, 방 정보를 같은 데이터셋에서 GROQ 쿼리 한 번으로 가져옵니다. Knowledge Base에는 규칙과 상태 이상 문서만 넣어 총 120개 문서를 구성했습니다. 작성자는 베타 한도인 약 150개 아래에 맞췄다고 설명합니다.

GROQ 요청은 URL의 tools=와 groqFilter로 제한합니다. 필터는 _type을 rule, condition, spell, monster로 한정하며, 서버도 쿼리에 _type 조건이 있는지 검사하고 draft 문서 접근을 막습니다. MCP가 배열 객체를 개요 형태로 접는 문제는 공격 데이터를 인덱스별로 투영하는 방식으로 처리합니다. 예를 들어 공격 이름, 명중 보너스, 피해량, 피해 유형을 attack1, attack2처럼 명시해 가져옵니다.

근거 추적과 판본 차이

모델을 실행하기 전에 서버가 Knowledge Base 검색과 GROQ 조회를 병렬로 미리 수행합니다. 모델에는 선택 도구 호출 기회를 한 번 제공한 뒤 도구 없이 답변을 작성하게 합니다. 조회 결과에 없는 출처 표시는 답변에서 제거합니다. 답변마다 제공하는 “How the DM ruled” 패널에는 조회 유형, 검색어 또는 GROQ 쿼리, 인용 문서, 처리 시간이 표시됩니다. 규칙 문서에 판본 차이가 있으면 “Rules changed (2014 → 2024)” 안내도 보여줍니다.

작성자는 Knowledge Base가 규칙과 상태 이상 문서를 바탕으로 짧은 인용 포함 항목을 만들고, 판본을 섞어 쓴 사례를 충돌로 표시했다고 설명합니다. 발견한 충돌은 여섯 건입니다. 예를 들어 놀란(Surprised) 생물이 선공 판정을 불리하게 한다는 설명은 2014년 규칙을 인용했지만 실제로는 2024년 규칙에 해당했습니다. 2014년 규칙에서는 놀란 생물이 첫 턴에 이동하거나 행동할 수 없습니다. Context는 두 출처를 나란히 보여주며, 선택한 판본을 이후 작업의 지침으로 남깁니다.

DM은 Baseten의 DeepSeek V4.1 Flash와 AI SDK 7을 사용합니다. 작성자가 보고한 규칙 답변 시간은 약 1.3~2.2초입니다. SRD 5.2.1과 5.1 데이터를 CC BY 4.0 조건에 따라 변환해 Sanity 문서로 시드하며, 결정적인 문서 ID를 부여합니다. Sanity 설정에서는 프로젝트 Viewer 토큰과 Context Viewer 조직 토큰을 구분해야 합니다. 프로젝트 토큰으로 MCP 엔드포인트를 호출하면 contextGrantRequired 오류가 발생했다고 덧붙입니다.

dev.to 반응

  • @sizzlebop — 방금 직접 해봤는데 정말 잘 만들었네요! 훌륭합니다!

원문: dev.to / 번역·요약: Trawling