docs: 로빙 일기 시스템 구현 상세 추가

- DB 테이블 스키마 (robeing_diary, activity_log)
- 스킬 실행 로그 기록 위치/방법
- API 엔드포인트 요청/응답 형식
- 스케줄러 등록 방법
- LLM 프롬프트 템플릿 구조
- 구현 단계별 파일 위치 명시
- 기존 코드 참고 링크 추가
This commit is contained in:
Claude-51124 2025-12-09 16:20:42 +09:00
parent 7d5382baea
commit da0049ad41

View File

@ -88,15 +88,107 @@
---
## 구현 상세
### DB 테이블 스키마
**robeing_diary 테이블**:
```sql
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 테이블**:
```sql
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` 테이블 생성
1. **DB 테이블 생성**: `robeing_diary`, `activity_log` 테이블 생성 스크립트 작성
2. **활동 로그 기록**: 스킬 실행 시 `activity_log`에 자동 기록 로직 추가
3. **Diary Aggregator 구현**: 모든 데이터 소스 집계 로직 구현
4. **일기 생성 로직**: LLM으로 일기 텍스트 생성, `robeing_diary`에 저장
5. **API 엔드포인트**: rb8001에 `/api/diary/{date}` 추가 (마크다운 동적 생성)
6. **관리자 대시보드**: admin-dashboard에 일기 목록/상세 페이지 추가
7. **스케줄러 등록**: 매일 오전 2시 또는 3시에 전날 일기 생성
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.py` 생성, `/api/diary/{date}` 구현
7. **관리자 대시보드**: admin-dashboard에 일기 목록/상세 페이지 추가
8. **DOCS 동기화 스크립트**: 선택적으로 별도 스크립트로 DOCS 동기화
---