본문으로 건너뛰기

AI 개인화 자료

최종 수정: 2026-04-17 18:00 (develop 기준, PR #164까지 반영)

검증 기준: src/agents/podcast/script_personalizer.py, config/app_config.py, config/settings.yaml

통합 아키텍처 기준

본 문서의 개인화 구조는 **Script Personalizer (TIER 4)**와 **Episode Memory Agent (독립)**이 담당합니다.

  • Script Personalizer (TIER 4, Sonnet): 톤/스타일 조정, 호스트 페르소나 오버라이드, Safety warning 대응, CRISIS 분기 폴백
  • Episode Memory Agent (독립): Podcast Reasoning이 조건부로 DI 호출하는 독립 에이전트. 사용자 과거 에피소드 맥락 제공
  • Deep Personalization 플래그: settings.yamlagents.script_personalizer.deep_personalization (기본 False)

1. LMS 개인화 개요

LMS(Leader's Mind Security)의 개인화는 단순한 이름 호출을 넘어, 리더십 역할과 성향에 맞춘 심화 코칭을 의미합니다.

리더십 역할별 맞춤 코칭

직급 유형코칭 포커스맞춤 방식
과장급 (부서 리더)팀 관리, 스트레스 관리실전 상황 중심의 빠른 솔루션 제시
부장급 (부서장)조직 전략, 의사결정 스트레스장기 비전과 심리적 회복력 강화
임원급 (C-suite)조직문화, 경영 철학, 리더십 정체성조직 철학과 개인 가치관의 일치도 탐색

그린룸 이용 패턴 기반 개인화

  • 입장권: 사용자 성향에 맞는 메타인지 프레임워크 제안
  • 팟캐스트: 말투/유머 스타일 반영, 사용자 상황 맞춤 이야기
  • 트래킹: 해결 패턴 학습, 반복 어려움 감지

PRD 1.0 프레이밍 변화

"심리 상담" → "리더십 심리 코칭"

  • 일반 심리 상담이 아닌 리더십 맥락 중심
  • 조직의 역할 기대와 개인의 심리적 요구 조화

2. 리더십 프로필 구성

개인화된 코칭을 위해 다음의 데이터를 수집하고 관리합니다.

기본 정보

  • 직급 / 역할: 과장, 부장, 임원 등
  • 부서 / 조직: 마케팅, 기술, HR 등
  • 리더십 경험: 관리 기간, 팀 규모

리더십 유형

구성 요소설명활용 사례
리더십 스타일 유형변혁적(Transformational), 거래적(Transactional), 서번트(Servant) 등코칭 톤 결정, 조언 방식 선택
의사결정 패턴분석형, 직관형, 숙의형 등문제 상황에서 제시할 솔루션의 형태 결정
커뮤니케이션 스타일공식적, 친근함, 직설적 등팟캐스트 스크립트 작성 시 말투/속도/유머 조정

심리적 프로필

프로필 항목내용
핵심 가치관리더가 인생에서 중요하게 여기는 가치 (성취, 가족, 안정성, 사회 기여 등)
스트레스 트리거특정 상황이나 단어에 대한 민감도 (예: 실패, 갈등, 통제 불능)
방어 기제스트레스 상황에서의 반복적 패턴 (회피, 과도한 업무, 회피형 커뮤니케이션)
애착 유형불안형(anxious), 회피형(avoidant), 안정형(secure) - Script Personalizer의 응답 톤 조정 근거

3. 메모리 계층 (2단계)

실제 코드 기준 (2026-04-17): 프로덕션 메모리 계층은 Vector(Pinecone) + MySQL(Backend) 2단계로 구성됩니다. 이전 문서의 "3단계 메모리(Redis 단기 + Vector 중기 + MySQL 장기)" 표현은 코드와 불일치하여 정정하였습니다.

메모리 계층저장소시간 범위내용
Vector 메모리Pinecone (rag-suite-knowledge 인덱스)전체 사용 기간 (의미 검색)과거 에피소드 임베딩, 반복 주제/감정 추이, 지식 RAG 컨텍스트. Episode Memory Agent가 Podcast Reasoning에서 조건부 호출.
관계형 메모리MySQL (Backend 서버)전체 사용 기간 (정확 조회)사용자 프로필, 세션 메타, 팟캐스트 이력, 감정 로그, 트래킹 상태. Backend API(/greenroom/ingest/ai/*)로 저장/조회.

메모리 활용 예시

사용자가 "최근 팀원과의 갈등으로 힘들어요"라고 입력했을 때:

  1. Vector 메모리 (Pinecone): "과거 유사한 갈등 주제가 몇 회 있었는가?" → 임베딩 유사도 기반 반복 패턴 감지
  2. 관계형 메모리 (MySQL): 사용자 프로필(리더십 스타일·애착 유형·스트레스 트리거)과 최근 세션 이력 조회

Optional: Redis 캐시 (Intent 전용, 현재 프로덕션 미활성)

  • config/app_config.py:176-181에 Intent Classifier 캐시용 Redis 설정(TTL 3600초)이 존재합니다.
  • 메모리 계층이 아닌 Intent 분류 결과 캐싱 용도이며, 현재 프로덕션에서는 비활성 상태입니다.
  • 향후 활성화 시 Intent 중복 호출 비용을 절감할 수 있으나, 사용자 프로필/에피소드 저장과는 무관합니다.

4. Script Personalizer (TIER 4) 역할

Script Personalizer는 Episode Memory Agent가 제공한 정보를 바탕으로 톤/스타일을 조정합니다. 모델은 Sonnet을 사용합니다.

Deep Personalization 트리거 조건

  • enable_deep_personalization 플래그 ON (settings.yaml agents.script_personalizer.deep_personalization, 기본 False)
  • _should_deep_personalize()가 True 반환 — 현재 구현은 단순히 interaction_history >= 3 만 체크합니다 (script_personalizer.py 내부).

톤 / 스타일 조정

조정 항목설명조정 방식
격식 수준 (formality)공식적 vs 친근한 톤호스트 페르소나 formality 필드로 오버라이드 가능 (임원은 공식적, 과장은 친근한 톤)
태도 (attitude)진지함/공감/분석적/유쾌함 등호스트 페르소나 attitude 필드로 오버라이드 (script_personalizer.py:332~345)
공감 강도감정 중심 vs 해결책 중심애착 유형에 따라 조정 (회피형은 강한 공감, 불안형은 행동 중심)
답변 길이간결함 vs 깊이사용자의 의사결정 패턴 반영 (직관형은 짧게, 분석형은 깊이 있게)

Safety Warning 시 톤 조정

Safety Warning이 발동된 경우 (예: 번아웃, 우울 증상):

  • 더 부드럽고 조심스러운 어조 사용
  • 직설적 조언 대신 자기 성찰 유도
  • 전문가 상담 권유 시에도 비난적이 아닌 지지적 표현 사용

CRISIS 분기 (PR #159 이후)

  • Safety Agent가 CRISIS 판정 시 TIER 1~4 파이프라인이 중단되고, Script Personalizer 또한 하드코딩 폴백 메시지를 반환합니다.
  • LLM 호출을 하지 않으므로 개인화는 적용되지 않으며, 위기 응답 고정 메시지로 대체됩니다.
  • 관련 단위 테스트 18건 추가 (PR #159).

개인화 맥락 수신 API (현재 미활용)

  • 엔드포인트: POST /api/sessions/{session_id}/personalization-context
  • 현재 상태: Backend 서버 측 엔드포인트는 정의되어 있으나, AI 파이프라인에서는 아직 활용하지 않습니다.
  • 근거: src/agents/podcast/script_personalizer.py:439# TODO: 추후 개인화 맥락 수신 API에서 받은 데이터를 state 또는 캐시에서 읽어 개인화에 활용 예정
  • 향후 Deep Personalization 활성화 시 이 엔드포인트로 수신한 프로필/과거 맥락을 state 또는 캐시에서 읽어 반영할 예정.

5. 호스트 페르소나 8종

config/app_config.py:121-170PERSONA_STRATEGY_MAP에 정의된 8종 호스트 페르소나입니다. Script Personalizer가 host_title로 룩업하여 기본 전략의 formality/attitude를 오버라이드합니다. PR #152에서 연동되었습니다.

페르소나 (host_title)descriptionkeywordsformalityattitude
따뜻한 공감자감정에 공감하며 부드럽게 이야기하는 동반자공감, 위로, 따뜻함casualempathetic
이성적인 분석가차분하고 논리적으로 상황을 정리해주는 조언자분석, 논리, 차분formalanalytical
열정적인 코치에너지 넘치는 자세로 동기를 북돋는 코치동기부여, 열정, 도전casualenergetic
고요한 새벽지기고요한 새벽의 차분함으로 마음을 다독이는 가이드고요, 성찰, 차분formalserene
유쾌한 팩트폭격기유머와 직설로 핵심을 찌르는 솔직한 친구유머, 직설, 팩트casualplayful
몰입형 이야기꾼이야기와 비유로 몰입감을 이끄는 스토리텔러스토리텔링, 비유, 몰입casualnarrative
신뢰의 전문가전문성과 신뢰로 권위 있는 관점을 제시하는 전문가전문성, 신뢰, 권위formalauthoritative
편안한 동네 친구친근하고 편안한 말투로 가까이 다가오는 친구친근, 편안, 일상casualfriendly

오버라이드 메커니즘: script_personalizer.py:332~345에서 host_title을 키로 PERSONA_STRATEGY_MAP을 조회하여 기본 personalization strategy의 formality/attitude 값을 덮어씁니다. 페르소나에 없는 host_title이 들어오면 기본 전략이 유지됩니다.


6. 그린룸 개인화 적용

LMS의 3대 기능(입장권, 팟캐스트, 트래킹)에 개인화를 적용하는 방식입니다.

입장권 (Ticket) 개인화

  • 사용자 성향 분석: Episode Memory Agent가 사용자의 이전 입장권 선택과 조직 역할 분석
  • 메타인지 프레임워크 제안: "당신의 의사결정 패턴을 보니, 이번엔 이 프레임이 도움될 것 같아요"
  • 진행 난이도 조정: 처음 사용자는 기초 프레임, 고급 사용자는 심화 프레임 제안

팟캐스트 개인화

개인화 요소구현 방식
말투/톤Script Personalizer가 스크립트 생성 후 사용자의 선호 톤 및 호스트 페르소나 오버라이드 적용
호스트 페르소나8종 페르소나 중 선택된 host_title 기준으로 formality/attitude 오버라이드
상황 맞춤 사례같은 직급/역할의 리더십 갈등 사례 우선 추천 (Episode Memory 기반)
핵심 가치관 강조팟캐스트의 통찰이 사용자의 핵심 가치와 연결되도록 재구성

트래킹 개인화

  • 해결 패턴 학습: "이 사용자는 주로 X 유형의 갈등을 Y 방식으로 해결해왔는가?"
  • 반복 어려움 감지: "이 주제는 3개월 연속 미해결 상태입니다. 다른 접근이 필요할 수 있어요."
  • 성장 추이 시각화: 직급별, 주제별 개선도 추적 및 피드백

7. DB 스키마 (핵심)

참고: 아래 스키마는 PostgreSQL 예시이며, 실제 프로덕션은 MySQL 기반입니다. 컬럼 명세는 Backend 팀 API 스펙을 정본(SSOT)으로 합니다.

user_profiles 테이블

CREATE TABLE user_profiles (
user_id UUID PRIMARY KEY,
name VARCHAR(100),
job_title VARCHAR(100), -- '과장', '부장', '임원'
department VARCHAR(100),
leadership_style VARCHAR(50), -- 'transformational', 'transactional', 'servant'
decision_pattern VARCHAR(50), -- 'analytical', 'intuitive', 'deliberative'
communication_style VARCHAR(50), -- 'formal', 'casual', 'direct'
core_values JSONB, -- ["achievement", "stability", "family"]
stress_triggers JSONB, -- ["conflict", "failure", "loss_of_control"]
attachment_style VARCHAR(50), -- 'anxious', 'avoidant', 'secure'
humor_preference INT, -- 1-5 scale
empathy_preference INT, -- 1-5 scale
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);

greenroom_records 테이블

CREATE TABLE greenroom_records (
record_id UUID PRIMARY KEY,
user_id UUID REFERENCES user_profiles(user_id),
record_type VARCHAR(50), -- 'ticket', 'podcast', 'tracking'
framework_id VARCHAR(100), -- 입장권의 메타인지 프레임
podcast_topic VARCHAR(255), -- 팟캐스트 주제
emotional_state JSONB, -- {"sadness": 0.7, "frustration": 0.5}
resolution_status VARCHAR(50), -- 'resolved', 'pending', 'ongoing'
created_at TIMESTAMP DEFAULT NOW(),
feedback_score INT -- 1-5 scale
);

tracking_status 테이블

CREATE TABLE tracking_status (
tracking_id UUID PRIMARY KEY,
user_id UUID REFERENCES user_profiles(user_id),
topic VARCHAR(255), -- 추적 중인 주제
resolution_count INT DEFAULT 0, -- 해결된 횟수
unresolved_count INT DEFAULT 0, -- 미해결 횟수
last_occurrence TIMESTAMP,
pattern_detected BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);

8. 프라이버시 정책

기본 원칙

  • 사용자 데이터는 명시적 허락 없이 공개 불가
  • 사용자는 자신의 프로필과 기억을 확인/삭제할 권리 보유
  • 조직 리더에게는 개별 사용자 정보를 볼 수 없음 (통계 정보만 제공)

허락 단계

역할설명접근 권한
B2B 조직관리자기업 관리자 (HR 담당자)사용자 수, 활성도 통계만 조회 가능 (개인 정보 불가)
사내 그린룸 사용자같은 조직 내 사용자팟캐스트 공유 콘텐츠만 보기 (개인 프로필 불가)
사외 그린룸 사용자외부 사용자공개 콘텐츠만 접근 (개인 데이터 완전 차단)

데이터 삭제 권리

  • 사용자는 언제든 특정 기억(Memory) 삭제 요청 가능
  • 프로필 초기화 옵션으로 모든 학습된 선호도 리셋 가능
  • 탈퇴 시 모든 개인 데이터 삭제 (규정상 의무 저장 데이터 제외)

관련 문서


변경 이력

  • 2026-04-17 18:00 — 코드 검증 결과 반영 (Task 4 재감사)
    • 메모리 계층: 3단계(Redis/Vector/PostgreSQL) → 2단계(Vector/MySQL) 로 정정
    • Redis: Intent Classifier 캐시 Optional 섹션으로 재분류 (프로덕션 미활성)
    • 개인화 맥락 API(/api/sessions/{session_id}/personalization-context): 엔드포인트 정의되었으나 파이프라인 미활용(script_personalizer.py:439 TODO) 명시
    • MCP 도구 3종 섹션 삭제 (프로젝트 미사용)
    • 호스트 페르소나 8종 신규 섹션 추가 (PR #152, config/app_config.py:121-170)
    • Script Personalizer의 TIER 4 위치 / Sonnet / enable_deep_personalization 플래그 명시
    • CRISIS 분기 설명 추가 (PR #159)