로컬 LLM을 던전 마스터(DM)로 사용하는 자체 호스팅 멀티플레이어 텍스트 RPG 'Anyworld'
요약
본 기사는 로컬 LLM을 던전 마스터(DM)로 활용하는 멀티플레이어 텍스트 RPG 'Anyworld'를 소개합니다. 호스트가 서버를 구축하고, LLM이 플레이어들의 행동과 상호작용을 종합적으로 처리하여 스토리를 진행하며, 실제 주사위 굴림 및 복잡한 메커니즘까지 구현했습니다.
핵심 포인트
- LLM 기반의 진정한 멀티플레이어 스토리 해결 기능 제공
- Python을 활용한 실제 난수 생성(RNG) 및 확률 계산 지원
- 호스트는 기술 지식이 필요하나, 플레이어는 별도 설치 없이 브라우저로 접속 가능
- 컨텍스트 관리와 세션 복구 등 안정적인 시스템 설계가 특징
안녕하세요 여러분, 저는 Anyworld라는 게임을 개발해 왔습니다. 이 게임은 AI Dungeon 초창기, 특히 브라우저 기반 무료 버전인 AI Dungeon 2에서 영감을 받은 브라우저 기반의 멀티플레이어(싱글 플레이도 지원) 텍스트 어드벤처입니다. 설정은 매우 간단합니다. 한 사람이 서버를 호스팅하고 llama.cpp를 통해 모델을 실행하며(OpenAI 또는 다른 클라우드 API도 지원하며, 비영어권 플레이에 좋습니다!), 친구들은 브라우저 링크로 접속하면 됩니다. 호스트가 배경과 목표를 설정하고, 플레이어들이 자신의 행동을 입력하면, LLM이 DM 역할을 수행하여 혼란을 정리하고 스토리를 진행합니다. 솔직히 말해서, 호스트는 Python 및 네트워킹(VPN을 통한 호스팅 게임 경로 열기, 포트 포워딩 등)에 대한 어느 정도의 기술 지식이 필요합니다. 개발이 계속됨에 따라 이 부분도 개선할 것입니다. 다른 서브레딧에서 Docker를 사용하라는 제안이 있었기에, 게임 자체 외에도 llama.cpp 백엔드, 권장 모델 및 구성 등을 포함할 수 있도록 확실히 고려해 볼 것입니다. 전체 레포지토리 문서를 붙여넣는 대신, 현재의 주요 기능들을 알려드리겠습니다:
게임 방식:
- 진정한 멀티플레이어 해결(True multiplayer resolution): 플레이어들이 행동을 제출하면 모델이 한 라운드 전체를 함께 해결합니다. 실제로 캐릭터 간 상호작용이나 방해받는 상황까지 고려합니다.
- 실제 주사위 굴림(Real dice rolls): 행동에 불확실성이 있을 때, Python이 실제 난수 생성(RNG) 수학을 처리합니다. 모델은 그 어려운 주사위 결과를 받아와서 결과로 서술합니다.
- 맞춤 시나리오(Custom scenarios): 배경, 캐릭터, 시작 상태를 직접 작성할 수 있습니다. 판타지에 국한되지 않습니다.
- 파티 채팅(Party chat): LLM이 읽지 않는 별도의 OOC(Out Of Character) 채팅 공간이 있어 이야기 진행 중에도 대화할 수 있습니다.
- 플레이어의 제로 설정(Zero setup for players): 호스트 외에는 아무도 설치하거나 모델을 실행할 필요가 없습니다. 데스크톱 및 모바일 브라우저에서 작동합니다.
DM 도구 및 숨겨진 메커니즘:
- 비공개 DM 가이드(Private DM guidance): 호스트로서, 모델에게 NPC의 동기, 비밀 규칙 또는 스토리를 어느 방향으로 이끌고 싶은지에 대한 숨겨진 정보를 제공할 수 있습니다.
비밀 트리거: 게임당 하나의 숨겨진 확률 굴림을 설정할 수 있습니다 (예: 플레이어가 건물에 진입하면, 그 건물이 플레이어에게 무너질 확률이 20%). Python이 백그라운드에서 확률을 굴리고, 만약 발동되면 모델은 근본적인 수학적 계산을 보여주지 않으면서 그 결과를 이야기 속에 녹여냅니다. 내부 작동 방식 및 메모리 컨텍스트 관리: 컨텍스트 창(context window)의 용량을 배분하고 구조화된 메모리 시스템을 사용합니다. 이전 라운드는 월드 상태(world states), 플레이어 사실, 그리고 해결되지 않은 흐름으로 압축됩니다. 또한 중요한 사실들을 실수로 삭제하지 않도록 요약본을 감사하는 2차 모델 패스도 수행합니다. 언어 지원: OpenAI 백엔드를 사용하는 경우, 영어 외의 언어로도 플레이할 수 있습니다 (나레이션과 결과는 시나리오를 작성한 언어를 자연스럽게 따릅니다). 참고 사항: 로컬 llama.cpp 백엔드는 현재 모델에게 영어로 나레이션하도록 지시합니다. 이는 제가 개발용 PC에서 실행할 수 있는 로컬 모델들이 영어 외의 다른 언어에서는 성능이 매우 좋지 않았기 때문입니다. 세션 복구: 연결이 끊긴 탭은 자동으로 재접속됩니다. 누군가 실수로 나가더라도 다시 로그인하면 미완료된 행동과 기록이 기다리고 있습니다. HTTPS 활성화 연결을 위한 자체 서명 인증서(self-signed certificates): 게임은 시작 시 자체 서명 인증서를 생성하여 암호화된 연결을 가능하게 합니다. 자체 서명의 문제는 접속하는 플레이어들이 해당 사이트가 안전하지 않을 수 있다는 경고를 받는다는 것입니다. 하지만 대부분의 브라우저는 이 경고에도 불구하고 플레이어가 게임을 계속 진행할 수 있도록 허용합니다. 이는 HTTPS를 처리하는 최적의 방법은 아니므로, 나중에 더 견고한 해결책을 구현할 계획입니다. 아직 작업 중인 부분입니다. 현재 서버는 한 번에 하나의 게임만 실행하며, 서버를 재시작하면 라이브 세션이 손실됩니다 (HTML/JSONL 기록을 생성하지만, 아직 로드 가능한 저장 상태(save states)는 아닙니다). 전반적인 이야기의 품질은 어떤 모델을 사용하고 설정을 어떻게 조정하느냐에 크게 좌우될 것입니다.
추천 모델: 개발 과정에서 llama.cpp와 context size 128k를 사용한 Gemma 4-26B-A4B Q4를 사용했는데, DM 역할을 수행하기에 충분 이상의 백엔드였습니다. RTX 5070 Ti 16 GB로도 속도가 충분히 빨라서 라운드 분량의 내용이 약 5초 정도밖에 걸리지 않았습니다. 제가 실제로 사용했고 추천할 수 있는 특정 모델은 다음과 같습니다: https://huggingface.co/EZForever/gemma-4-26B-A4B-it-qat-uncensored-heretic-UDmerge-GGUF (이 모델은 긴 컨텍스트에서도 지침을 잘 따르고 플롯 포인트를 기억하는 데 탁월했습니다). Gemma 4 모델에 권장되는 매개변수: - temperature 1.0 - top-p 0.95 - top-k 20 - min-p 0.0 - presence-penalty 0.0 - repeat-penalty 1.0 물론, 자신만의 모델을 사용해 보셔도 좋습니다! 저장소에는 실행 중인 모델이 게임의 요청을 얼마나 잘 따르는지 측정하는 벤치마크 파일이 포함되어 있습니다. AI 활용 공개: 이 게임 개발에 Alibaba Cloud의 Qwen 3.8 27b와 OpenAI의 GPT-5.6 Luna 및 GPT-6 Astra 모델을 사용했습니다. 실행 방법: 설치, 구성 및 게임 실행은 INSTALL.md를 읽어주세요. README.md에는 게임 작동 방식에 대한 세부 정보가 담겨 있습니다. 저장소 링크는 댓글에 게시하겠습니다. 저장소 링크도 댓글에 게시하겠습니다. OpenAI의 Luna와 함께 진행된 핀란드어 플레이 예시: https://preview.redd.it/08f8zljik8th1.png?width=1837&format=png&auto=webp&s=0c34f119d460eb970253ebe182e4381325a3ac09 이 게임은 MIT 라이선스이므로 완전히 오픈 소스입니다. 포크(Forking)하거나 협업하는 것을 장려합니다. 피드백을 듣고 싶고, 누군가 이 게임을 재미있게 플레이하길 바랍니다! /u/northpoler 제출 [링크] [댓글]
AI 자동 생성 콘텐츠
본 콘텐츠는 r/LocalLLaMA의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기