제가 만든 것
Last Witness는 잊힌 놀이공원과 그곳의 고장 난 컴퓨터 'Keeper'에 관한 인터랙티브 스토리입니다.
Keeper는 14개의 기억을 가지고 있지만, 단지 7가지 질문을 할 만큼의 전력만 있습니다. 각 답변은 당신의 노트에 하나의 기억을 보존하는 동시에, 또 다른 듣지 못한 기억 하나를 사라지게 합니다. 일곱 번째 질문 이후에는 당신이 저장한 것들로 마지막 기록을 작성하게 됩니다.
점수는 없습니다. 어떤 공원의 조각들이 살아남을지는 당신이 결정합니다.
데모
Last Witness 플레이하기
공개 데모는 AI 추론(AI inference) 없이 키워드 매칭을 사용하는 Archive Edition입니다. 로컬 AI 에디션은 Ollama를 통해 Qwen2.5 3B를 사용합니다. 두 버전 모두 동일한 스토리를 공유합니다.
코드
GitHub 저장소 및 설정 방법
애플리케이션 코드는 MIT 라이선스를 따릅니다. 모델 가중치(Model weights)는 원본의 상위 라이선스를 유지합니다.
제작 과정
저는 JavaScript, HTML, CSS, Node.js 및 Ollama를 사용했으며, 패키지 종속성(package dependencies)은 없었습니다.
대화 내용은 미리 작성되어 있습니다. 오픈 웨이트 모델(open-weight model)이 각 질문을 해석하고 제약된 JSON(constrained JSON)을 통해 관련 있는 사용 가능한 기억을 선택합니다. 서버는 게임 업데이트 전에 그 선택을 검증합니다.
각 요청에는 남아있는 기록들만 포함됩니다. 저장된 기억, 지워진 기록, 이전 대화 내용은 이후 추론에서 제외됩니다. 당신의 노트는 Keeper가 할 수 없는 것을 기억합니다.
추론 실패(Failed inference)는 턴을 소모하지 않습니다. 자동 테스트 8개가 메모리 전환, 동시성(concurrency), HTTP 동작을 다룹니다. 실제 모델 검사는 관련성, 의역(paraphrases), 무관한 질문, 제거된 기록 등을 다룹니다.
인터페이스는 진한 녹색 톤, 세월의 흔적이 느껴지는 티켓, 공원 지도, 펼쳐지는 메모를 결합했습니다. 일러스트레이션은 CSS와 SVG를 사용하며, 선택적 사운드는 로컬에서 합성됩니다.
오픈 혁신이 중요한 이유
소프트웨어와 모델 가중치를 설치한 후에도, 로컬 AI 에디션은 오프라인으로 작동합니다. 질문들은 당신의 컴퓨터에 남아있으며, 호환되는 모델을 교체할 수 있습니다.
보존에 관한 이야기는 그 자체로도 보존 가능해야 한다. 소스(source)와 모델을 유지하면, 호스팅 서비스(hosted service)에 의존하지 않고 누군가가 Bellwether로 돌아갈 수 있게 해준다.
그 본질
한 기억은 잃어버린 장난감 여우에 관한 것이다. 매년 겨울마다 직원이 그것에게 목도리를 떠주었지만, 아무도 닫힌 서랍 안에서 그것을 보지는 못했다.
플레이어는 그 작은 친절함을 간직할 수도 있고—혹은 발견하기 전에 잃어버릴 수도 있다.
마지막 기록은 플레이어의 것이다. 키퍼(Keeper)가 그들에게 남긴 말은 다음과 같다:
“고맙습니다. 이제 램프를 끌 수 있을 것 같아요.”