@startuml !theme mono title AI Service 내부 시퀀스 - 회의록자동작성 (실시간 추천 포함) participant "TranscriptController" as Controller participant "TranscriptService" as Service participant "SuggestionService" as SuggestService participant "LLMClient" as LLM participant "VectorService" as Vector participant "TranscriptRepository" as Repo database "Azure OpenAI" as OpenAI <> database "Vector DB" as VectorDB <> database "PostgreSQL" as DB <> == TranscriptReady 이벤트 수신 == note over Controller Azure Event Hubs로부터 TranscriptReady 이벤트 수신 end note Controller -> Service: processTranscript(meetingId, transcriptText) activate Service Service -> Service: 회의 맥락 정보 조회 준비 == 병렬 처리: 맥락 정보 수집 == par 회의 정보 조회 Service -> Repo: getMeetingContext(meetingId) activate Repo Repo -> DB: 회의 맥락 정보 조회 activate DB DB --> Repo: 회의 정보 반환 deactivate DB Repo --> Service: 회의 맥락 정보 deactivate Repo else 이전 내용 조회 Service -> Repo: getPreviousTranscripts(meetingId) activate Repo Repo -> DB: 이전 회의록 내용 조회 activate DB DB --> Repo: 이전 회의록 deactivate DB Repo --> Service: 이전 내용 deactivate Repo end Service -> Service: 프롬프트 생성 note right 시스템 프롬프트 생성 - 역할 정의 - 변환 규칙 적용 end note == LLM 기반 회의록 작성 == Service -> LLM: generateMinutes(prompt, context) activate LLM LLM -> OpenAI: POST /chat/completions activate OpenAI note right model: gpt-4o temperature: 0.3 max_tokens: 2000 end note OpenAI -> OpenAI: 텍스트 분석 및 정리 OpenAI --> LLM: 정리된 회의록 내용 deactivate OpenAI LLM --> Service: 회의록 초안 deactivate LLM == 회의록 저장 == Service -> Service: 회의록 데이터 구조화 Service -> Repo: saveTranscriptDraft(meetingId, content) activate Repo Repo -> DB: AI 회의록 초안 저장 (상태: DRAFT) activate DB note right 저장 데이터: - meeting_id - content (JSON) - status: DRAFT end note DB --> Repo: 저장 완료 deactivate DB Repo --> Service: transcriptId deactivate Repo == 벡터 임베딩 생성 == Service -> Vector: createEmbedding(transcriptId, content) activate Vector Vector -> OpenAI: POST /embeddings activate OpenAI note right model: text-embedding-3-large end note OpenAI --> Vector: 임베딩 벡터 deactivate OpenAI Vector -> VectorDB: INSERT embedding activate VectorDB VectorDB --> Vector: 저장 완료 deactivate VectorDB Vector --> Service: 임베딩 생성 완료 deactivate Vector == 실시간 추천 병렬 처리 == Service -> SuggestService: generateRealtimeSuggestions(meetingId, transcriptText) activate SuggestService par 논의사항 제안 생성 SuggestService -> LLM: suggestDiscussionTopics(meetingId, transcript) activate LLM LLM -> OpenAI: POST /chat/completions activate OpenAI note right 프롬프트: - 현재 대화 맥락 분석 - 빠진 논의 항목 찾기 - 추가하면 좋을 주제 제안 응답 형식: { "suggestions": [ { "topic": "논의 주제", "reason": "제안 이유", "priority": "HIGH|MEDIUM|LOW" } ] } end note OpenAI --> LLM: 논의사항 제안 목록 deactivate OpenAI LLM --> SuggestService: discussionSuggestions deactivate LLM SuggestService -> Repo: saveSuggestions(meetingId, "DISCUSSION", suggestions) activate Repo Repo -> DB: INSERT INTO ai_suggestions activate DB DB --> Repo: 저장 완료 deactivate DB deactivate Repo else 결정사항 제안 생성 SuggestService -> LLM: suggestDecisions(meetingId, transcript) activate LLM LLM -> OpenAI: POST /chat/completions activate OpenAI note right 프롬프트: - "~하기로 함" 패턴 감지 - "~로 결정" 패턴 감지 - 결정 내용 구조화 응답 형식: { "decisions": [ { "content": "결정 내용", "category": "기술|일정|리소스", "confidence": 0.0-1.0 } ] } end note OpenAI --> LLM: 결정사항 제안 목록 deactivate OpenAI LLM --> SuggestService: decisionSuggestions deactivate LLM SuggestService -> Repo: saveSuggestions(meetingId, "DECISION", suggestions) activate Repo Repo -> DB: INSERT INTO ai_suggestions activate DB DB --> Repo: 저장 완료 deactivate DB deactivate Repo end SuggestService --> Service: 모든 추천사항 생성 완료 deactivate SuggestService == 이벤트 발행 == Service -> Controller: 회의록 및 추천사항 생성 완료 응답 deactivate Service Controller -> Controller: TranscriptSummaryCreated 발행 note right 이벤트 데이터: - meetingId - transcriptId - content - suggestions: * discussionTopics: [] * decisions: [] end note note over Controller, DB AI 제안 병합 프로세스: 1. 자동 병합 (Auto-merge): - confidence >= 0.8인 결정사항 → 회의록 "결정사항" 섹션에 자동 추가 - priority: HIGH인 논의사항 → "추가 논의 필요" 섹션에 자동 반영 2. 사용자 검토 (User Review): - 0.5 <= confidence < 0.8 → 제안 목록에 표시, 사용자 승인 대기 - priority: MEDIUM/LOW → 선택적 반영 가능 3. 병합 시점: - 실시간: 회의 진행 중 자동 반영 - 최종: 회의록 확정 전 사용자 최종 검토 4. 병합 이력: - 제안 ID, 병합 여부, 승인자, 시각 기록 - 감사 추적(Audit Trail) 유지 end note note over Controller, DB 처리 시간: - 맥락 조회: 100-200ms - LLM 회의록 생성: 3-5초 - 저장: 100-200ms - 벡터화: 500ms-1초 - 실시간 추천 병렬 처리: 4-6초 * 논의사항 제안: 2-3초 * 결정사항 제안: 2-3초 총: 약 8-13초 end note @enduml