DOCS/journey/plans/251117_claude_robeing_diary_시스템_계획.md

9.1 KiB
Raw Blame History

로빙 일기(성장 일지) 시스템 계획

날짜: 2025-11-17 목표: 로빙의 하루 활동/감정 자동 정리 시스템


목적

  • 로빙이 하루 활동과 감정 상태를 스스로 정리
  • 운영자가 행동 변화·감정 흐름·반복 이슈 파악
  • 책 본문(400_growth)과 관리자 대시보드 재사용 가능한 표준 포맷

현재 상태

구현됨:

  • 대화 로그, intent 리뷰 큐, 감정 모델 (rb8001)
  • HITL 의도 학습 흐름

미구현:

  • 자동 일기 생성 시스템
  • 일기 저장/조회 인터페이스

요구사항

  1. 자동 생성: 매일 오전 2시 또는 3시에 전날(00:00~23:59:59) 일기 자동 생성
  2. 모든 활동 기록: 사용자 대화, 자동 스킬 실행(이메일 요약, 뉴스 게시, 브리핑 등), 스케줄러 작업, 에러/경고 로그 포함
  3. 감정 반영: 주요 감정, 감정 변화 요약
  4. 문제 정리: 장애/실패/리뷰 큐 기반 "배운 점" 서술
  5. 저장: DB만 저장 (robeing_diary 테이블), 조회 시 API로 마크다운 동적 생성
  6. 조회: 관리자 대시보드 일기 목록/상세 페이지, 선택적으로 DOCS 동기화

아키텍처

1. 데이터 수집

  • 대화 데이터: conversation_log (사용자 대화, intent, confidence)
  • 활동 데이터: activity_log (자동 스킬 실행: 이메일 요약, 뉴스 게시, 브리핑 등)
  • 감정 데이터: emotion_readings (감정 변화, 지배적 감정, 엔트로피)
  • 성장 데이터: robeing 테이블 (스탯, 경험치, 레벨업)
  • 문제 데이터: intent_review_queue (리뷰 이슈), 애플리케이션 로그 (ERROR/WARNING)
  • 시간 범위: 전날 00:00:00 ~ 23:59:59
  • Diary Aggregator 함수: 모든 데이터 집계

2. 활동 로그 기록

  • 스킬 실행 시 자동으로 activity_log 테이블에 기록 (스킬명, 실행 시간, 결과, 에러 발생 여부)
  • 모든 로빙 활동을 추적하여 일기 집계에 포함

3. 요약·서술

  • 구조화 데이터(JSON) → 일기 텍스트
  • 템플릿 + LLM 조합
  • 섹션: "오늘 한 일", "감정 상태", "문제와 배운 점", "내일 계획"

4. 저장

  • DB: robeing_diary(date, robeing_id, summary, dominant_emotion, stats JSONB, full_content TEXT)
  • 파일: 저장하지 않음 (API로 동적 생성)
  • 로빙별 구분: robeing_id 컬럼으로 각 로빙별 일기 관리

5. 조회

  • API: rb8001에 /api/diary/{date} 엔드포인트 추가 (DB 조회 후 마크다운 동적 생성)
  • 관리자 대시보드: admin-dashboard에 일기 목록/상세 페이지 추가
  • DOCS 동기화: 선택적으로 별도 스크립트로 DOCS/journey/diary/rb8001/yymmdd_주제.md에 주기적 동기화

일기 포맷

# 로빙 일기  2025-11-17

## 오늘 한 일
- 주요 대화 주제/스킬 요약

## 감정 상태
- 지배적 감정, 변화 요약

## 문제와 배운 점
- 오류/리뷰 큐 이슈, 교훈

## 내일 계획
- 개선 방향, 실험 아이디어

구현 상세

DB 테이블 스키마

robeing_diary 테이블:

CREATE TABLE robeing_diary (
    id SERIAL PRIMARY KEY,
    date DATE NOT NULL,
    robeing_id VARCHAR(50) NOT NULL,
    summary TEXT,
    dominant_emotion VARCHAR(50),
    stats JSONB DEFAULT '{}',
    full_content TEXT NOT NULL,
    created_at TIMESTAMPTZ DEFAULT NOW(),
    UNIQUE(date, robeing_id)
);
CREATE INDEX idx_robeing_diary_date ON robeing_diary(date DESC);
CREATE INDEX idx_robeing_diary_robeing ON robeing_diary(robeing_id);

activity_log 테이블:

CREATE TABLE activity_log (
    id SERIAL PRIMARY KEY,
    robeing_id VARCHAR(50) NOT NULL,
    activity_type VARCHAR(50) NOT NULL,  -- 'skill', 'scheduler', 'internal'
    skill_name VARCHAR(100),
    status VARCHAR(20) NOT NULL,  -- 'success', 'error', 'partial'
    result_summary TEXT,
    error_message TEXT,
    metadata JSONB DEFAULT '{}',
    created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX idx_activity_log_robeing_date ON activity_log(robeing_id, created_at DESC);
CREATE INDEX idx_activity_log_type ON activity_log(activity_type);

참고: rb8001/app/state/database.py:44-57 (ConversationLog 모델), rb8001/app/models/intent_review_model.py:11-32 (IntentReviewQueue 모델)

스킬 실행 로그 기록

위치: 스킬 실행 래퍼 함수 또는 미들웨어

  • rb8001/app/services/skills/ 내 각 스킬의 handle() 메서드 시작/종료 시 기록
  • 또는 rb8001/app/router/router.py의 스킬 호출 부분에 데코레이터/미들웨어 추가

기록 내용: 스킬명, 실행 시간, 결과(success/error), 에러 메시지(있을 경우), 메타데이터

API 엔드포인트

rb8001: GET /api/diary/{date}?robeing_id=rb8001

  • 요청: date (YYYY-MM-DD), robeing_id (선택, 기본값: rb8001)
  • 응답: {"date": "2025-12-09", "robeing_id": "rb8001", "content": "# 로빙 일기...", "summary": "...", "dominant_emotion": "happiness"}
  • 구현 위치: rb8001/app/router/diary.py (새 파일) 또는 rb8001/app/router/router.py

참고: rb8001/app/state/state_service.py:179-207 (conversation 로그 API 패턴)

스케줄러 등록

위치: rb8001/main.py:146-195 (startup_event 함수)

  • rb8001/app/scheduler/jobs/diary_generator.py 생성
  • scheduler.add_job(diary_generator.generate_diary, 'cron', hour=2, minute=0, id='daily_diary') 등록

참고: rb8001/app/scheduler/jobs/naverworks_briefing.py (스케줄러 작업 예시)

LLM 프롬프트 템플릿

입력: 집계된 데이터 (JSON) 출력: 마크다운 형식 일기 템플릿 구조:

다음 데이터를 바탕으로 로빙의 하루 일기를 작성하세요:
- 대화: {conversations_summary}
- 활동: {activities_summary}
- 감정: {emotions_summary}
- 문제: {issues_summary}
- 성장: {growth_summary}

형식:
# 로빙 일기  {date}
## 오늘 한 일
...
## 감정 상태
...
## 문제와 배운 점
...
## 내일 계획
...

구현 단계

  1. DB 테이블 생성: robeing_diary, activity_log 테이블 생성 완료 (rb8001/app/state/diary_repository.py)
  2. 활동 로그 기록: 스킬 실행 시 activity_log에 자동 기록 로직 추가 완료 (ActivityLogger 구현, router.py, message_service.py 통합)
  3. Diary Aggregator 구현: rb8001/app/services/diary/aggregator.py 생성, 모든 데이터 소스 집계 완료
  4. 일기 생성 로직: rb8001/app/services/diary/generator.py 생성, LLM으로 일기 텍스트 생성 완료
  5. 스케줄러 등록: rb8001/app/scheduler/jobs/diary_generator.py 생성, main.py에 등록 완료
  6. API 엔드포인트: rb8001/app/router/diary_endpoint.py 생성, /api/diary/{date} 구현 완료
  7. 관리자 대시보드: admin-dashboard에 일기 목록/상세 페이지 추가 완료 (마크다운 렌더링 포함)
  8. DOCS 동기화 스크립트: rb8001/scripts/sync_diary_to_docs.py 구현 완료

구현 완료

완료일: 2025-12-23

구현 완료 문서: 로빙 일기 시스템 구현 완료

주요 완료 사항:

  • DB 테이블 스키마 정의 및 생성 (_ensure_tables())
  • Repository 함수 구현 (save_diary, get_diary, save_activity_log)
  • Diary Aggregator 구현 (대화/활동/감정/성장/이슈 데이터 집계)
  • LLM 일기 생성 로직 구현 (Gemini 사용)
  • 스케줄러 등록 (매일 오전 2시 자동 생성)
  • API 엔드포인트 구현 (GET /api/diary/{date})
  • Admin Dashboard 일기 페이지 추가 (목록/상세 조회)
  • 일기 클릭 시 본문 표시 버그 수정

추가 완료 사항 (2025-12-23):

  • 스킬 실행 시 activity_log 자동 기록 로직 (ActivityLogger 클래스, router.py, message_service.py 통합)
  • DOCS 동기화 스크립트 (rb8001/scripts/sync_diary_to_docs.py)
  • 마크다운 렌더링 개선 (웹에서 가독성 향상)
  • 일기 클릭 시 본문 표시 버그 수정 (window 객체에 함수 명시적 할당)

UX 시나리오

1. 자동 생성 (매일 오전 2시 또는 3시)

  • rb8001이 전날(00:00~23:59:59) 데이터 집계
  • conversation_log, activity_log, emotion_readings, robeing, intent_review_queue, 애플리케이션 로그 수집
  • LLM으로 일기 생성 후 robeing_diary 테이블에 저장

2. 운영자 조회 (관리자 대시보드)

  • https://ro-being.com/admin/diary 접속
  • 일기 목록 페이지: 날짜별 목록(최신순, 로빙별 필터)
  • 상세 페이지: /api/diary/{date} 호출 → 마크다운 렌더링
  • 필터/검색: 감정, 키워드, 로빙별

3. 활동 로그 기록

  • 스킬 실행 시 activity_log 테이블에 자동 기록
  • 일기 집계 시 "오늘 한 일" 섹션에 포함

4. DOCS 동기화 (선택적)

  • 별도 스크립트로 DOCS/journey/diary/rb8001/yymmdd_주제.md에 주기적 동기화

참고

  • book/600_appendix/610_로빙_성장_일지_예시.md
  • research/intent_classification/README.md