Stage Whisper가 '전지적 NPC' 문제를 해결하는 방법: 컨텍스트 격리 아키텍처

NPC가 세 세션 전에 내 캐릭터가 말한 것을 인용할 수 있다는 건 꽤 놀라운 일이었습니다. 메모리 시스템이 작동하고 있었죠. NPC들은 과거 사건을 참조하고, 내가 말한 것을 인용했습니다. 하지만, 그것은 또 다른 문제를 일으켰습니다: NPC들이 전지적(omniscient)이 되기 시작한 것입니다.

최근 세션에서 발췌한 내용입니다. 관련 부분이 강조되어 있습니다:

"그래서, 그녀가 말한다, 나뭇잎이 바스락거리는 소리 위로 목소리가 쉽게 전해지며, 정말로 나를 찾아온 이유가 뭐야? 궁금해서야, 아니면 단지 그 엉망인 책상의 나머지를 정리하는 걸 피하려는 거야?"

이것은 이 캐릭터가 참여하지 않은 완전히 다른 장면에서 일어난 일을 참조한 것입니다. 이 캐릭터가 알 수 있는 방법이 전혀 없었습니다.

이런 작은 불일치는 몰입을 깨뜨립니다. 하지만 다른 경우에는 게임을 망칠 수도 있습니다. 예를 들어, 제 캐릭터가 순진한 인간들 사이를 항해하는 비밀 뱀파이어인 캠페인이 있습니다. NPC들이 내 비밀을 알고 있다는 듯이 은근히 암시하기 시작했고, 이는 갑자기 의심받지 않고 하루를 보내는 것을 매우 어렵게 만들었습니다. 또 다른 예로, 강도질 중에 유물을 훔친 것이 플레이어였는데, 관계없는 캐릭터가 수상한 발언을 하는 경우도 있었습니다.

AI는 기본적으로 드라마틱한 효과를 위해 컨텍스트에 있는 모든 비밀을 사용하기로 결정했는데, 이는 실제로 플롯상의 이유로 아주 가끔만 일어나야 하는 일입니다.

그렇다면 왜 AI에게 그렇게 하지 말라고 말할 수 없을까요?

문제는 부정형 목표를 달성하려 한다는 것입니다. "이 정보를 사용하지 마세요." 이는 긍정적인 경우인 "있는 정보를 사용하세요"보다 근본적으로 다르고 훨씬 더 어려운 작업입니다. 모델이 관련 컨텍스트를 무시하도록 훈련하려면, 정보가 분명히 사용 가능했지만 출력이 의도적으로 그것을 사용하지 않은 수천 개의 예제가 필요합니다. 이는 AI가 설계된 목적의 거의 정반대입니다. 대부분의 작업에서 유용한 컨텍스트를 무시하는 것은 과제 수행에 실패하는 것입니다.

이론적으로 모델이 비밀에 대해 행동하지 않는 더 많은 예제로 훈련될 수 있습니다. 하지만 내러티브와 롤플레이는 지금까지 모델 제작자들에게 큰 초점이 아니었기 때문에, 이 문제는 마땅히 받아야 할 관심을 받지 못했습니다.


저는 그 비밀 뱀파이어 캠페인에서 이 문제를 해결해야 한다는 것을 깨달았습니다. 캠페인은 제 캐릭터가 대부분의 시간 동안 평범한 인간으로 통할 수 있도록 설정되었고, 전체 요점은 들키지 않고 그 긴장감을 헤쳐나가는 것이었습니다. 어떤 NPC가 비밀을 알게 되는 순간은 큰 서사적 순간이 될 것이었고, 그 후에는 그들이 침묵을 지키도록 설득해야 했습니다.

제가 발견한 것은 거의 모든 잠재적 적대자가 어떻게든 알고 있다는 것이었습니다. 아무것도 드러내지 않았는데도 말이죠. 그리고 그것은 즉시 플롯을 망가뜨렸습니다. 마치 제 머리 위에 뱀파이어라고 알리는 큰 표지판이 있는 것 같았습니다. 제 캐릭터는 끊임없이 수습하느라 바빴고, 모든 캐릭터가 저를 압박하고 있는 것처럼 느껴졌습니다.

오랫동안 프롬프트를 실험했습니다. 결국 저는 정보를 아예 컨텍스트에 포함하지 않아야 한다는 것을 깨달았습니다.

해결책은 따라서 컨텍스트 격리입니다. AI가 보는 모든 것을 사용할 수밖에 없다면, 그 정보가 진짜로 없어야 합니다. 이것은 Stage Whisper에서 실현 가능합니다. 각 장면과 기억이 이미 등장하는 NPC로 태그되어 있기 때문에, 실제로 거기 있었던 캐릭터만 포함하도록 쉽게 필터링할 수 있습니다.

하지만 함정이 있습니다. 어떤 비밀들은 주요 플롯 동력입니다. 그것들을 완전히 삭제할 수는 없습니다, 이야기가 여전히 그것들을 설명해야 하기 때문입니다. 강도질이든, 비밀 뱀파이어든, 그 비밀들은 내러티브의 핵심이며, 그것들 없이는 같은 이야기가 아닐 것입니다.

그래서 우리는 텍스트 생성을 둘로 나누어야 했습니다.

첫 번째 부분을 스토리 디렉터라고 부릅니다. 이것은 전체 이야기를 지휘합니다: 플롯, 내러티브 비트. 모든 비밀을 가지고 있으며, 그 비밀들을 고려하여 이야기를 가장 잘 전개할 방법을 결정할 수 있습니다. 어떤 캐릭터도 아직 알면 안 되는 것들을 포함한 전체 그림을 이해합니다.

두 번째 부분을 씬 디렉터라고 부릅니다. 이것은 스토리 디렉터가 건네준 장면을 "연기"합니다. 모든 관련 NPC 기억과 성격에 접근할 수 있어서, 모든 NPC를 연기하고 중간 서술을 제공할 충분한 정보가 있지만, 진짜로 비밀을 알지 못합니다.

일부 정보는 한쪽에서 다른 쪽으로 전달되어야 합니다, 그래야 서로를 방해하지 않고 같은 이야기에서 작업할 수 있습니다.


스토리 디렉터는 씬 디렉터가 알아야 할 모든 것을 알려주는 시놉시스를 생성합니다. 다음과 같은 모양입니다:

<synopsis>
  Elian이 Maeve와 함께 314호실로 돌아온다, 익숙한 프라이버시 와드가 그들의 화려한 시연으로 모인 관심으로부터 잠시 휴식을 제공한다. 특이한 하루를 보낸 후 Maeve에게 공부가 필요함을 감지한 Elian은 혼자 탐험을 위해 방을 떠나기로 결정한다
  <npc_list>maeve-corwin</npc_list>
  <location>room-314</location>
  <new_scene/>
</synopsis>

이것은 씬 디렉터에게 장면에서 무슨 일이 일어나고 있는지, 어디인지, 누가 있는지, 새 장면인지 여부를 알려줍니다. 플레이어 캐릭터의 존재는 가정됩니다. 스토리 디렉터는 선택적으로 플레이어에게 캐릭터 밖(out-of-character) 대화를 제공하고, 자신의 향후 사용을 위한 상세한 연기 노트를 만들 수도 있습니다.

두 디렉터는 같은 컨텍스트를 보지 않습니다. 분할은 다음과 같습니다:

스토리 디렉터가 보는 것:

이것은 스토리 디렉터가 흥미롭고 일관된 플롯 결정을 내리는 데 필요한 모든 것입니다. 많은 데이터지만, KV 캐시가 비용을 관리 가능하게 유지합니다.

씬 디렉터가 보는 것:

이것은 의도적으로 축소된 시야입니다. 씬 디렉터는 장면을 진행하는 데 필요한 모든 것을 가지고 있고, 가져서는 안 될 것은 아무것도 없습니다.

두 개의 캐릭터 시트

공개 대 전체 플레이어 캐릭터 시트의 구분이 핵심입니다. 스토리 디렉터는 이야기를 만들기 위해 전체 세부사항과 모든 비밀을 알아야 합니다. 하지만 씬 디렉터는 그 세부사항을 알면 안 됩니다. 그래도 플레이어 캐릭터가 신체적으로 누구인지, 어떻게 생겼는지, 공개적 평판, 일반적인 NPC가 그들 주변에 있음으로써 자연스럽게 알 수 있는 것들을 알아야 합니다. 별도의 공개 시트를 유지함으로써 씬 디렉터는 비밀에 접근할 필요 없이 항상 그 컨텍스트를 가집니다.

장면별 기억 필터링

각 장면은 어떤 NPC가 참석했는지 태그됩니다. 이는 각 NPC와 관련된 최근 장면이 정확히 무엇인지 알 수 있다는 뜻이며, 그것들을 씬 디렉터의 컨텍스트에 추가합니다. 현재 세션 내의 장면이 매우 관련성이 높다고 가정합니다. 더 오래된 기억에 대해서는 시맨틱 검색이 중요할 수 있는 것들을 표면화합니다.

결과는 장면 속 캐릭터들이 모르는 것을 진짜로 알 수 없는 씬 디렉터입니다. 하지 말라고 지시받아서가 아니라, 그 정보가 물리적으로 거기에 없기 때문입니다.


저는 제 캐릭터가 인간 여성인데 상속법 때문에 남자로 변장해야 하는 캠페인을 진행하고 있습니다. 가벼운 코미디 캠페인이며, 그 성별 혼란에서 비롯되는 몇 가지 코미디 시나리오가 특징입니다.

이 시스템이 없으면, 일반적으로 NPC들을 놀라게 할 방법이 없습니다. 그들은 모두 무언가를 의심하는 것처럼 행동합니다. 직접적으로는 아닐지 몰라도, 그들이 당신에게 말하는 방식에는 항상 아는 듯한 뉘앙스가 있습니다. 설명하기는 어렵지만, 느낄 수 있습니다. 비밀 정체성의 드라마틱한 긴장감이 존재하지 않습니다.

하지만 이 시스템이 작동하면, NPC들은 완전히 진지하게 반응합니다. 그들은 전혀 모릅니다. 그리고 큰 폭로가 일어나는 장면들은 정말로 효과가 있습니다, 그 시점까지 그것에 대한 어떤 암시도 전혀 없기 때문입니다. 관객인 NPC들이 진짜로 예상하지 못하기 때문에 코미디가 살아납니다.

한 가지 엣지 케이스가 있습니다. 씬 디렉터가 정확한 비밀을 모르기 때문에, 가끔 해부학적으로 부정확한 세부사항을 만들어냅니다. 이것은 피하기 어렵습니다, 씬 디렉터가 그러한 세부사항을 포함하지 않는 공개 캐릭터 시트로 작업하기 때문입니다. 해결 방법은 세 번째 단계를 추가하는 것입니다: 스토리 디렉터가 생성된 장면이 나가기 전에 검토하여 이와 같은 불일치를 잡아내는 것입니다. 이것은 비용과 지연 시간을 추가하므로, 로드맵에는 있지만 아직 구현되지 않았습니다.

한 가지 놀라웠던 점: 게임 내에서 비밀이 밝혀지면, 그것이 자연스럽게 전파됩니다. 씬 디렉터가 이전에 생성된 장면들을 보유하고 있어서, 한 NPC가 장면에서 무언가를 알게 되면, 그것이 다음 턴의 컨텍스트의 일부가 됩니다. 장면이 끝나면, 그 장면들은 NPC를 위한 기억을 형성합니다. 세션이 끝나면, NPC 시트가 업데이트됩니다. 이 두 가지 모두 개별 NPC의 비밀에 대한 지식이 기록되고, 이제 그 NPC가 진짜로 알고 있는 상태에서 이야기가 계속될 수 있음을 의미합니다.


트레이드오프

이 접근 방식은 공짜가 아닙니다. 비용이 증가하지만, 씬 디렉터의 컨텍스트가 상대적으로 가볍기 때문에 정확히 두 배는 아닙니다. 프롬프트 캐시도 상당히 도움이 됩니다. 장면이 진행됨에 따라, 새로운 턴이 컨텍스트의 끝에 추가되므로, 프롬프트의 90%가 매번 새로 생성되는 대신 캐시에서 나올 수 있습니다.

현재 모든 캠페인에 활성화되어 있습니다. 아키텍처 변경 사항이 상당히 크기 때문에 이 설정을 우회하는 경로를 제공하는 것이 합리적이지 않습니다. 이야기에 큰 비밀이 없더라도 대부분의 캠페인에서 트레이드오프는 가치가 있습니다, NPC 일관성은 어쨌든 중요하기 때문입니다.

이것이 가능하게 하는 것: 게임 디렉터

2단계 파이프라인은 유용한 것을 보여줍니다: 최적화된 컨텍스트를 가진 더 전문화된 AI들 사이에서 작업을 분할하는 것이 하나의 AI가 모든 것을 하는 것보다 더 나은 결과를 낳는다는 것입니다. 이것은 자연스러운 세 번째 단계로 이어지고 있습니다.

저는 이것을 게임 디렉터라고 부릅니다. 그 역할은 TTRPG 메커닉을 처리하는 것입니다: 주사위 굴림, 스킬 체크, 상태 추적. 그 컨텍스트는 내러티브 이력보다 게임 규칙과 게임 상태에 더 관심이 있기 때문에 다른 것들과 다르게 최적화될 수 있습니다.

게임 디렉터를 추가하면 예상치 못한 이점이 있습니다. 매 턴마다 플레이어가 스킬 체크가 필요한 무언가를 시도할 경우를 대비해 실행되기 때문에, 플레이어 입력이 마지막 장면의 연속인지 아니면 새로운 것인지도 결정할 수 있습니다. 플레이어가 플롯을 움직이지 않고 NPC와 그냥 대화만 하고 있다면, 게임 디렉터는 스토리 디렉터를 완전히 건너뛰고 씬 디렉터가 스스로 장면을 계속하게 할 수 있습니다. 씬 디렉터는 NPC 시트를 가지고 있고 메모리 검색을 할 수 있어서, 전체 스토리 디렉터 호출의 오버헤드 없이 이런 대화를 이어갈 수 있습니다.

이것이 아키텍처가 나아가는 방향입니다: 점점 더 전문화되고, 모든 계층에 비용 절감 최적화가 내장된 3단계 파이프라인입니다.


Stage Whisper는 장기 캠페인의 깊이와 일관성으로 솔로 TTRPG를 플레이하고 싶은 사람들을 위해 만들어졌습니다. 이 컨텍스트 격리 아키텍처를 포함한 메모리 시스템이 이를 가능하게 합니다. 시작하기 또는 Discord 참여하기를 통해 실제로 어떻게 작동하는지 확인하세요.

Stage Whisper의 메모리 시스템에 대한 더 많은 정보는 파트 1: 서사적 일관성파트 3: NPC 드리밍을 참조하세요.