@startuml !theme mono title AI Service 내부 시퀀스 - 회의록개선 participant "ImproveController" as Controller participant "ImproveService" as Service participant "LLMClient" as LLM participant "PromptTemplateService" as Template participant "ImproveRepository" as Repo database "Azure OpenAI<>" as OpenAI database "PostgreSQL<>" as DB == 회의록 개선 요청 수신 == note over Controller API 요청: POST /api/ai/transcripts/{meetingId}/improve Body: { "promptType": "1PAGE_SUMMARY", "customPrompt": "optional" } end note Controller -> Service: improveTranscript(meetingId, promptType, customPrompt) activate Service == 원본 회의록 조회 == Service -> Repo: getOriginalTranscript(meetingId) activate Repo Repo -> DB: 원본 회의록 조회 activate DB DB --> Repo: 원본 회의록 내용 deactivate DB Repo --> Service: originalContent, version deactivate Repo == 프롬프트 템플릿 선택 == Service -> Template: getPromptTemplate(promptType) activate Template Template -> Template: 프롬프트 유형별 템플릿 선택 note right 지원 프롬프트 유형: 1. 1PAGE_SUMMARY - A4 1장 분량 요약 - 핵심 내용만 압축 2. CORE_SUMMARY - 3-5개 핵심 포인트 - 불릿 포인트 형식 3. DETAILED_REPORT - 시간순 상세 기록 - 타임스탬프 포함 4. DECISION_FOCUSED - 의사결정 중심 - 결정 사항과 근거 5. ACTION_FOCUSED - 액션 아이템 중심 - Todo와 담당자 강조 6. EXECUTIVE_REPORT - 경영진 보고용 - 간결하고 임팩트 있게 7. CUSTOM - 사용자 정의 프롬프트 end note Template --> Service: promptTemplate deactivate Template == 프롬프트 생성 == Service -> Service: 최종 프롬프트 구성 note right 시스템 프롬프트: - 역할: 회의록 개선 전문가 - 지시사항: {promptTemplate} 사용자 프롬프트: - 원본 회의록: {originalContent} - 개선 요구사항: {promptType} - 추가 지시사항: {customPrompt} 출력 형식 지정: - 구조화된 마크다운 - 적절한 헤딩과 섹션 - 가독성 최적화 end note == LLM 기반 회의록 재구성 == Service -> LLM: regenerateTranscript(prompt, originalContent) activate LLM LLM -> OpenAI: POST /chat/completions activate OpenAI note right 요청 파라미터: - model: gpt-4o - temperature: 0.3 - max_tokens: 3000 - messages: [system, user] end note OpenAI -> OpenAI: 회의록 재구성 note right 처리 단계: 1. 원본 분석 2. 프롬프트 의도 파악 3. 중요도 기반 필터링 4. 형식에 맞춰 재배치 5. 불필요한 내용 제거 6. 스타일 조정 - 문체 변환 - 길이 조정 7. 구조화 end note OpenAI --> LLM: 개선된 회의록 deactivate OpenAI LLM --> Service: improvedContent deactivate LLM == 개선된 회의록 저장 == Service -> Service: 새 버전 생성 note right 버전 정보: - base_version: 원본 버전 번호 - improvement_type: {promptType} - version: 새 버전 번호 end note Service -> Repo: saveImprovedTranscript(meetingId, improvedContent, metadata) activate Repo Repo -> DB: 개선된 회의록 저장 activate DB note right 저장 데이터: - meeting_id - content (개선된 내용) - version (새 버전) - base_version (원본 버전) - improvement_type - prompt_type - custom_prompt - created_at - status: IMPROVED end note DB --> Repo: newTranscriptId deactivate DB Repo --> Service: transcriptId, version deactivate Repo == 버전 연결 저장 == Service -> Repo: linkVersions(originalId, improvedId) activate Repo Repo -> DB: 버전 연결 정보 저장 activate DB note right 버전 연결 정보: - original_transcript_id - improved_transcript_id - improvement_type - created_at end note DB --> Repo: 연결 완료 deactivate DB Repo --> Service: 완료 deactivate Repo == 응답 반환 == Service -> Service: 응답 데이터 구성 note right 응답 데이터: - transcriptId (새 버전) - version - baseVersion - improvementType - content (개선된 내용) - originalLink - createdAt end note Service --> Controller: 개선 완료 응답 deactivate Service Controller --> Controller: 200 OK 응답 반환 note over Controller, DB 처리 시간: - 원본 조회: 100-200ms - 템플릿 선택: 10-50ms - LLM 재구성: 4-8초 - 저장 처리: 200-300ms 총 처리 시간: 약 5-9초 정책: - 원본 회의록은 항상 보존 - 여러 버전 동시 생성 가능 - 버전 간 비교 기능 제공 end note @enduml