PetAI WBS 3.0 로컬 AI·장기 기억

목표: 관계와 게임 규칙은 결정론적으로 유지하면서, 로컬 SLM이 승인된 상태를 자연스러운 한국어 표현으로 바꾼다.
주 책임: Local AI
협업: Content, Unity, Privacy, QA
핵심 원칙: template-first, local-first, AI는 상태를 결정하지 않음

1. AI가 하는 일과 하지 않는 일

구분 포함 제외
표현 승인된 intent와 상태를 자연스러운 문장으로 변환 관계·재화·해금 결정
변주 같은 의미의 반복 표현 완화 설정에 없는 사실 추가
추출 사용자 선택에서 취향 후보 생성 사용자 성격을 단정
요약 하루·사건을 구조화된 episode summary로 압축 대화 원문을 cloud로 전송
검색 현재 장면에 필요한 local memory 선택 전체 기록 무차별 prompt 삽입
안전 출력 schema·금지 패턴·사실 ID 검증 validator 없는 직접 표시

2. 작업분해구조

WBS 작업 우선 선행 산출물 수용 기준
3.1.1 Intent catalog P0 제품·콘텐츠 intent, allowed state/action unknown intent 차단
3.1.2 Template fallback P0 intent catalog intent별 3문장 모델 없이 Day 0 완주
3.1.3 한국어 style guide P0 캐릭터 바이블 어미·주어·금지 표현 30문장 블라인드 검수
3.2.1 Input DTO P1 domain contract state/facts/memory/style budget forbidden field 0건
3.2.2 Output DTO P1 Unity adapter line/emotion/gesture/used IDs invalid JSON fallback
3.2.3 Validator P1 DTO·catalog schema/fact/action/safety 검사 malformed fixture 100% 차단
3.2.4 Timeout·fallback P1 local inference cancel, retry policy 1.5초 내 template
3.3.1 Model benchmark P1 target device latency/RAM/한국어 표 기기별 P50/P95
3.3.2 Prompt assembly P1 memory retrieval deterministic prompt sections 전체 대화 삽입 없음
3.4.1 Memory schema P1 privacy policy fact/preference/episode/recent phrase stable ID·source
3.4.2 Memory write P1 result/event verified fact만 저장 AI invented fact 0건
3.4.3 Retrieval P1 memory store relevance/recency/confirmation source IDs 반환
3.4.4 수정·삭제 P1 settings UX edit/delete/exclude 삭제 기억 재사용 0건
3.4.5 Conflict policy P1 schema confirmed fact 우선 동점 deterministic
3.5.1 Observability P2 consent local error code/latency 원문·prompt 로그 off

3. 입력 계약

{
  "intent": "approved_catalog_id",
  "characterState": {
    "mood": "enum",
    "relationshipStage": "enum",
    "currentActivity": "catalog-id"
  },
  "sceneFacts": [
    {"id": "fact-id", "value": "structured-value", "source": "domain"}
  ],
  "memorySummaries": [
    {"id": "memory-id", "kind": "confirmed_preference", "summary": "..."}
  ],
  "allowedEmotions": ["enum"],
  "allowedGestures": ["catalog-id"],
  "styleBudget": {"maxChars": 45, "sentenceCount": 1}
}

입력 금지

  • 전체 대화 원문
  • 정확한 GPS·주소·연락처
  • HealthKit·웨어러블 원시 데이터
  • 파일 시스템 절대 경로
  • API token·account identifier
  • validator가 모르는 임의 action·emotion
  • 삭제 또는 사용 제외된 memory

4. 출력 계약

{
  "line": "표시할 한국어 한 문장",
  "emotion": "allowed-enum",
  "gesture": "allowed-catalog-id",
  "usedFactIds": ["fact-id"],
  "usedMemoryIds": ["memory-id"]
}

출력은 suggestion이다. Unity가 schema, 길이, enum, 사용 fact, 금지 표현을 검증한 뒤에만 표시한다. 검증 실패는 같은 prompt 무한 재시도가 아니라 승인 template로 종료한다.

5. 기억 수명과 권위

종류 생성 권위 기본 수명 사용 조건 삭제 효과
게임 사실 Domain 관련 추억 유지 기간 현재 scene 관련 검색·요약에서 제외
확인된 취향 사용자 선택+확인 사용자 수정까지 관계 단계 허용 즉시 미사용
취향 후보 deterministic extractor/SLM 30일 또는 확인 전 사용자에게 단정 금지 즉시 삭제
episode summary Event/Memory use case 추억 유지 기간 source memory 존재 source와 함께 제외
최근 표현 Presentation 최근 20발화 반복 방지 자연 만료

로컬 memory는 대화 원문 보관함이 아니라 검증된 사실과 episode의 인덱스다. 원문이 필요 없는 기능은 원문을 저장하지 않는다.

6. 자연스러운 한국어 Gate

  • ~하고 싶어 해요처럼 관찰자 설명과 직접 화법을 섞지 않는다.
  • 같은 문장 안에서 반말·존댓말을 임의 전환하지 않는다.
  • 생략 가능한 주어를 매 문장 반복하지 않는다.
  • 감정을 기뻐요, 슬퍼요로 설명하기보다 현재 행동과 선택으로 드러낸다.
  • 사용자의 실패를 상담문·훈계문·생산성 코칭 문체로 바꾸지 않는다.
  • 사실을 기억할 때 출처가 있는 구체성만 사용한다.
  • 같은 어미·감탄사·호칭이 세 번 연속되지 않는다.
  • 한국어 검수자는 의미 보존, 캐릭터성, 자연스러움을 별도 점수로 기록한다.

7. 성능·실패 계약

상황 앱 동작 사용자 경험
모델 미설치 template-only 기능 손실 없이 완주
cold start 지연 제한 시간 후 template 기다림 spinner 최소화
timeout 요청 취소·template 오류 문구 노출 안 함
invalid JSON validator reject·template 상태 변경 없음
forbidden fact reject·local audit code 잘못된 기억 표시 없음
memory conflict confirmed·recent deterministic 우선 단정 대신 확인 선택 가능
low memory 모델 unload 또는 기능 비활성 저장·플레이 유지

8. 완료 증거

  • template-only Day 0·1·3·7 완주
  • input/output JSON schema fixture
  • unknown intent, invalid enum, hallucinated fact, deleted memory, unsafe phrase 테스트
  • target device cold/warm P50·P95 latency와 peak RAM
  • airplane mode에서 inference 또는 fallback 정상
  • 네트워크 request 0건 증거
  • 한국어 30문장 블라인드 검수와 수정 이력
  • 동일 입력 반복 시 의미 일관성, 표현 중복률 기록

9. 연결 문서