310 lines
10 KiB
Plaintext
310 lines
10 KiB
Plaintext
!theme mono
|
|
|
|
skinparam classAttributeIconSize 0
|
|
skinparam classFontSize 12
|
|
skinparam classAttributeFontSize 11
|
|
|
|
title HealthSync 역설계 - Intelligence Service 데이터 설계서
|
|
|
|
package "Intelligence Service Database Schema" as intelligence_db #lightseagreen {
|
|
|
|
entity "chat_sessions" as chat_session {
|
|
* session_id : VARCHAR(50) <<PK>>
|
|
--
|
|
* user_id : VARCHAR(50)
|
|
* status : VARCHAR(20)
|
|
* created_at : TIMESTAMP
|
|
* last_activity_at : TIMESTAMP
|
|
* message_count : INTEGER
|
|
* context : TEXT
|
|
* session_type : VARCHAR(30)
|
|
* expires_at : TIMESTAMP
|
|
--
|
|
+ 인덱스: idx_user_id_status
|
|
+ 인덱스: idx_last_activity
|
|
+ 인덱스: idx_expires_at
|
|
}
|
|
|
|
entity "chat_messages" as chat_message {
|
|
* message_id : VARCHAR(50) <<PK>>
|
|
--
|
|
* session_id : VARCHAR(50) <<FK>>
|
|
* role : VARCHAR(20)
|
|
* content : TEXT
|
|
* timestamp : TIMESTAMP
|
|
* message_order : INTEGER
|
|
* is_sensitive : BOOLEAN
|
|
* token_count : INTEGER
|
|
* response_time_ms : INTEGER
|
|
--
|
|
+ 인덱스: idx_session_order
|
|
+ 인덱스: idx_timestamp
|
|
+ 인덱스: idx_role
|
|
}
|
|
|
|
entity "analysis_results" as analysis_result {
|
|
* id : BIGINT <<PK>>
|
|
--
|
|
* user_id : VARCHAR(50)
|
|
* analysis_type : VARCHAR(50)
|
|
* result : TEXT
|
|
* confidence : DECIMAL(5,4)
|
|
* created_at : TIMESTAMP
|
|
* metadata : JSON
|
|
* source_data_hash : VARCHAR(64)
|
|
* claude_model_version : VARCHAR(20)
|
|
* processing_time_ms : INTEGER
|
|
--
|
|
+ 인덱스: idx_user_analysis_type
|
|
+ 인덱스: idx_created_at
|
|
+ 인덱스: idx_confidence
|
|
+ 인덱스: idx_source_hash
|
|
}
|
|
|
|
entity "notification_logs" as notification_log {
|
|
* id : BIGINT <<PK>>
|
|
--
|
|
* user_id : VARCHAR(50)
|
|
* mission_id : VARCHAR(50)
|
|
* notification_type : VARCHAR(30)
|
|
* message : TEXT
|
|
* sent_at : TIMESTAMP
|
|
* delivery_status : VARCHAR(20)
|
|
* response_generated_by : VARCHAR(20)
|
|
* processing_time_ms : INTEGER
|
|
* user_reaction : VARCHAR(20)
|
|
* effectiveness_score : DECIMAL(3,2)
|
|
--
|
|
+ 인덱스: idx_user_id_type
|
|
+ 인덱스: idx_sent_at
|
|
+ 인덱스: idx_delivery_status
|
|
+ 인덱스: idx_effectiveness
|
|
}
|
|
|
|
entity "claude_api_usage" as claude_api_usage {
|
|
* id : BIGINT <<PK>>
|
|
--
|
|
* request_id : VARCHAR(50)
|
|
* user_id : VARCHAR(50)
|
|
* api_endpoint : VARCHAR(100)
|
|
* request_type : VARCHAR(50)
|
|
* input_tokens : INTEGER
|
|
* output_tokens : INTEGER
|
|
* cost_usd : DECIMAL(10,6)
|
|
* response_time_ms : INTEGER
|
|
* success : BOOLEAN
|
|
* error_message : TEXT
|
|
* created_at : TIMESTAMP
|
|
--
|
|
+ 인덱스: idx_user_id_date
|
|
+ 인덱스: idx_request_type
|
|
+ 인덱스: idx_success
|
|
+ 인덱스: idx_cost
|
|
}
|
|
|
|
note right of chat_session
|
|
**AI 채팅 세션 관리**
|
|
• 사용자별 대화 컨텍스트 유지
|
|
• 세션별 상태 관리 (활성/비활성/만료)
|
|
• 컨텍스트 정보로 개인화 대화
|
|
• 자동 만료 기능 (24시간)
|
|
end note
|
|
|
|
note right of chat_message
|
|
**채팅 메시지 저장**
|
|
• 사용자와 AI 간 모든 대화 기록
|
|
• 메시지 순서 보장
|
|
• 민감정보 플래그 관리
|
|
• Claude API 토큰 사용량 추적
|
|
end note
|
|
|
|
note right of analysis_result
|
|
**AI 분석 결과 저장**
|
|
• 건강 진단, 미션 추천 등 분석 결과
|
|
• 신뢰도 점수로 품질 관리
|
|
• 소스 데이터 해시로 중복 방지
|
|
• Claude 모델 버전별 성능 추적
|
|
end note
|
|
|
|
note right of notification_log
|
|
**알림 발송 이력**
|
|
• 축하, 독려 메시지 발송 기록
|
|
• 사용자 반응 및 효과성 측정
|
|
• 개인화 알림 성능 분석
|
|
• A/B 테스트 결과 수집
|
|
end note
|
|
|
|
note right of claude_api_usage
|
|
**Claude API 사용량 추적**
|
|
• API 호출별 비용 및 성능 모니터링
|
|
• 토큰 사용량 기반 과금 관리
|
|
• 에러 발생 패턴 분석
|
|
• 사용자별 API 사용 통계
|
|
end note
|
|
}
|
|
|
|
package "관계 정의" as relationships {
|
|
chat_session ||--o{ chat_message : session_id
|
|
chat_session }o--|| analysis_result : 분석_요청
|
|
notification_log }o--|| analysis_result : 알림_생성
|
|
claude_api_usage }o--|| analysis_result : API_호출
|
|
claude_api_usage }o--|| chat_message : API_호출
|
|
|
|
note as n1
|
|
**외래키 관계**
|
|
chat_messages.session_id → chat_sessions.session_id
|
|
|
|
**논리적 관계**
|
|
• User Service users ↔ chat_sessions (사용자별 채팅)
|
|
• Goal Service missions ↔ notification_logs (미션별 알림)
|
|
• Health Service checkups ↔ analysis_results (건강 분석)
|
|
|
|
**참조 무결성**
|
|
• CASCADE 삭제 (세션 삭제 시 메시지도 삭제)
|
|
• 사용자 ID는 User Service와 일관성 유지
|
|
• 미션 ID는 Goal Service와 연동
|
|
|
|
**데이터 일관성**
|
|
• 세션별 메시지 순서 보장
|
|
• API 사용량과 실제 호출 일치
|
|
• 알림 발송 성공/실패 상태 추적
|
|
end note
|
|
}
|
|
|
|
package "데이터 타입 및 제약조건" as constraints {
|
|
note as n2
|
|
**chat_sessions 제약조건**
|
|
• session_id: UUID 형태, PRIMARY KEY
|
|
• user_id: User Service와 일치, NOT NULL
|
|
• status: 'ACTIVE', 'INACTIVE', 'EXPIRED', 'TERMINATED'
|
|
• session_type: 'HEALTH_CONSULTATION', 'GENERAL_CHAT', 'MISSION_GUIDANCE'
|
|
• message_count: 0 이상, 최대 100개 메시지
|
|
• expires_at: created_at + 24시간
|
|
|
|
**chat_messages 제약조건**
|
|
• message_id: UUID 형태, PRIMARY KEY
|
|
• role: 'USER', 'ASSISTANT', 'SYSTEM'
|
|
• content: 최대 10,000자
|
|
• message_order: 세션 내 순차 증가
|
|
• token_count: 0 이상
|
|
• response_time_ms: 0 이상
|
|
|
|
**analysis_results 제약조건**
|
|
• analysis_type: 'HEALTH_DIAGNOSIS', 'MISSION_RECOMMENDATION', 'RISK_ASSESSMENT'
|
|
• confidence: 0.0000~1.0000 범위
|
|
• result: 최대 50,000자
|
|
• source_data_hash: SHA-256 해시값
|
|
• claude_model_version: 'claude-3-sonnet', 'claude-3-opus' 등
|
|
|
|
**notification_logs 제약조건**
|
|
• notification_type: 'CELEBRATION', 'ENCOURAGEMENT', 'REMINDER', 'ACHIEVEMENT'
|
|
• delivery_status: 'SENT', 'DELIVERED', 'FAILED', 'PENDING'
|
|
• response_generated_by: 'CLAUDE_AI', 'TEMPLATE', 'FALLBACK'
|
|
• user_reaction: 'POSITIVE', 'NEGATIVE', 'NEUTRAL', 'NO_RESPONSE'
|
|
• effectiveness_score: 0.00~5.00 범위
|
|
|
|
**claude_api_usage 제약조건**
|
|
• request_type: 'CHAT', 'ANALYSIS', 'RECOMMENDATION', 'NOTIFICATION'
|
|
• input_tokens: 0 이상
|
|
• output_tokens: 0 이상
|
|
• cost_usd: 0.000001 이상 (최소 과금 단위)
|
|
• success: 성공/실패 여부
|
|
end note
|
|
}
|
|
|
|
package "AI 모델 및 프롬프트 관리" as ai_models {
|
|
note as n3
|
|
**Claude AI 모델별 특성**
|
|
|
|
**claude-3-sonnet (기본 모델)**
|
|
• 건강 상담 및 일반 채팅
|
|
• 비용 효율적, 응답 속도 빠름
|
|
• 토큰당 비용: $0.003 (input), $0.015 (output)
|
|
|
|
**claude-3-opus (고급 모델)**
|
|
• 복잡한 건강 분석 및 진단
|
|
• 높은 정확도, 상세한 분석
|
|
• 토큰당 비용: $0.015 (input), $0.075 (output)
|
|
|
|
**프롬프트 최적화**
|
|
• 건강 상담: 의료진 톤앤매너 적용
|
|
• 미션 추천: 개인화 요소 강조
|
|
• 독려 메시지: 동기부여 심리학 적용
|
|
• 축하 메시지: 긍정적 감정 표현
|
|
|
|
**컨텍스트 관리**
|
|
• 최근 10개 메시지 유지
|
|
• 사용자 프로필 정보 포함
|
|
• 건강 상태 요약 정보 제공
|
|
• 이전 분석 결과 참조
|
|
end note
|
|
}
|
|
|
|
package "성능 및 운영 고려사항" as performance {
|
|
note as n4
|
|
**인덱스 전략**
|
|
• chat_sessions: (user_id, status) 복합 인덱스
|
|
• chat_messages: (session_id, message_order) 복합 인덱스
|
|
• analysis_results: (user_id, analysis_type, created_at) 복합 인덱스
|
|
• notification_logs: (user_id, sent_at) 복합 인덱스
|
|
• claude_api_usage: (user_id, DATE(created_at)) 복합 인덱스
|
|
|
|
**파티셔닝**
|
|
• chat_messages: created_at 기준 월별 파티셔닝
|
|
• claude_api_usage: created_at 기준 월별 파티셔닝
|
|
• notification_logs: sent_at 기준 월별 파티셔닝
|
|
|
|
**캐싱 전략**
|
|
• 활성 채팅 세션: Redis 캐싱 (30분)
|
|
• 최근 분석 결과: Redis 캐싱 (1시간)
|
|
• Claude API 응답: Redis 캐싱 (10분)
|
|
• 자주 사용되는 프롬프트: Redis 캐싱 (24시간)
|
|
|
|
**비용 최적화**
|
|
• 중복 분석 요청 캐싱으로 API 호출 최소화
|
|
• 토큰 사용량 모니터링 및 알림
|
|
• 모델별 비용 효율성 분석
|
|
• 배치 처리로 API 호출 효율화
|
|
|
|
**모니터링 지표**
|
|
• 일일 Claude API 비용
|
|
• 평균 응답 시간
|
|
• API 성공률
|
|
• 사용자별 토큰 사용량
|
|
• 분석 결과 신뢰도 분포
|
|
end note
|
|
}
|
|
|
|
package "데이터 보안 및 개인정보 보호" as security {
|
|
note as n5
|
|
**개인정보 보호**
|
|
• 채팅 내용 중 민감정보 자동 마스킹
|
|
• 의료 정보 포함 메시지 암호화 저장
|
|
• 사용자 식별 정보와 채팅 내용 분리
|
|
• 90일 경과 채팅 기록 자동 삭제
|
|
|
|
**AI 윤리 및 안전**
|
|
• 의료 조언 범위 제한 명시
|
|
• 응급 상황 감지 시 안내 메시지
|
|
• 편향성 방지를 위한 프롬프트 검증
|
|
• 부적절한 응답 필터링
|
|
|
|
**API 보안**
|
|
• Claude API 키 암호화 저장
|
|
• API 호출 시 Rate Limiting 적용
|
|
• 요청/응답 내용 로깅 (개인정보 제외)
|
|
• 이상 사용 패턴 모니터링
|
|
|
|
**감사 및 추적**
|
|
• 모든 AI 분석 결과 이력 보관
|
|
• 의료 관련 분석 시 추가 검증
|
|
• 사용자 신고 시 조치 이력 관리
|
|
• 정기적인 AI 응답 품질 검토
|
|
|
|
**규정 준수**
|
|
• 의료기기법 비대상 확인
|
|
• 개인정보보호법 준수
|
|
• AI 윤리 가이드라인 적용
|
|
• 의료 광고 규제 준수
|
|
end note
|
|
} |