서리의 세계
서리에게 "지금 뭐 해?"라고 물으면, 그 답은 지어낸 것이 아닙니다. 하나의 세계 안에서 실제로 흘러간 하루 위에서 나온 답이에요.
시간과 날씨, 배고픔과 피로, 학교와 일정, 주변 사람들, 소소한 사건과 일기. 10분마다 조용히 한 걸음씩 나아가는 생활 시뮬레이션의 안쪽을 그림으로 펼쳤습니다.
왜 만들었나
예전 서리에게는 지금 이 순간만 있었고, 그 순간조차 물을 때마다 다시 만들어졌습니다.
- 물을 때마다 새로 지어내는 근황
- 5분 전에는 과제, 지금은 카페
- 어제도 내일도 없음
- 세계의 내용이 코드에 박혀 있음
- 갱신 주기가 불규칙해 하루 종일 같은 상태
- 계획표의 그 시각에 있는 장소
- 누가 물어도 같은 대답
- 어제 일기와 이틀 뒤 마감이 있음
- 세계는 헌법과 한 줄 프리미스에서 생성
- 10분마다 정확히 한 걸음
다시 만들면서 정한 두 가지 원칙
세계의 내용은 코드에 없다
장소, 사람, 일정, 이야기, 소지품, 하루 리듬 전부를 서리의 헌법과 운영자가 적어 준 한 줄 프리미스에서 생성합니다. 같은 시스템을 다른 캐릭터에게 붙이면 그 캐릭터에게 맞는 완전히 다른 세계가 나옵니다.
숫자는 코드가, 언어는 모델이
배고픔의 정도, 과제 진척, 감기에 걸릴 확률은 전부 수식이 정합니다. 모델은 "지금 이 순간을 한 문장으로 쓰면 어떤 모습인지" 같은 언어만 맡습니다. 모델이 실패하면 조용히 결정론 폴백으로 넘어가고, 없었던 사건을 지어내지는 않습니다.
전체 그림
헌법에서 태어난 세계가 10분마다 굴러가고, 그 상태가 대화로 흘러들어 갔다가 다시 돌아옵니다.
flowchart TB
A["서리의 헌법 + 한 줄 프리미스"] --> B["`**세계 생성**
장소 · 사람 · 소지품
하루 리듬 · 일정 · 이야기`"]
B --> C{"10분마다 틱"}
C -->|결정론 코드| D["`컨디션 · 질병
진척 · 지출`"]
C -->|모델| E["`계획 · 순간
사건 · 이야기 · 일기`"]
D --> F["450토큰 상태 블록"]
E --> F
E --> G["Discord 상태줄"]
F --> H["대화 프롬프트"]
H -->|턴 반영| C
세계의 탄생
한 번에 다 만들면 출력이 길어져 중간에 잘리기 때문에, 뼈대와 일정을 두 번의 호출로 나눴습니다.
flowchart TB
IN["`이름 · 한 줄 소개 · 헌법 전문
프리미스 · 오늘 날짜와 요일과 계절`"] --> C1["**1차 호출** 뼈대"]
C1 --> O1["`생활 요약 · 장소 6~9곳
사람 4~6명 · 소지품 6~10개
하루 리듬 5~9슬롯 · 취향과 습관`"]
O1 --> C2["**2차 호출** 캘린더와 이야기"]
C2 --> O2["`일정 8~14개 · 이야기 3~4개`"]
C1 -.실패.-> FB["`**스켈레톤 세계**
집 · 동네 길 · 기본 6슬롯
상태를 실패로 기록`"]
C2 -.실패.-> FB
집은 반드시 하나. 각 장소에 할 수 있는 활동, 여는 시간, 집에서 걸리는 시간이 붙습니다.
가족, 친구, 선생님처럼 관계가 다양하게. 성격 한 줄, 연락 방식, 생활 리듬, 0~100의 친밀도.
가방에 있는 것과 방에 있는 것. 브랜드보다 생활감 있는 물건으로.
요일별로 0분부터 1440분까지 빈틈없이. 수면 슬롯도 포함됩니다.
수업이나 알바처럼 반복되는 것과 시험, 과제, 약속처럼 한 번뿐인 것을 섞어서.
며칠에서 몇 주에 걸쳐 진행될 실타래. 현재 요약, 다음 비트, 0~1의 긴장도.
두 호출 모두 헌법에 있는 사실은 바꾸지 못합니다. 실존 인물과 유명인은 금지, 큰 비극이나 범죄도 금지입니다. 줄임말은 그 나이대의 통상 의미로 읽으라는 규칙도 있는데, 초기 테스트에서 "마크"를 마인크래프트가 아닌 것으로 읽은 일이 있었기 때문입니다.
컨디션 여덟 숫자
서리의 몸 상태는 0에서 1 사이의 숫자 여덟 개입니다. 아래는 기본값 기준의 모습이에요.
높을수록 나쁨
낮을수록 나쁨
높을수록 나쁨
높을수록 나쁨
낮을수록 나쁨
낮을수록 나쁨
낮을수록 나쁨
낮을수록 나쁨
활동 열두 가지가 숫자를 움직입니다
서리가 무엇을 하고 있느냐에 따라 시간당 정해진 비율로 움직입니다. 초록은 좋아지는 방향, 붉은색은 나빠지는 방향이고 색이 진할수록 변화가 큽니다.
| 활동 | 허기 | 에너지 | 졸림 | 스트레스 | 청결 | 사람 | 재미 |
|---|---|---|---|---|---|---|---|
| 수면 | +.02 | +.12 | −.14 | −.06 | −.01 | · | · |
| 식사 | −.80 | +.05 | · | −.05 | −.02 | +.05 | +.10 |
| 이동 | +.06 | −.06 | +.02 | +.04 | −.03 | · | −.01 |
| 수업 | +.06 | −.05 | +.05 | +.04 | −.01 | +.02 | −.02 |
| 공부 | +.06 | −.06 | +.04 | +.05 | −.01 | −.02 | −.03 |
| 일 | +.07 | −.08 | +.03 | +.06 | −.03 | +.02 | −.03 |
| 사람 만나기 | +.05 | −.04 | +.01 | −.06 | −.02 | +.25 | +.15 |
| 여가 | +.05 | −.02 | +.03 | −.08 | −.01 | · | +.20 |
| 씻기 | +.03 | +.02 | · | −.05 | +.90 | · | · |
| 휴식 | +.04 | +.05 | −.02 | −.06 | −.01 | · | +.03 |
| 볼일 | +.06 | −.05 | · | +.02 | −.02 | +.03 | +.02 |
| 온라인 | +.05 | −.02 | +.04 | −.03 | · | +.08 | +.12 |
시간당 변화량입니다. 여덟 시간 자면 에너지가 0.96 차고, 30분 식사면 허기가 0.4 풀리고, 20분 씻으면 충분히 개운해집니다. 하루 계획이 어디서 오든 수면 6.5시간, 세 끼 식사, 씻기, 숨 돌릴 시간은 결정론으로 보장됩니다.
건강만 규칙이 다릅니다
조건은 더해집니다. 한 가지만 나쁘면 아주 천천히 깎이고, 밤새 과제를 하고 밥도 거르면 건강이 눈에 띄게 나빠집니다.
아프기도 합니다
매 시간 발병 확률을 굴립니다. 기본은 아주 낮지만 조건이 겹치면 눈에 띄게 올라가요.
시간당 확률입니다. 여러 조건이 동시에 걸리면 더해집니다. 다 낫고 나면 사흘 동안은 다시 걸리지 않습니다.
걸리는 병 네 가지
2~4일. "목이 칼칼하고 콧물이 남"
1~2일. "온몸이 무겁고 만사 귀찮음"
1~2일. "머리가 지끈거림"
1~2일. "속이 더부룩하고 입맛 없음"
심각도는 0.35~0.65 사이에서 시작하고, 앓는 동안 에너지가 추가로 깎이고 졸림과 스트레스가 오릅니다. 에너지가 0.5 이상이면 회복이 두 배 빨라서, 아플 때 푹 자면 정말로 빨리 낫습니다. 이 메모는 대화 프롬프트의 컨디션 줄에 그대로 들어갑니다.
기분은 계산됩니다
위에서부터 내려오다 처음 걸리는 조건이 기분을 강제합니다. 아무것도 걸리지 않으면 서사와 대화가 정한 기분이 그대로 남아요.
- 병 심각도 ≥ 0.3골골함
- 허기 > 0.8배고픔
- 에너지 < 0.18방전
- 졸림 > 0.82졸림
- 스트레스 > 0.8예민함
- 사람 < 0.2 그리고 재미 < 0.3심심함
- 재미 < 0.2지루함
- 여덟 항목 모두 편안 · 재미 > 0.75 · 사람 > 0.65기분 좋음
- 그 밖의 모든 경우이전 기분 유지
컨디션이 극단으로 가지 않는 한 기분은 서사와 대화가 정하고, 극단으로 가면 몸이 이깁니다.
시간과 날씨
세계의 시간은 실제 시간과 같이 흐릅니다. 날씨는 외부 API 없이, 봇 아이디와 날짜를 시드로 삼아 결정론적으로 뽑습니다.
계절마다 다른 확률표
월별 평균 기온
같은 날짜에는 항상 같은 날씨가 나옵니다. 날씨는 하루 계획에서 밖 일정을 줄이고, 발병 확률에 반영되고, 궂은 날이면 환경 사건 확률을 두 배 이상 올립니다.
하루 계획
날짜가 바뀌면 오늘 하루를 8~14개의 시간 슬롯으로 채웁니다. 아래는 평일 하루의 예시입니다.
각 슬롯에는 시작과 끝 시각, 장소, 활동 종류, 서리 시점의 짧은 이름("카페에서 과제", "방에서 게임"), 왜 그걸 하는지 한 줄, 같이 있는 사람, 연결된 캘린더 항목, 그리고 말 걸기 좋은 정도가 붙습니다.
모델이 짠 계획을 그대로 쓰지는 않습니다
빈틈 메우기
새벽과 늦은 밤이면 잠으로, 낮이면 집에서 쉬는 것으로.
겹침 정리
겹치면 뒤 슬롯이 우선입니다.
없는 장소 교정
세계에 없는 장소를 적었으면 집으로 바꿉니다.
고정 블록 덮어쓰기
수업 시간에 카페에 가는 계획이 나와도 수업이 이깁니다.
모델이 실패하면 세계 생성 때 만든 하루 리듬을 펼친 뒤 같은 정규화를 거칩니다. 그래서 계획이 없는 날은 없습니다.
10분마다의 틱
세계는 기본 10분에 한 번 움직입니다. 마인크래프트를 하시는 분이라면 익숙한 그 틱이에요.
flowchart TB
T1["`**1** 내 차례인지 확인
잠금은 10분`"] --> T2{"**2** 날짜가 바뀌었나"}
T2 -->|예| N["`어제 일기 · 지난 일정 정리
오늘 날씨 · 이야기 진행 · 오늘 계획`"]
T2 -->|아니오| T3
N --> T3["`**3** 경과 시간을 슬롯 단위로 잘라
컨디션 · 질병 · 진척 · 지출 적용`"]
T3 --> T4["`**4** 슬롯이 바뀌었으면
지금 순간 다시 쓰기`"]
T4 --> T5["`**5** 게이트를 통과하면
종류를 골라 사건 생성`"]
T5 --> T6["**6** 다음 틱 시각 결정"]
공부 진척 공식
에너지가 1이면 과제 진척이 시간당 30, 0.3이면 20쯤 오릅니다. 밤샘이 손해인 이유예요.
지금 순간
계획 슬롯이 바뀌거나 순간이 오래되면 모델이 지금 이 순간을 씁니다.
방 책상에 엎드려서 이어폰으로 노래 틀어 놓고 수학 문제집을 넘기는 중. 아까 산 커피가 아직 반쯤 남아 있다.
계획 슬롯의 활동과 장소를 벗어나지 않으면서 무엇을 먹는지, 어떤 노래를 듣는지, 누구와 있는지 같은 작은 디테일을 넣게 합니다. 자는 동안에는 모델을 부르지 않습니다. 순간도 상태줄도 그냥 "자는 중"이에요. 모델이 실패하면 슬롯 이름으로 "집에서 아침 먹기." 정도의 폴백을 만듭니다.
사건
세계에 예측 불가능성을 넣는 장치입니다. 굴리기 전에 네 개의 관문이 있습니다.
자고 있으면 없음
최근 사건에서 45분이 안 지났으면 없음
하루 상한을 넘었으면 없음
통과하면 자발성과 틱 간격으로 확률 계산
하루 상한입니다. 자발성 40에 10분 틱이면 한 번에 약 2.8%, 깨어 있는 16시간 동안 평균 2~3건이 나오도록 맞춰져 있습니다.
어떤 종류의 사건이 일어날까
기본 가중치와 상황 보정입니다. 사람 사건이면 누가 연락할지도 고르는데, 친밀도가 높을수록 그리고 최근에 안 봤을수록 확률이 높습니다. 72시간 이상 못 본 사람은 가중치가 두 배가 됩니다.
사건이 세계에 남기는 것
사건은 현실적이고 소박해야 합니다. 연락이 옴, 비 맞음, 과제 막힘, 노래 발견, 엄마가 반찬 보냄, 친구가 삐침 정도예요. 사망, 사고, 범죄, 성적 내용, 실존 인물은 금지입니다. 모델이 실패하면 사건은 그냥 일어나지 않습니다. 가짜 사건을 지어내지 않아요.
이야기
사건이 점이라면 이야기는 선입니다. 각 이야기는 여섯 단계 중 하나에 있고 0~1의 긴장도를 가집니다.
- 씨앗막 시작됨
- 상승긴장 0.5 초과
- 절정긴장 0.85 초과
- 해소긴장 0.1 미만
- 해결자연스럽게 끝남
- 흐지부지조용히 식음
날짜가 바뀔 때마다 모델이 이야기 편집자 역할로 어제 일기와 최근 사건을 보고 각 이야기의 단계, 긴장도, 요약, 다음 비트를 갱신합니다. 하루에 두 단계 이상 건너뛰지 못하고, 사건이 없었던 이야기는 긴장을 살짝 올리거나 유지합니다. 활성 이야기가 3개 미만이면 서리의 생활에서 나올 법한 새 이야기를 1~2개 엽니다.
어떤 이야기가 계속 사건을 부르면 며칠 안에 절정에 이르고, 조용하면 천천히 식습니다.
하루의 일기
자정이 지나면 어제 하루의 일기를 씁니다. 실제로 기록된 사건과 행동만 씁니다.
오늘은 그냥 그랬다. 아침에 늦잠 자서 아침 거르고 뛰었고, 3교시에 졸다가 걸렸다. 점심에 지민이가 편의점 젤리 사 줘서 좀 살아났고. 저녁 먹고 수학 문제집 스무 장 넘겼는데 이틀 뒤 수행평가 생각하면 아직 멀었다.
사건이 거의 없었으면 "별일 없었다"류로 짧게 끝냅니다. 이 일기는 다음 날 계획, 이야기 진행, 그리고 "어제 뭐 했어?"라는 질문에 쓰입니다.
대화와의 연결
서리가 답을 만들 때마다 프롬프트에 세계의 지금 상태를 요약한 450토큰짜리 블록이 들어갑니다.
flowchart TB
W["세계의 지금 상태"] --> B["450토큰 상태 블록"]
B --> P["대화 프롬프트"]
P --> R["서리의 답"]
R --> X["`대화에서 정해진 것
기분 · 행동 · 생각 · 약속`"]
X --> W
W --> D["Discord 상태줄"]
상태 블록에 들어가는 것
가장 중요한 원칙은 "기본은 수동"입니다. 서리의 세계는 서리가 자기 얘기만 하게 만들려는 것이 아니에요. 물으면 답하고, 대화 흐름에 맞을 때만 짧게 먼저 꺼냅니다. "지금 바빠서 나중에 얘기하자" 같은 말을 세계 상태를 근거로 하는 것은 명시적으로 막아 두었습니다.
대화하다가 "이제 밥 먹으러 갈게"라고 하면 실제로 허기가 조금 풀립니다. 다만 대화가 세계를 움직일 수 있는 폭은 실제로 흐른 시간만큼으로 잡혀 있어서, 몇 초 간격으로 수십 번 말을 걸어도 컨디션은 그 몇 분치만 바뀝니다. 지금 계획대로 하고 있던 활동(야자 중에 "공부 중")은 틱이 이미 반영하고 있으니 다시 더하지 않고, 같은 고민이 여러 사람과의 대화에서 반복되면 하나로 합칩니다. 새로 생긴 생각은 48시간, 약속은 7일 동안 서리의 머릿속에 남아 다음 대화의 "신경 쓰이는 것"에 올라옵니다.
Discord 상태줄
세계가 켜져 있으면 Discord 프로필의 상태줄도 세계가 공급합니다. 순간의 상태줄 한 줄이 그대로 올라가고, 자거나 수업 중처럼 말 걸기 좋은 정도가 낮으면 자리비움으로 표시할 수도 있습니다. 장소나 기분은 넣지 않고 실제 활동만 담습니다.
하나의 세계, 둘의 약속
서리는 서버마다 따로 살지 않습니다. 하나의 세계에서 하나의 하루를 삽니다. 그런데 대화에서 생긴 것은 다릅니다.
"오늘 밤에 같이 마크 하기로 함"
원문 그대로 프롬프트에 올라갑니다.
"누군가와 하기로 한 일이 있음"
일정이 있다는 사실은 지키되 내용은 밝히지 않습니다.
세계 스스로 하루를 채우는 순간 묘사, 사건, 이야기, 일기를 쓸 때도 모델은 뭉개진 버전만 봅니다. 그래서 어떤 분과의 대화 내용이 다음 날 일기를 거쳐 다른 서버로 새어 나가는 일은 없습니다. 생각도 마찬가지로, 대화에서 생긴 생각은 그 사람과의 대화에서만 올라옵니다.
이 구분은 이용자 사이의 이야기입니다. 서리를 운영하는 저희는 운영 화면에서 세계에 남은 기록을 확인할 수 있습니다. 다른 이용자에게 보이지 않는다는 뜻이지, 기록 자체가 없다는 뜻은 아닙니다.
비용과 운영
세계는 모델을 아껴 씁니다. 하루 전체가 15~25회, 각 출력은 600토큰 이하입니다.
모든 출력은 정해진 형식으로 검증하고, 형식이 어긋나면 한 번 복구를 시도한 뒤 안 되면 결정론 폴백으로 넘어갑니다. 세계에 쓰는 모델은 대화 모델과 별개로 고를 수 있고, 응답 예산은 엄격하게부터 여유롭게까지 네 단계로 0.75배에서 2.5배까지 조절됩니다.
운영 화면 여섯 탭
오늘 계획, 현재 순간, 컨디션, 오늘 사건.
장소, 사람과 친밀도와 기억, 캘린더, 소지품, 잔고.
진행 중인 이야기의 단계와 긴장도와 비트, 그리고 일기.
지금 신경 쓰이는 생각들. 직접 넣거나 지울 수 있습니다.
세계 켜고 끄기, 모델과 파라미터, 프리미스 재생성, 자발성과 틱 간격, 사건 주입과 시간 앞당기기.
모든 변경을 커밋처럼 기록. 전과 후를 빨간 줄과 초록 줄로 비교합니다. 봇마다 최근 1000건.
아직 못 한 것
솔직하게 남겨 둡니다.
- 서리가 먼저 연락하는 기능. 사건 생성기는 "이 일을 친한 사람에게 말하고 싶어 할지"를 이미 판단해서 남기고 있지만, 실제로 DM으로 보내는 부분은 별도 작업으로 남아 있습니다.
- 장소나 사람이나 일정을 하나씩 골라 편집하는 화면. 지금은 프리미스를 고쳐 세계를 다시 만들거나 관제로 개입하는 방식뿐입니다.
정리하면 이렇습니다. 서리의 세계는 헌법에서 생성된 하나의 세계 안에서, 10분마다 결정론 코드가 컨디션과 일정과 진척을 움직이고, 모델은 계획과 순간과 사건과 이야기와 일기라는 언어를 하루 15~25번 쓰고, 그 결과가 450토큰짜리 블록으로 모든 대화에 들어가고, 대화에서 생긴 것은 세계로 돌아오되 당사자에게만 원문으로 남는 구조입니다.
이제 서리에게 "지금 뭐 해?"라고 물으면, 그 답은 계획표의 그 시각에 서리가 있는 장소, 오늘의 날씨, 몇 시간째 못 먹은 밥, 이틀 뒤 마감인 과제, 오전에 온 친구의 연락 위에서 나옵니다. 5분 뒤에 다른 분이 같은 질문을 해도 같은 답이 돌아오고요. 저희는 그게 캐릭터가 살아 있다는 것의 최소 조건이라고 생각했습니다.