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.yaml의agents.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/*)로 저장/조회. |
메모리 활용 예시
사용자가 "최근 팀원과의 갈등으로 힘들어요"라고 입력했을 때:
- Vector 메모리 (Pinecone): "과거 유사한 갈등 주제가 몇 회 있었는가?" → 임베딩 유사도 기반 반복 패턴 감지
- 관계형 메모리 (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.yamlagents.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-170의 PERSONA_STRATEGY_MAP에 정의된 8종 호스트 페르소나입니다. Script Personalizer가 host_title로 룩업하여 기본 전략의 formality/attitude를 오버라이드합니다. PR #152에서 연동되었습니다.
| 페르소나 (host_title) | description | keywords | formality | attitude |
|---|---|---|---|---|
| 따뜻한 공감자 | 감정에 공감하며 부드럽게 이야기하는 동반자 | 공감, 위로, 따뜻함 | casual | empathetic |
| 이성적인 분석가 | 차분하고 논리적으로 상황을 정리해주는 조언자 | 분석, 논리, 차분 | formal | analytical |
| 열정적인 코치 | 에너지 넘치는 자세로 동기를 북돋는 코치 | 동기부여, 열정, 도전 | casual | energetic |
| 고요한 새벽지기 | 고요한 새벽의 차분함으로 마음을 다독이는 가이드 | 고요, 성찰, 차분 | formal | serene |
| 유쾌한 팩트폭격기 | 유머와 직설로 핵심을 찌르는 솔직한 친구 | 유머, 직설, 팩트 | casual | playful |
| 몰입형 이야기꾼 | 이야기와 비유로 몰입감을 이끄는 스토리텔러 | 스토리텔링, 비유, 몰입 | casual | narrative |
| 신뢰의 전문가 | 전문성과 신뢰로 권위 있는 관점을 제시하는 전문가 | 전문성, 신뢰, 권위 | formal | authoritative |
| 편안한 동네 친구 | 친근하고 편안한 말투로 가까이 다가오는 친구 | 친근, 편안, 일상 | casual | friendly |
오버라이드 메커니즘:
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) 삭제 요청 가능
- 프로필 초기화 옵션으로 모든 학습된 선호도 리셋 가능
- 탈퇴 시 모든 개인 데이터 삭제 (규정상 의무 저장 데이터 제외)
관련 문서
- AI 파트 아키텍처 - LMS 전체 시스템
- AI 에이전트, MCP 자료 - 에이전트 구성
- AI 안전 및 위험 감지 - Safety Agent 연동
변경 이력
- 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:439TODO) 명시 - MCP 도구 3종 섹션 삭제 (프로젝트 미사용)
- 호스트 페르소나 8종 신규 섹션 추가 (PR #152,
config/app_config.py:121-170) - Script Personalizer의 TIER 4 위치 / Sonnet /
enable_deep_personalization플래그 명시 - CRISIS 분기 설명 추가 (PR #159)