
해커톤을 위해 RPG 마을 주민들에게 기억력을 부여했습니다
요약
cognee 해커톤을 위해 개발된 EchoWorld는 NPC에게 기억력을 부여하여 살아있는 마을을 구현한 프로젝트입니다. 그래프 기반의 메모리 계층을 통해 NPC들이 플레이어와의 대화를 기억하고, 소문을 통해 정보를 공유하는 역동적인 상호작용을 제공합니다.
핵심 포인트
- cognee API를 활용한 NPC의 장기 기억 및 상태 유지 구현
- 그래프 구조를 이용해 직접 대화하지 않은 정보도 전달되는 '가십' 시스템 구축
- remember, recall, improve, forget 네 가지 핵심 함수로 메모리 관리
- 플레이어의 행동에 따라 NPC의 태도가 실시간으로 변화하는 몰입감 제공
우리 데모의 가장 멋진 순간은 아주 사소합니다. Mira라는 이름의 경비병이 당신이 전날 그녀와 했던 약속을 어긴 것에 대해 지적합니다. 그 대사는 아무도 스크립트로 짜놓지 않았습니다. 그녀가 그렇게 말한 이유는 약속을 기억하고 있었고, 그 이후 당신의 행동을 보았으며, 그 두 가지가 일치하지 않는다는 것을 알아차렸기 때문입니다.
이것이 EchoWorld의 핵심 아이디어입니다. 우리는 cognee 해커톤을 위해 이것을 만들었습니다. 제 팀원이 빌드(build)의 대부분을 담당했습니다.
문제점 (the problem)
대부분의 게임 NPC는 기억력이 없습니다. NPC와 대화하면 한 마디를 내뱉고, 다음번에 당신을 만날 때는 마치 낯선 사람처럼 대합니다. 모든 대화는 제로(zero) 상태에서 시작됩니다. 세상은 살아있는 것처럼 보이지만, NPC들은 기본적으로 상태가 없는 함수 (stateless functions)와 같습니다.
우리는 기억력이 실제로 플레이할 수 있는 요소가 된다면 어떤 일이 일어날지 확인하고 싶었습니다.
정의 (what it is)
EchoWorld는 작은 탑다운 (top-down) 방식의 마을입니다. 대장장이 Gareth, 상인 Petra, 경비병 Mira, 그리고 Elder Voss라는 네 명의 NPC가 있습니다. 당신은 마을을 돌아다니며 그들과 대화할 수 있고, 당신이 하는 말은 기억에 남습니다.
여기에서 플레이할 수 있습니다: https://echoworld-l7zj.onrender.com/
데모 경로는 짧습니다. Gareth의 검을 칭찬하면 그는 마음을 엽니다. Petra의 가격을 비난하면 그녀는 적대적으로 변합니다. Mira에게 거짓말을 하면 게임은 이를 possible_lie로 태깅(tag)하고, 그녀는 의심을 품게 됩니다. 그러고 나서 하루를 마치면 마을 주민들이 가십(gossip)을 나누고, 모두의 태도가 업데이트됩니다.
제가 가장 좋아했던 부분은 이것입니다: 하루가 끝난 후 당신은 한 번도 만난 적 없는 Elder Voss와 대화할 수 있는데, 그는 당신이 이미 Petra를 화나게 했다는 사실을 알고 있습니다. 당신이 그에게 말하지 않았음에도 말이죠. 그 정보는 마을을 통해 그에게 전달되었습니다.
cognee가 작동하는 방식 (how cognee does the work)
cognee는 기억 계층 (memory layer) 역할을 합니다. 이 API는 네 가지 함수로 구성되며, 각 함수는 게임 내의 무언가와 매핑(map)됩니다.
remember()는 일어난 일을 저장합니다. 당신이 하는 모든 대사는 저장됩니다.
recall()은 NPC가 답변하기 전에 알고 있는 정보를 불러옵니다. Petra는 당신이 무례했다는 것을 기억하므로 차갑게 대합니다.
improve() (그들은 이를 memify라고도 부릅니다)는 하루를 마칠 때 실행됩니다. 이는 기억을 정리하고 그날의 사건들로부터 새로운 사실들을 도출합니다. 이것이 바로 가십(gossip) 단계입니다.
forget()은 뇌물입니다. NPC에게 기억 하나를 버리도록 돈을 지불하는 것이죠.
가십(gossip)이 흥미로운 부분입니다. 일반적인 설정이라면 대화 중인 NPC의 과거 메시지만 검색했을 것입니다. 하지만 cognee는 모든 것을 그래프 (graph) 형태로 저장하므로, 당신에 대한 사실이 주변 인물들과 연결됩니다. Voss가 무언가를 조회할 때, 쿼리 (query)는 그 링크들을 따라가서 그가 직접 듣지 못했던 소문에도 도달할 수 있습니다. 우리는 가십을 수동으로 코딩하지 않았습니다. 그래프가 이를 수행합니다.
핵심 루프 (core loop)는 다음과 같습니다:
말하기 전에 회상(recall)하고, 말한 후에 기억(remember)하십시오. 그것이 마을의 사회 생활 전부입니다.
거친 부분들 (the rough edges)
몇 가지 솔직한 한계점들이 있습니다.
모든 메시지에 대해 전체 파이프라인 (pipeline)을 실행하면 remember()가 느려지는데, 이는 그래프의 일부를 다시 구축하기 때문입니다. 그래서 우리는 플레이어가 시작하기 전에 모든 배경 이야기를 한 번 로드하고, 게임 중에는 백그라운드에서 그래프와 동기화되는 빠른 캐시 (cache)에 기록합니다. 하루의 끝 화면은 더 느린 memify 단계 위에 위치하므로, 대기 시간이 멈춤 현상이 아닌 게임의 일부처럼 느껴집니다.
forget()은 클라우드 측에서 우리가 원하는 대로 작동하지 않았습니다. 그래서 현재 뇌물은 특정 사실 하나를 삭제하는 대신, 해당 NPC를 새로운 기억 컨텍스트 (memory context)로 이동시킵니다. 게임 내에서는 동일하게 느껴지지만, 이는 임시방편이며 forget은 제가 가장 제대로 구현하고 싶은 부분입니다.
우리는 의도적으로 지도와 NPC 명단을 작게 유지했으며, 튜토리얼이 단계별로 안내하므로 기억 시스템이 당신이 실제로 주목해야 할 대상이 되도록 유지했습니다.
전체 루프 (the full loop)
데모는 마지막에 다시 돌아옵니다. 당신은 거짓말을 고백하고 (honest_confession 태그가 붙으며, Mira의 태도가 누그러집니다), Petra를 괴롭히지 않겠다고 약속한 뒤, 다시 Petra를 괴롭히러 갑니다. 약속은 깨진 상태로 바뀝니다. 또 다른 하루를 마무리하면 소문이 퍼지고, 당신이 돌아왔을 때 Mira가 그 이야기를 꺼냅니다.
그녀는 당신이 했던 약속과 당신이 실제로 한 행동을 비교하고 있습니다. 이것이 이 모든 작업의 핵심입니다: 기억이 결과(consequence)로 이어지는 것입니다.
왜 유용한가
대형 스튜디오들은 반응형 세계(reactive worlds)를 구축하기 위해 비용을 지불합니다. 그들은 작가들을 고용하고 거대한 분기형 대화 트리(branching dialogue trees)를 보유하고 있습니다. 소규모 팀은 그렇게 할 수 없기에 고정된 대사(fixed lines)와 평판 수치(reputation meter)를 사용하며, 결국 세계는 평면적으로 변하고 맙니다.
기억 레이어(memory layer)는 그 비용을 낮춰줍니다. NPC에게 성격과 기억을 부여하고 그것이 회상하도록 만들면, 모든 분기를 직접 작성하지 않고도 반응을 얻을 수 있습니다. 모든 마을 주민에게 동일한 작은 루프(loop)를 적용하는 것입니다.
EchoWorld는 거칠고 규모가 작습니다. 하지만 이 루프는 작동하며, 단 일주일 만에 구축되었습니다.
건승을 빕니다!
team forge (kavish와 jatin)
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기