캐릭터 일관성을 지키는 4+1 레이어: 프롬프트 초기화 아키텍처 실전
캐릭터형 에이전트 품질은 모델 선택보다 프롬프트 조립 구조에 더 크게 좌우된다. 특히 음성/대화 시스템에서는 “고정 정체성"과 “실시간 맥락"을 분리하지 않으면, 같은 캐릭터가 호출 시점마다 다른 인격처럼 응답하는 문제가 반복된다. 이 글은 4+1 레이어 구조를 기준으로 초기화 경로를 설계하고, 상태 정합성을 유지하는 방법을 기술적으로 정리한다.
기존 방식의 실패 원인
단일 프롬프트 텍스트에 캐릭터 설명, 사용자 정보, 통화 맥락, 미션 지시를 모두 합치면 다음 문제가 생긴다.
- 프롬프트 길이 증가에 비해 제약 우선순위가 불명확
- 통화 유형 전환(일반/미션) 시 규칙 충돌
- 이전 대화 결과가 다음 호출에서 부분적으로만 반영
- 디버깅 시 “어느 계층이 망가졌는지” 식별 불가
핵심 결함은 내용 부족이 아니라 구조 부재다.
4+1 레이어 모델
Layer 1: Core Character Prompt (불변 계층)
- 성격, 금지 규칙, 말투, 세계관
- 변경 주기: 낮음
- 실패 영향: 전 호출 공통 품질 저하
Layer 2: Situation Context (세션 계층)
- 현재 위치, 감정, 관계 신뢰도, 최근 사건
- 변경 주기: 호출 단위
- 실패 영향: 맥락 불일치, 어색한 응답 시작
Layer 3: Mission Behavior Prompt (행동 규칙 계층)
- 미션 모드에서만 활성화되는 행동 제약
- 변경 주기: 미션 정책 변경 시
- 실패 영향: 미션 톤 붕괴, 지시 해석 불안정
Layer 4: Mission JSON (데이터 계층)
- 목표, 위험도, 환경, 성공/실패 반응
- 변경 주기: 콘텐츠 업데이트 시
- 실패 영향: 특정 미션 응답만 국소 실패
Layer 5: Memory/State JSON (연속성 계층)
- 이전 대화 결과, 관계 변화, 누적 상태
- 변경 주기: 호출 후 갱신
- 실패 영향: 장기 일관성 붕괴
핵심은 “규칙"과 “데이터"를 분리해 변경 범위를 국소화하는 데 있다.
초기화 파이프라인
프롬프트 조립 전 단계에서 사용자와 세션을 먼저 고정한다.
identity -> user profile -> history fetch -> state compose -> layer assemble -> inference
1) Identity Resolution
- 사용자 유형 분류: 체험판/신규/가입
- 채널별 식별자를 내부 사용자 ID로 정규화
2) State Hydration
- 최근 통화 이력, 관계 상태, 설정값 로드
- 누락 필드는 기본 정책값으로 채움
- 불완전 상태는
assumed_state로 명시
3) Mode Selection
- 일반 통화: L1 + L2 + L5
- 미션 통화: L1 + L2 + L3 + L4 (+L5 선택)
4) Prompt Assembly
- 계층별 템플릿을 deterministic 순서로 결합
- 조립 결과에
prompt_version,policy_version,state_version태그 부여
데이터 계약(Schema Contract)
레이어가 늘어나면 데이터 계약이 사실상 시스템 경계가 된다.
필수 계약 항목:
character_idlocaleconversation_modetrust_levellast_mission_resultstate_version
계약 검증 실패 시 조치:
- 치명 필드 누락: 호출 중단 + fallback 응답
- 비치명 누락: 기본값 주입 + 경고 로그
- 스키마 불일치: 해당 계층 제외 후 degraded mode 실행
일관성 유지 전략
1) 버전 고정
- Core/Policy/State 버전을 분리 저장
- 회귀 분석 시 동일 버전 조합 재현 가능
2) 쓰기 경합 제어
- Layer 5 갱신은 원자적 업데이트
- 중복 호출은
conversation_id + turn_id로 dedupe
3) 캐시 계층
- L1/L3는 장기 캐시
- L2/L5는 짧은 TTL 캐시
- 캐시 미스 시 동기 재구성, 실패 시 최소 안전 프롬프트 적용
관측 지표
구조 설계의 효과는 응답 품질이 아니라 변동성 감소로 확인한다.
in_character_ratecontext_mismatch_ratefallback_activation_ratestate_hydration_fail_rateprompt_assembly_latency_p95mission_mode_error_rate
in_character_rate 단독보다 context_mismatch_rate와 함께 봐야 원인을 분리할 수 있다.
트레이드오프
- 장점: 변경 영향 범위 예측 가능, 장애 국소화, 재현 가능한 디버깅
- 단점: 스키마/버전/캐시 운영 비용 증가
- 감수한 복잡도: 계층 관리
- 회피한 복잡도: 단일 프롬프트의 비결정성 디버깅
다음 단계
- Layer 5 최소 필드 집합과 만료 정책 고정
- 모드 전환(일반→미션, 미션→일반) 회귀 테스트 자동화
- 실패 유형별 fallback 문구를 정책화해 사용자 체감 불안정 최소화
참고 및 인용
참고: OpenAI 프롬프트 엔지니어링 가이드는 지시/구조/검증 분리 방식의 기본 원칙을 제시한다. Prompt engineering
참고: JSON Schema는 계층별 입력 계약을 기계적으로 검증할 때 널리 쓰이는 표준이다. What is JSON Schema?
참고: Structured Outputs 가이드는 스키마 기반 출력 강제를 통해 계층별 데이터 계약 검증을 구현하는 실무 패턴을 제공한다. Structured outputs