"매 algorithmic story authoring — symbolic planners 부터 LLM-driven emergent narrative 까지". 1970s TaleSpin / 1990s drama managers (Façade) 의 lineage; 2019 AI Dungeon 으로 LLM era 시작, 2024-2026 currently agent-based simulation (Smallville, Voyager, Genesis) 에서 narrative emerges from LLM agents interacting in worlds. Hybrid 가 winning: LLM creativity + symbolic constraints.
매 핵심
매 paradigm timeline
Story grammars (1970s-80s): Propp's morphology, Rumelhart, TaleSpin (Meehan 1977).
Memory / retrieval: vector DB of past events for consistency.
Drama manager: monitors arc (rising/falling tension), nudges plot.
💻 패턴
LLM beat generator with state
defgenerate_beat(state,history,beat_target):prompt=f"""You are a narrator. Current state:
Characters: {state.characters}Location: {state.location}Inventory: {state.inventory}Recent events: {history[-5:]}Beat target: {beat_target} # e.g., "rising tension", "reveal villain"
Generate the next narrative beat (2-3 sentences) and any state changes as JSON."""resp=claude.messages.create(model="claude-opus-4-7",max_tokens=400,messages=[{"role":"user","content":prompt}],)returnparse(resp.content[0].text)
Story-arc drama manager (Freytag)
ARC=["exposition","rising_action","climax","falling_action","resolution"]classDramaManager:def__init__(self,n_beats=20):# Map beat index to arc stageself.targets=([ARC[0]]*3+[ARC[1]]*8+[ARC[2]]*2+[ARC[3]]*4+[ARC[4]]*3)defnext_target(self,beat_idx,tension_so_far):target=self.targets[beat_idx]iftarget=="rising_action"andtension_so_far<0.3:return"rising_action_inject_conflict"returntarget
Goal-based character agent
classCharacterAgent:def__init__(self,name,traits,goals):self.name,self.traits,self.goals=name,traits,goalsself.memory=[]# recent observationsdefchoose_action(self,world_state):# LLM call: given personality + memory + state, pick actionprompt=f"""You are {self.name}. Traits: {self.traits}.
Active goals: {self.goals}.
Recent: {self.memory[-10:]}.
World: {world_state}.
What do you do next? Output: action(target, args)."""returnllm(prompt)
Causal consistency check
defverify_beat(beat,state):"""Reject beats that violate world rules."""issues=[]forchangeinbeat.state_changes:ifchange.kind=="use_item"andchange.itemnotinstate.inventory:issues.append(f"{change.item} not in inventory")ifchange.kind=="location"andchange.tonotinstate.adjacent_locs:issues.append(f"non-adjacent move {state.location}->{change.to}")returnissues# caller re-prompts on issues
schema={"type":"object","properties":{"narration":{"type":"string"},"state_changes":{"type":"array","items":{...}},"tension_delta":{"type":"number","minimum":-1,"maximum":1},},"required":["narration","state_changes"]}# Use response_format=json_schema with Claude / GPT-5
매 결정 기준
상황
Approach
Short interactive story
Pure LLM w/ state in prompt
Long campaign (RPG)
LLM + structured world DB + retrieval
Strong authorial intent
Planner + LLM surface text
Emergent simulation
Agent-based (Smallville pattern)
Branching narrative game
Drama manager + tree-of-beats
기본값: LLM beat-generator + structured world state + drama manager + retrieval memory.
언제: games (RPG, IF), creative writing tools, simulation, training data for narrative tasks.
언제 X: factual reporting, deterministic content (ads/legal), regulated medical/legal narration.
❌ 안티패턴
Pure LLM, no state: forgets at chapter 3, introduces dead characters.
Planner-only, no LLM: prose feels mechanical.
No drama curve: flat tension → boring.
Unbounded creativity: LLM invents items/locations with no consistency check.
Single-shot 100k-token story: better as iterative beats with state.
🧪 검증 / 중복
Verified (Park et al 2023 Generative Agents UIST, Mateas & Stern 2005, Riedl & Bulitko 2013 survey).
신뢰도 A (theory) / B (rapidly evolving practice).
🕓 Changelog
날짜
변경
2026-05-08
Phase 1
2026-05-10
Manual cleanup — full PNG history + 2026 hybrid LLM/agent stack