Project
Vibe Choice — 생성형 AI 인터랙티브 스토리
사용자가 장르·문체·배경·주인공을 정하면 LLM이 그 자리에서 이야기를 이어 쓰고, 선택지를 따라 전개가 갈라지는 인터랙티브 스토리 게임입니다. 응답 속도와 생성되는 이야기의 품질을 함께 다루는 것을 목표로 만들었습니다.
Details
Tags

선택형 이야기는 미리 써둔 분기를 따라가는 방식이 일반적입니다. Vibe Choice는 그 분기를 매번 LLM이 생성하게 한 실험입니다. 사용자가 이야기의 분위기를 정하면 그에 맞는 도입부가 만들어지고, 선택지를 고를 때마다 다음 장면이 새로 쓰입니다.
무엇을 하나
이야기를 시작하기 전에 장르, 문체(작가 스타일), 배경, 주인공을 직접 고를 수 있습니다. 모든 항목에는 "맡길게요"가 있어, 전부 맡기면 LLM이 알아서 정합니다. 설정이 끝나면 그에 맞춘 도입부 후보 가운데 하나를 고르고, 이후로는 매 장면마다 제시되는 선택지를 따라 이야기를 이어갑니다.

응답 속도
생성형 이야기에서 가장 거슬리는 부분은 선택 후의 대기 시간입니다. 이 지점을 줄이기 위해 두 가지를 적용했습니다.
- 스트리밍 — 턴 생성을 SSE로 흘려보내, 전체 응답이 끝나기를 기다리지 않고 장면이 써지는 대로 보여줍니다.
- 분기 프리페치 — 화면에 선택지를 보여주는 동안 다음 분기를 미리 생성해 캐시에 담아 둡니다. 사용자가 고른 선택지가 캐시에 있으면 대기 없이 바로 이어집니다. 캐시는 로컬에서는 인메모리, 프로덕션에서는 Upstash Redis를 쓰는 하이브리드 구조입니다.
이야기의 품질
빠르게 만드는 것과 별개로, 생성되는 이야기 자체가 읽을 만한지는 다른 문제였습니다. 한 편을 끝까지 플레이해 소설처럼 채점해 보니 "캐릭터 깊이와 완결성"이 약점으로 나왔고, 그 원인을 코드에서 찾을 수 있었습니다. 누적 요약·복선·장면 정보가 매 턴 상태에 반영되지 않아, LLM이 직전까지의 맥락을 충분히 받지 못한 채 다음 장면을 쓰고 있었습니다.
그래서 턴마다 이야기 상태(요약·복선·장면·플래그)를 갱신해 다음 프롬프트에 전달하도록 고쳤고, 품질을 사람이 매번 눈으로만 확인하지 않도록 오프라인 평가 루브릭과 자동 최적화 루프를 설계했습니다.

정리
회사 일과는 별개로, 생성형 모델로 인터랙티브 콘텐츠를 만들 때 부딪히는 문제들을 직접 겪어 보려고 시작한 개인 작업입니다. 빠른 응답과 읽을 만한 전개라는 두 축을 동시에 맞추는 일이 생각보다 까다로웠고, 그 과정에서 스트리밍·캐시·상태 관리·품질 평가를 한 번씩 손에 익힐 수 있었습니다.