이 문서는 STMB가 어떻게 작동하는지에 대한 높은 수준의 설명입니다. 코드를 설명하려는 문서가 아닙니다. 대신 STMB가 어떤 정보를 조합하는지, 어떤 순서로 보내는지, 그리고 모델이 무엇을 반환해야 하는지를 설명합니다.
이 문서는 STMB용 프롬프트를 작성하거나 수정할 때 참고하는 용도입니다.
STMB에는 세 가지 주요 워크플로가 있습니다.
- 메모리 생성
- 트래커 & 사이드 프롬프트
- 통합
서로 관련은 있지만, 기대하는 출력 형태는 서로 다릅니다.
- 메모리 생성은 엄격한 JSON을 기대합니다.
- 트래커 & 사이드 프롬프트는 보통 정리된 일반 텍스트를 기대합니다(Markdown이나 다른 로어북 항목 형식은 사용할 수 있지만, 사이드 프롬프트에는 JSON을 사용하지 마세요).
- 통합도 엄격한 JSON을 기대하지만, 메모리와는 다른 스키마를 사용합니다.
메모리를 만들 때 STMB는 보통 다음 요소들을 이 순서대로 조합한 하나의 프롬프트를 보냅니다.
-
선택된 메모리 프롬프트 또는 사전 설정 텍스트
- 이는 요약 프롬프트 관리자의 지시 블록입니다.
- 어떤 종류의 요약을 써야 하는지, 어떤 JSON 형태로 반환해야 하는지를 모델에 알려줍니다.
{{user}},{{char}}같은 매크로는 전송 전에 해석됩니다.
-
선택적인 이전 메모리 문맥
- 실행 시 이전 메모리를 포함하도록 설정되어 있으면, 그것들이 읽기 전용 문맥으로 삽입됩니다.
- 이것들은 문맥이라고 분명히 표시되며, 다시 요약해야 할 대상이 아닙니다.
-
현재 장면 대화 기록
- 선택된 채팅 범위는
Speaker: message형식으로 줄마다 정리됩니다. - 이것이 모델이 실제로 메모리로 바꿔야 하는 장면입니다.
- 선택된 채팅 범위는
대략적인 형태는 이렇습니다.
[memory prompt / preset instructions]
=== PREVIOUS SCENE CONTEXT (DO NOT PROCESS) ===
[zero or more earlier memories]
=== END PREVIOUS SCENE CONTEXT - PROCESS ONLY THE SCENE BELOW ===
=== SCENE TRANSCRIPT ===
Alice: ...
Bob: ...
=== END SCENE ===
우리가 기대하는 것은 하나의 JSON 객체입니다.
{
"title": "Short scene title",
"content": "The actual memory text",
"keywords": ["keyword1", "keyword2", "keyword3"]
}모범 사례:
- JSON 객체만 반환하세요.
- 키는 정확히
title,content,keywords를 사용하세요. keywords는 문자열로 이루어진 실제 JSON 배열이어야 합니다.- 제목은 짧고 읽기 쉽게 유지하세요.
- 키워드는 장소, 사물, 고유명사, 특징적인 행동, 식별자처럼 구체적이고 검색에 유리하게 만드세요.
STMB가 약간 지저분한 출력은 가끔 복구해 줄 수는 있지만, 프롬프트가 그것에 의존해서는 안 됩니다.
좋은 메모리 프롬프트는 네 가지를 분명하게 해 줍니다.
-
어떤 종류의 메모리를 써야 하는지 말해 준다
- 상세한 장면 로그
- 압축된 시놉시스
- 최소한의 요약
- 문학적인 서술형 메모리
-
무엇이 중요한지 말해 준다
- 스토리 비트
- 결정
- 캐릭터 변화
- 드러난 사실
- 결과
- 연속성에 중요한 세부 사항
-
무엇을 무시해야 하는지 말해 준다
- 보통 OOC
- 군더더기
- 더 타이트한 메모리를 원한다면 분위기만 있는 잡담
-
정확히 어떤 JSON을 반환해야 하는지 말해 준다
약한 프롬프트는 보통 다음 중 하나의 방식으로 실패합니다.
- 글쓰기 스타일은 설명하지만 JSON 형태는 설명하지 않는다.
- 최종 메모리 객체 대신 "도움이 되는 분석"이나 "생각"을 요구한다.
- 구체적인 검색 키워드 대신 추상적인 키워드를 권장한다.
- 이전 문맥과 현재 장면을 구분하지 않는다.
- 한 번에 너무 많은 출력 형식을 요구한다.
- 요약이 철저해야 하는지, 토큰 효율이 우선인지 분명하게 쓰세요.
content안에 markdown을 원한다면 그 점을 명확히 말하세요.- 짧은 메모리를 원한다면 JSON 스키마가 아니라 본문 길이를 제한하세요.
- 검색 성능을 강하게 원한다면, 요약 스타일보다 키워드 품질에 프롬프트 공간을 쓰세요.
- 이전 메모리는 다시 써야 할 원문이 아니라 연속성 문맥으로 취급하세요.
사이드 프롬프트는 메모리가 아닙니다. 이것들은 보통 별도의 로어북 항목을 작성하거나 덮어쓰는 추적기/업데이트 프롬프트입니다. 이는 메모리와는 완전히 다른 개념이며, 이 점을 분명히 기억하는 것이 매우 중요합니다.
사이드 프롬프트가 실행될 때 STMB는 보통 다음 요소들을 이 순서대로 조합합니다.
-
사이드 프롬프트의 메인 지시 텍스트
- 이것이 그 트래커의 실제 작업 프롬프트입니다.
{{user}},{{char}}같은 ST 표준 매크로가 해석됩니다.- 수동 실행 시 사용자 정의 런타임 매크로도 삽입될 수 있습니다.
-
선택적인 기존 항목
- 그 사이드 프롬프트에 이미 저장된 내용이 있다면, STMB는 현재 버전을 먼저 포함할 수 있습니다.
- 이렇게 하면 모델이 매번 처음부터 새로 쓰는 대신 기존 트래커를 갱신할 수 있습니다.
-
선택적인 이전 메모리 문맥
- 템플릿이 이전 메모리를 요구하면, STMB는 그것들을 읽기 전용 문맥으로 삽입합니다.
-
컴파일된 장면 텍스트
- 이것이 트래커가 반응해야 하는 현재 장면 자료입니다.
-
선택적인 응답 형식 안내
- 이것은 파서 스키마처럼 강제되는 것이 아닙니다.
- 단지 어떤 출력 형식을 원하는지에 대한 추가 지시일 뿐입니다.
대략적인 형태는 이렇습니다.
[side prompt instructions]
=== PRIOR ENTRY ===
[existing tracker text, if any]
=== PREVIOUS SCENE CONTEXT (DO NOT PROCESS) ===
[optional previous memories]
=== END PREVIOUS SCENE CONTEXT ===
=== SCENE TEXT ===
[compiled scene text]
=== RESPONSE FORMAT ===
[optional format guidance]
STMB는 저장 가능한 일반 텍스트를 기대합니다.
여기서 메모리와의 핵심 차이가 드러납니다.
- 사이드 프롬프트는 JSON을 원하지 않습니다.
- STMB는 보통 반환된 텍스트를 그대로 저장합니다.
- 사이드 프롬프트에서 JSON을 요구하더라도, 그것은 당신의 워크플로가 따로 그 형식에 의존하지 않는 한 그냥 텍스트일 뿐입니다.
즉, 사이드 프롬프트는 파서 친화적인 메모리 JSON이 아니라 실제로 바로 쓸 수 있는 최종 출력물을 목표로 해야 합니다.
좋은 사이드 프롬프트는 범위가 좁고, 안정적이며, 갱신하기 쉽습니다.
예시:
- 등장인물 목록을 중요도 순으로 유지한다.
- 현재 관계 상태를 추적한다.
- 미해결 플롯 스레드를 추적한다.
{{char}}가 현재{{user}}에 대해 무엇을 믿고 있는지 추적한다.
가장 좋은 사이드 프롬프트 문구는 보통 다음을 해 줍니다.
-
작업을 분명히 정의한다
- "등장인물 트래커를 유지하라"
- "현재 관계 시트를 갱신하라"
- "미해결 스레드 보고서를 유지하라"
-
갱신인지, 교체인지, 추가인지 말해 준다
- 기존 항목 텍스트가 포함될 수 있으므로 이 점이 중요합니다.
-
출력 레이아웃을 정의한다
- 제목
- 글머리표 구조
- 섹션
- 정렬 규칙
-
무엇을 포함하지 말아야 하는지 말해 준다
- 추측
- 중복 항목
- 오래된 정보
- 작업 자체에 대한 서술
- 범위가 너무 넓다: "모든 것을 추적하라."
- 기존 항목을 수정해야 하는지, 다시 써야 하는지를 전혀 말하지 않는다.
- 최종 트래커 텍스트 대신 사고 과정이나 설명을 요구한다.
- 형식을 모호하게 남겨 두어서 시간이 지나며 트래커가 흔들린다.
- 사이드 프롬프트는 요약 프롬프트가 아니라 유지보수 지침처럼 작성하세요.
- 모델이 현재 트래커를 먼저 보고, 그다음 새 장면을 볼 수 있다고 가정하세요.
- 각 트래커는 하나의 작업에만 집중하게 두세요.
응답 형식필드를 사용해 레이아웃, 섹션 이름, 정렬 방식을 통제하세요.
통합은 하위 단계 항목들을 더 상위 단계의 요약으로 결합합니다.
예시:
- 메모리를 아크 요약으로
- 아크 요약을 챕터 요약으로
- 챕터 요약을 북 요약으로
통합이 실행될 때 STMB는 보통 다음 요소들을 이 순서대로 조합합니다.
-
선택된 통합 프롬프트 또는 사전 설정 텍스트
- 이것은 모델이 원본 항목들을 어떻게 압축해야 하는지를 설명합니다.
- 또한 모델이 반환해야 할 JSON 스키마도 정의합니다.
-
선택적인 이전 상위 단계 요약
- 해당 단계의 이전 요약을 이어받는 경우, 그것이 먼저 정사 문맥으로 포함됩니다.
- 프롬프트는 모델에게 그것을 다시 쓰지 말라고 지시합니다.
-
시간순으로 정렬된 선택된 하위 단계 항목들
- 각 원본 항목은 식별자, 제목, 내용과 함께 포함됩니다.
- 이것이 모델이 묶고, 압축하고, 상위 단계 요약으로 바꿔야 하는 자료입니다.
대략적인 형태는 이렇습니다.
[consolidation prompt / preset instructions]
=== PREVIOUS ARC/CHAPTER/BOOK (CANON - DO NOT REWRITE) ===
[optional previous higher-tier summary]
=== END PREVIOUS ... ===
=== MEMORIES / ARCS / CHAPTERS ===
=== memory 001 ===
Title: ...
Contents: ...
=== end memory 001 ===
=== memory 002 ===
Title: ...
Contents: ...
=== end memory 002 ===
...
=== END ... ===
STMB는 다음과 같은 형태의 JSON 객체를 기대합니다.
{
"summaries": [
{
"title": "Short higher-tier title",
"summary": "The consolidated recap text",
"keywords": ["keyword1", "keyword2"],
"member_ids": ["001", "002"]
}
],
"unassigned_items": [
{
"id": "003",
"reason": "Why this item was left out"
}
]
}중요한 개념:
- 통합은 하나의 요약을 반환할 수도 있고, 여러 개를 반환할 수도 있습니다.
member_ids는 반환된 각 요약에 어떤 원본 항목들이 속하는지 STMB에 알려줍니다.unassigned_items는 모델이 "이 항목은 방금 만든 요약에 맞지 않는다"라고 말하는 방식입니다.
좋은 통합 프롬프트는 세 가지를 잘 해냅니다.
-
압축 목표를 정의한다
- 하나의 아크
- 하나 이상의 아크
- 간결하지만 완전한 요약
- 강하게 압축된 요약
-
선택 로직을 정의한다
- 시간 순서 유지
- 연속성 유지
- 관련된 항목끼리 병합
- 관련 없는 항목은 미배정으로 남김
-
JSON 구조를 매우 분명하게 정의한다
가장 좋은 통합 프롬프트는 무엇을 보존해야 하는지도 말해 줍니다.
- 주요 비트
- 전환점
- 약속
- 결과
- 미해결 스레드
- 관계 변화
- 연속성에 결정적으로 중요한 인용문이나 식별자
- 요약을 요청하지만, 원본 항목을 어떻게 묶을지 전혀 설명하지 않는다.
- 튀는 항목을 어떻게 처리해야 하는지 말하지 않는다.
member_ids를 요구하지 않는다.- 통합 JSON 객체 대신 자유 형식 산문을 요구한다.
- 스타일에만 지나치게 집중하고, 선택과 그룹화 규칙은 충분히 지정하지 않는다.
- 하나의 일관된 요약을 원하는지, 아니면 가능한 가장 적은 수의 일관된 요약들을 원하는지 모델에 말하세요.
- 시간 순서를 요구하세요.
- 남는 항목을 명시적으로 처리하게 하세요.
- 여기서도 키워드는 구체적으로 유지하세요. 상위 단계 요약도 여전히 검색 가치가 필요합니다.
STMB용 글을 쓸 때는 단지 "AI가 무엇을 말하게 하고 싶은가?"라고 생각하지 마세요.
이렇게 생각하세요.
- STMB가 장면 앞에 어떤 문맥을 놓는가?
- 실제로 분석되는 자료의 단위는 무엇인가?
- 이 경로는 엄격한 JSON을 기대하는가, 아니면 최종 일반 텍스트를 기대하는가?
- 나중에 검색을 위해 어떤 정보가 살아남아야 하는가?
- 모델이 무엇을 무시하고, 압축하고, 보존하고, 이어받아야 하는가?
프롬프트가 이 다섯 가지 질문에 분명하게 답한다면, 보통 STMB와 잘 맞습니다.
-
"실제로 AI에 무엇이 보내졌는지 볼 수 있나요?" 네. 조합된 프롬프트를 확인하고 싶다면 터미널/로그 출력을 보세요.
-
"내 프롬프트가 약해도 STMB가 좋은 출력을 강제로 만들어 주나요?" 그 정도는 아닙니다. STMB가 가끔 잘못된 JSON을 복구할 수는 있지만, 애초에 잘못된 것을 요구한 모호한 프롬프트까지 고쳐 주지는 못합니다.
-
"프롬프트를 다시 쓸 때 무엇부터 최적화해야 하나요?" 먼저 반환 형식을 최적화하세요. 그다음 어떤 세부 사항을 보존할지 최적화하세요. 스타일은 그다음입니다.