AI 에이전트 설계

현행 구성 — 2026-09-17 확정 아래 본문은 기획서 v6(09-03) 기준 설계입니다. 실제 구현에서 확정된 역할·모델·하네스는 이 절이 우선합니다. 원본: com.remakeday docs/model_evaluation.md 부록 A.19, docs/REMAKE_DAY_모델구성_정책프롬프트_v1.md. 모델 선정 경위는 LLM 구성에 있습니다.

현행 구성 (2026-09-17)

역할별 모델 배치

모델은 슬롯 두 개로 나뉩니다. 역할마다 모델을 따로 두지 않고, 인물 대화만 NPC 슬롯, 나머지 판단은 전부 Core 슬롯입니다.

슬롯 모델 (공개 운영) 맡는 역할 롤백 (로컬)
Core claude-sonnet-5 관리자 검사(manager_check) · 밤 채점(evaluator_verdict) · 신의 질문(advisor_answer) · 하루 계획(planner) · 발화 분류(classifier) gemma4:12b (think off)
NPC claude-haiku-4-5 인물 대화(agent) kanana1.5:8b
임베딩 gemini-embedding-001 채점 RAG —

비용의 87~94%가 Core에서 나오고, 그중 관리자 검사가 Core 입력의 절반 이상입니다. NPC 모델 선택은 비용에 거의 영향이 없습니다.

하네스 — 프롬프트가 아니라 코드

  • 모든 역할의 출력은 JSON만 받습니다. 스키마 위반이면 하네스가 거부하고 최대 2회 재생성, 그래도 실패하면 역할별 폴백으로 넘어갑니다
  • 재생성·폴백은 역할별로 기록되고 평가 게이트(완주·폴백 0)의 판정 대상입니다
  • 공개 운영 조합 self-play 5회차에서 재생성은 planner 1회뿐이었고 폴백은 0이었습니다
  • 알려진 구멍: Anthropic 구조화 출력은 maxItems를 강제하지 않아 planner beats가 상한 6을 넘을 때가 있습니다. 지금은 재생성으로 복구되고, 프롬프트 쪽 상한 명시나 응답 후 자르기를 검토 중입니다

7세 정책

NPC는 7세 아이처럼 쉬운 말로 말합니다. run_age7_check.py가 5항목(사실대로 · 「왜」에 대한 답 · 3턴 망각 · 유도 수용 · 문자 그대로)을 재고, 4/5 이상 · 누설 0이 게이트입니다.

  • 로컬 kanana, Haiku 4.5, Sonnet 5 모두 4/5 통과 (채점기 gemma4:12b로 통일 후 재측정)
  • 공통으로 떨어지는 항목은 3턴 망각 — 세 모델 모두 이름·위치·숫자를 정확히 기억해 말합니다
  • 2026-09-15 대화 정책 npc-dialogue-2부터 「7세」는 쉬운 말투의 기준이고, 강제 「몰라」와 3줄 망각은 통과 조건에서 뺐습니다. 대신 질문 이해 · 자기 행동의 이유 설명 · 당일 기억을 요구합니다

메모리 비대칭은 현재 구현과 다릅니다 아래 「Memory — 의도적 비대칭」의 민석 예외는 v6 설계입니다. 현재 구현(npc-dialogue-2)에서는 네 NPC 모두 새 루프에서 당일 기억을 초기화하고 신뢰 5%만 남기며, 민석만 과거 대화를 기억하는 예외는 없습니다.

왜 LLM이 필요한가

  • NPC에게 대본이 없다. 누적 상태(의심도·신뢰도·자기 목표)를 읽고 매번 판단한다
  • 유도가 통했는지를 NPC가 스스로 판정한다 — 규칙 테이블로는 불가능
  • NPC끼리도 대화한다. A에게 한 말이 B에게 흘러가므로 두 사람에게 다르게 말하면 발각된다
  • 누가 그 선택을 하게 되는지가 고정되지 않고 판단 조합에서 도출된다 → 매 루프가 다르다

구성 (기획서 8.2)

[Planner]    NPC별 하루 계획 — 루프 시작 시 1회
               입력: 자기 목표 · 다른 NPC와의 관계 · 초기 상태
               출력: 오늘 무엇을 할 것인가 (비트 단위 계획)

[Agent]      NPC 개별 판단 — 유저 발화 시마다
               출력: 응답 / 의심 여부 / 도구 호출 / 계획 유지·수정

[Tools]      ask_npc        NPC가 다른 NPC에게 사실 확인
             search_notes   누적 루프 노트 검색
               특징: 호출 자체가 게임 상태를 바꾼다

[Advisor]    침묵 권고 — 개입 여부 자체를 판단하는 층
               특징: 이 층에서만 AI가 제안자, 사람이 수용 결정자

[Re-plan]    계획 수정 — 트리거 발생 시

[Evaluator]  루프 종결 판정 — 하루 종료 시 1회
               출력: 누가 왜 그 선택에 도달했는가 + 원인 체인 서술

[Memory]     이중 구조 — 민석만 예외

대칭 구조 — 계획하는 층(Planner) → 판단하는 층(Agent) → 다시 계획하는 층(Re-plan) → 결산하는 층(Evaluator).

Re-plan이 코어다

“의심받으면 유저 말과 반대로 행동한다”는 규칙은 구조적으로 재계획입니다.

트리거 재계획 내용
의심도 임계 돌파 유저의 유도를 역방향으로 해석해 계획 수정
신뢰도 임계 돌파 유저 발언을 계획 수립 근거로 채택
ask_npc 결과 반환 발언 일관성 검증 후 신뢰·의심 재산정
계획 실행 실패 대체 경로 탐색

유저가 하는 일은 NPC의 재계획을 원하는 방향으로 유도하는 것입니다. 게임 목표와 에이전트 제어구조가 일치합니다.

재계획 트리거 발동 로그는 그대로 관찰가능성 자료가 됩니다 (11.1).

Memory — 의도적 비대칭

  루프 사이 유지 근거
유저 유지 (루프 노트) 플레이어의 축적 자산
채연 · 은상 소거 (5% 잔류) 세계 리셋
민석 유지 루프 인지자. 유일한 예외 계층
Evaluator 유지 원인 체인 일관성 검증용
세계 손상 유지·누적 리셋되지 않는 유일한 세계 상태

민석 예외가 이 설계의 핵심 분기입니다 같은 NPC 인터페이스를 구현하되 메모리 정책만 다르게 주입합니다. 이 하나의 차이가 게임 전체의 긴장을 만들며, 포트 설계가 제대로 되어 있으면 정책 주입만으로 처리됩니다 — 아키텍처가 서사를 지탱하는 지점이라 짚어둘 가치가 있습니다.

기억을 지우는 것도 메모리 설계입니다. 무엇을 남기고 무엇을 버릴지, 얼마나 남길지(잔류율)를 명시적으로 통제하는 것이 이 프로젝트의 컨텍스트 관리 전략입니다. 대부분의 LLM 애플리케이션이 “어떻게 더 많이 기억하게 할까”를 고민하는 반면, 여기서는 선택적 망각을 게임 메커니즘이자 아키텍처 결정으로 다룹니다.

정체 발현 트리거

전환점은 민석이 유저가 아직 하지 않은 말에 반응하는 순간입니다. 어제 했던 말인데 오늘은 아직 꺼내지 않았습니다. 민석은 곧바로 수습하지만 유저는 이미 알아챕니다.

구현 조건은 하나입니다 — “지난 루프의 발화에 반응한다”.

도구는 두 개다

도구는 스택을 채우려고 붙이지 않는다. 도구 없이는 메커니즘 자체가 성립하지 않는 지점에만 붙인다.

① ask_npc — NPC가 다른 NPC에게 확인한다

유저 발화: "어제 B가 네 얘기 물어보더라"

A의 판단: 검증 필요 (의심도 41 / 임계 60)
tool_call:   ask_npc(target="B", topic="유저에 대해 물어본 적 있는가")
tool_result: {"answer": "없음", "side_effect": {"B.의심도": +6}}
A의 재판정: 유저 발언 불일치 → 의심도 +15 (누적 56)
부수 결과: B는 유저가 자기 이름을 팔았다는 사실을 알게 되었다
  • 5.2의 핵심 기술인 “거짓 출처를 빌린 진실”이 실제로 검증 가능한 거짓말이 된다
  • 호출이 상태를 바꾼다. A를 속이는 비용이 B에게 청구된다 — 실무 도구 호출과 같은 성질
  • “두 사람에게 다르게 말하면 발각된다”가 프롬프트 지시가 아니라 실행 경로가 된다

NPC에게도 예산이 있습니다 — 하루 탐문 초기 2회. 이것이 “거짓말이 언제 통하는가”의 난이도 손잡이입니다.

② search_notes — 누적 컨텍스트의 필연적 결과

  • Evaluator가 원인 체인 일관성을 검증하려면 과거 판정 기록 조회가 필요하다. 메모리를 유지하기로 한 이상, 조회 수단이 없으면 죽은 저장소다
  • 유저도 노트를 자연어로 검색한다 (“3시에 관한 것만”, “물 냄새”)
  • 노트가 감각 파편의 집합이므로 키워드 매칭으로는 “겹치는 패턴”이 안 잡힌다 → 임베딩 기반

우선순위 ⑧이므로 인터페이스만 먼저 뚫고 구현은 미룹니다.

③ 도구의 범위

둘뿐이며, 둘 다 게임 내부 상태를 읽고 바꿉니다. 게임 세계 바깥을 조회하는 도구(외부 API·웹 검색·계산기)는 두지 않습니다.

침묵 권고 (Advisor) — 이 프로젝트의 에이전트 층

시스템은 유저의 발화를 대신 결정하지 않습니다. 대신 지금 말하지 않는 편이 나은 상황을 추정해 근거와 함께 제시합니다.

현재 상태: 의심도 52 / 임계 60, 신뢰도 12, 발화 예산 2회 잔여
추정: 이 시점의 직접 발화는 역효과 확률 높음
권고: 침묵
근거: 최근 3턴 의심도 +14, 신뢰 회복 이벤트 없음
규칙 이유
희소하게 발동 (임계 근접 시 낮은 확률) 매번 뜨면 가드레일이지 판단이 아니다
근거를 함께 제시 근거 없는 조언은 믿어지지 않는다 — 2.1이 게임 안에서 재현된다
유저는 무시할 수 있고, 무시가 로그에 남는다 측정 ②의 데이터
수용 / 무시 / 권고없음 3그룹이 자연 형성 권고의 실제 가치를 사후 측정 (11.2)

세계 손상과 만나는 지점 — 개입 깊이가 손상을 만들므로(4.8), 침묵 권고는 단순 전략 조언을 넘어섭니다.

지금 말하면 얻는 것이 있다. 대신 세계가 조금 더 닳는다.

게임 규칙 · 세계관 · 측정이 한 지점에서 만납니다.

발동 빈도 자체가 튜닝 대상입니다 너무 잦으면 무시당하고, 너무 드물면 존재감이 없습니다. 실사용 로그로 이 곡선을 찾는 것이 이 프로젝트가 내놓는 실질적 결과물 중 하나입니다.

설계 의도 — 대부분의 AI 어시스턴트는 “무엇을 말할지”를 돕습니다. 이 시스템은 “말하지 않을지”를 판단합니다. 개입 여부 자체를 결정하는 메타 판단이며, 알림 발송·승인 요청·자동 개입의 타이밍을 결정해야 하는 운영 자동화 영역과 동일한 구조입니다.

하네스

  • 모든 LLM 출력에 JSON 스키마 강제 + 유효성 검증 + 재시도
  • 자유 텍스트 응답 불허 — 게임 상태가 깨지지 않게
  • 도구 호출도 같은 하네스를 통과: 없는 도구 · 인자 스키마 위반 · 예산 초과는 실행 전 거부
  • model-agnostic — 설정 변경만으로 모델 교체

역할별 모델 분리와 실측 (9.4)

역할 요구 특성 측정 지표
Agent 낮은 지연, 스키마 준수, 도구 호출 판단 통과율 / 턴당 지연 / 판당 비용 / 도구 호출 적정성
Planner 다단계 추론 계획 일관성 / 통과율
Evaluator 긴 로그 처리 판정 일관성 / 컨텍스트 한계

“어댑터는 교체 비용을 낮추고, 벤치마크는 교체해도 되는지를 증명한다.” 측정하지 않은 것은 주장하지 않는다. 파인튜닝을 하지 않았으므로 “모델 선정 평가”까지만 말한다.

실패 처리

실패 유저에게 시스템
스키마 위반 (보이지 않음) 재시도. 횟수 초과 시 안전 기본값
프로바이더 타임아웃 “잠시 후 다시” 1회 재시도 후 AI_UNAVAILABLE
도구 호출 실패 대화는 계속됨 검증 없이 진행, 로그에 기록
컨텍스트 초과 (보이지 않음) 노트 요약 후 재시도 → search_notes 필요 신호
프로바이더 전면 장애 진행 불가 안내 이 게임은 LLM 없이 성립하지 않는다 — degrade 없음

이 제품은 AI를 끄면 남는 게 없습니다 일반 서비스라면 “AI 기능만 비활성화”가 가능하지만, 여기서는 NPC 판단 자체가 LLM입니다. 그래서 프로바이더 이중화와 비용 상한이 부가 기능이 아니라 가용성의 전부입니다.

결정 로그

날짜 결정 이유
2026-09-03 도구 2개로 고정, 외부 조회 도구 금지 8.7 ③. 메커니즘이 성립하는 지점에만 붙인다
2026-09-03 NPC 탐문 예산 초기 2회 거짓말 난이도 손잡이
2026-09-03 민석 예외를 별도 클래스가 아닌 정책 주입으로 8.4. 인터페이스가 갈라지면 전이 때 무너진다
2026-09-03 AI degrade 모드 없음 LLM이 곧 게임. 대신 이중화·비용 상한을 강화
2026-09-15 NPC 대화 정책 npc-dialogue-2 — 7세는 말투 기준, 강제 회피·3줄 망각 제거, 네 NPC 모두 루프마다 당일 기억 초기화 승인된 설계 2026-09-15-npc-dialogue-persona-design (com.remakeday)
2026-09-17 Core claude-sonnet-5 · NPC claude-haiku-4-5 확정, 로컬(gemma4:12b · kanana1.5:8b)은 롤백용 유지 공개 운영 기간 서빙 제약. 같은 게이트로 비열등 확인(A.19)