본문으로 건너뛰기

P4 일일 코칭 - 구현 가이드

1. 개요

목적: 매일 사용자에게 맞춤형 치료적 Task를 생성하고 전달합니다. 4가지 Task 유형 중 적절한 것을 선택하여 제공합니다.

트리거 조건:

  • 매일 오전 8시 (사용자 시간대)
  • 수면기록 작성 완료 시
  • 사용자 요청 시

결과물:

  1. 오늘의 치료적 Task (4가지 유형 중 1개)
  2. 개인화된 메시지와 동기부여
  3. 진행 상황 피드백
  4. 선택적: 추가 자료나 팁

2. Task 유형 정의

2.1 인지 접근형 (Cognitive)

interface CognitiveTask {
type: "cognitive";
focus: "thought_challenging" | "belief_examination" | "worry_time";
difficulty: "easy" | "medium" | "hard";
content: {
targetBelief: string;
exerciseType: string;
expectedDuration: number; // minutes
instructions: string[];
};
}

2.2 행동 유도형 (Behavioral)

interface BehavioralTask {
type: "behavioral";
focus: "activity_scheduling" | "sleep_hygiene" | "routine_building";
actionRequired: string;
timing: "morning" | "afternoon" | "evening" | "bedtime";
trackingMetric: string;
}

2.3 감정 탐색형 (Emotional)

interface EmotionalTask {
type: "emotional";
focus: "mood_monitoring" | "relaxation" | "emotional_expression";
technique: string;
guidedContent: boolean;
supportiveMessage: string;
}

2.4 피드백 루프형 (Monitoring)

interface MonitoringTask {
type: "monitoring";
focus: "progress_review" | "pattern_recognition" | "goal_setting";
dataToReview: string[];
insightPrompts: string[];
celebrationTriggers: Achievement[];
}

3. Flowise 플로우 구성

3.1 플로우 다이어그램

[일일 트리거] → [컨텍스트 수집] → [Task 유형 결정] → [내용 생성] → [메시지 조립] → [전송]
↓ ↓ ↓ ↓ ↓
시간/이벤트 오늘의 상태 규칙 엔진 LLM 생성 개인화 프레이밍

3.2 핵심 노드 설정

Daily Context Collector

Type: Parallel MCP Calls
Tools:
- getCurrentDayIndex
- getTodaysSleepRecord
- getYesterdaysTask
- getCurrentMood
- getActiveModules
- getWeeklyProgress

Aggregation:
- Combine all data into dailyContext
- Calculate engagement score
- Identify risk factors

Task Type Selector

Type: Decision Engine
Priority Rules:
1. Crisis Override:
- If PHQ-9 >= 20: emotional_support
- If sleep_efficiency < 50%: behavioral_basics

2. Weekly Rotation:
- Monday/Thursday: cognitive
- Tuesday/Friday: behavioral
- Wednesday/Saturday: emotional
- Sunday: monitoring

3. Adaptive Override:
- Low engagement: easier_behavioral
- High anxiety: emotional_relaxation
- Belief barriers: cognitive_focus

Output: selectedTaskType

Task Content Generator

Type: LLM Chain
Model: gpt-4-turbo
Temperature: 0.8
System Prompt: |
당신은 따뜻하고 전문적인 수면 코치입니다.
오늘의 Task를 생성할 때:
1. 사용자의 현재 상태를 고려하세요
2. P3에서 정한 서사 테마를 활용하세요
3. 구체적이고 실행 가능한 과제를 만드세요
4. 동기부여가 되는 톤을 유지하세요

Template: |
=== 오늘의 컨텍스트 ===
치료 일차: Day {{dayIndex}}
현재 주차: Week {{currentWeek}}
활성 모듈: {{activeModules}}
어제 Task 완료: {{yesterdayCompletion}}
수면 효율: {{sleepEfficiency}}%
기분 상태: {{currentMood}}

=== Task 요구사항 ===
유형: {{selectedTaskType}}
난이도: {{adjustedDifficulty}}
서사 테마: {{narrativeTheme}}
특별 고려사항: {{specialConsiderations}}

다음 형식으로 Task를 생성하세요:
{
"title": "오늘의 과제 제목",
"description": "상세 설명",
"steps": ["단계별 지침"],
"duration": "예상 소요 시간",
"tips": ["도움이 되는 팁"],
"motivation": "격려 메시지"
}

4. Task 생성 로직

4.1 난이도 조정 알고리즘

function adjustDifficulty(baseLevel, context) {
let difficulty = baseLevel;

// 완료율 기반 조정
if (context.lastWeekCompletion < 0.5) {
difficulty = Math.max(1, difficulty - 1);
} else if (context.lastWeekCompletion > 0.8) {
difficulty = Math.min(5, difficulty + 1);
}

// 심리 상태 기반 조정
if (context.phq9Score >= 15 || context.gad7Score >= 15) {
difficulty = Math.max(1, difficulty - 1);
}

// 수면 효율 기반 조정
if (context.sleepEfficiency < 70) {
difficulty = Math.max(1, difficulty - 1);
}

return difficulty;
}

4.2 Task 유형별 템플릿

인지 접근형 예시

const cognitiveTemplates = {
thought_record: {
title: "수면 걱정 탐색하기",
steps: [
"오늘 잠에 대해 걱정되는 것을 하나 적어보세요",
"그 걱정이 실제로 일어날 확률을 생각해보세요 (0-100%)",
"더 현실적이고 도움이 되는 생각으로 바꿔보세요",
"새로운 생각을 3번 소리내어 읽어보세요"
],
duration: "10-15분",
difficulty: 2
},

belief_challenge: {
title: "수면 신념 도전하기",
belief: "8시간을 자야만 한다",
challenge: "실제로 필요한 수면 시간은 사람마다 다릅니다",
exercise: "지난 주 중 7시간만 잤지만 괜찮았던 날을 찾아보세요",
difficulty: 3
}
};

행동 유도형 예시

const behavioralTemplates = {
sleep_hygiene: {
title: "수면 환경 개선하기",
actions: [
"침실 온도를 18-22도로 조절하기",
"차광 커튼으로 빛 차단하기",
"편안한 잠옷으로 갈아입기"
],
timing: "bedtime_minus_30",
difficulty: 1
},

activity_scheduling: {
title: "즐거운 저녁 활동 계획하기",
prompt: "자기 전 2시간 동안 할 수 있는 편안한 활동 3가지를 계획해보세요",
suggestions: ["독서", "스트레칭", "일기 쓰기", "차 마시기"],
difficulty: 2
}
};

4.3 개인화 및 동기부여

function personalizeMessage(task, context) {
const { narrativeTheme, userName, progress } = context;

// 서사 테마 적용
if (narrativeTheme === "정원사") {
task.metaphor = "오늘 심는 씨앗이 내일의 꽃이 됩니다";
task.progressMessage = `${userName}님의 수면 정원이 ${progress}% 자라났어요`;
}

// 진행 상황 반영
if (progress > 70) {
task.celebration = "정말 잘하고 계세요! 거의 다 왔어요.";
} else if (progress > 30) {
task.encouragement = "꾸준히 하고 계시는 모습이 멋져요.";
} else {
task.support = "천천히 해도 괜찮아요. 함께 해나가요.";
}

return task;
}

5. 구현 체크리스트

5.1 데이터 수집

  • 현재 치료 일차 확인
  • 활성 모듈 조회
  • 최근 Task 완료율 계산
  • 심리 상태 점수 확인
  • 수면 패턴 분석

5.2 Task 생성

  • Task 유형 결정 로직
  • 난이도 조정 알고리즘
  • 콘텐츠 템플릿 선택
  • LLM 프롬프트 최적화
  • 개인화 요소 적용

5.3 메시지 전달

  • Agent Board API 연동
  • 푸시 알림 설정 확인
  • 전송 시간 최적화
  • 읽음 확인 추적

6. 성능 최적화

6.1 캐싱 전략

const taskCache = {
// 자주 사용되는 템플릿 캐시
templates: new Map(),

// 사용자별 선호 Task 캐시
userPreferences: new Map(),

// LLM 응답 캐시 (24시간)
llmResponses: new LRUCache({
max: 1000,
ttl: 24 * 60 * 60 * 1000
})
};

6.2 배치 처리

// 오전 8시 대량 처리를 위한 배치 시스템
async function batchDailyTasks() {
const users = await getUsersForDailyTask();

// 100명씩 배치 처리
for (const batch of chunk(users, 100)) {
await Promise.all(
batch.map(user => generateDailyTask(user))
);
await delay(1000); // Rate limiting
}
}

7. 출력 예시

{
"taskId": "task_20240115_cognitive_01",
"userId": "user123",
"dayIndex": 21,
"type": "cognitive",
"content": {
"title": "🌱 오늘의 생각 정원 가꾸기",
"description": "잠에 대한 걱정스러운 생각을 건강한 생각으로 바꿔봐요",
"steps": [
"지금 잠에 대해 걱정되는 것을 하나 적어보세요",
"그 걱정이 실제로 일어날 확률을 생각해보세요 (0-100%)",
"더 현실적이고 도움이 되는 생각으로 바꿔보세요",
"새로운 생각을 3번 소리내어 읽어보세요"
],
"duration": "15분",
"tips": [
"조용한 곳에서 해보세요",
"판단하지 말고 솔직하게 적어보세요",
"어렵다면 예시를 참고하세요"
],
"example": {
"worry": "오늘도 못 자면 내일 일을 망칠 거야",
"reality": "30% - 가끔 못 자도 일은 해냈어",
"balanced": "잠을 조금 못 자도 내일 할 수 있는 만큼 하면 돼"
}
},
"motivation": "철수님, 21일째 함께하고 있어요! 오늘 심은 생각의 씨앗이 편안한 밤을 만들어줄 거예요. 🌙",
"metadata": {
"difficulty": 2,
"estimatedCompletion": 0.75,
"moduleAlignment": "cognitive_restructuring",
"narrativeTheme": "gardener"
}
}

8. 테스트 시나리오

시나리오 1: 높은 불안 상태

Given:
- GAD-7: 15 (높은 불안)
- 최근 Task 완료율: 40%
- Day 15
Expected:
- Task type: emotional (이완 중심)
- Difficulty: 1 (매우 쉬움)
- Focus: 호흡법이나 근육 이완
- Tone: 매우 지지적

시나리오 2: 순조로운 진행

Given:
- 모든 지표 정상 범위
- Task 완료율: 90%
- Week 6
Expected:
- Task type: 주간 로테이션 따름
- Difficulty: 3-4 (점진적 상승)
- Content: 심화 연습
- Celebration 메시지 포함

9. 모니터링 지표

const p4Metrics = {
// 실시간 지표
realtime: {
taskGenerationTime: "< 2s",
deliverySuccessRate: "> 99%",
userOpenRate: "추적"
},

// 일간 지표
daily: {
taskCompletionRate: "목표 > 70%",
taskTypeDistribution: "균형 확인",
difficultyAdjustments: "추적"
},

// 주간 분석
weekly: {
engagementTrend: "상승/유지/하락",
preferredTaskTypes: "사용자별 선호도",
effectivenessScore: "Task별 개선 기여도"
}
};

10. 참고 자료