@startuml !theme mono title AI Service 내부 시퀀스 - 회의록자동작성 participant "TranscriptController" as Controller participant "TranscriptService" as Service 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 이벤트 수신 (meetingId, transcriptText, timestamp) end note Controller -> Service: processTranscript(meetingId, transcriptText, timestamp) activate Service Service -> Service: 회의 맥락 정보 조회 준비 note right 회의 제목, 참석자 정보, 이전 회의록 내용 end note == 병렬 처리: 맥락 정보 수집 == par "회의 정보 조회" Service -> Repo: getMeetingContext(meetingId) activate Repo Repo -> DB: SELECT meeting_info, participants activate DB DB --> Repo: 회의 정보 반환 deactivate DB Repo --> Service: 회의 맥락 정보 deactivate Repo else Service -> Repo: getPreviousTranscripts(meetingId) activate Repo Repo -> DB: SELECT previous_content activate DB DB --> Repo: 이전 회의록 deactivate DB Repo --> Service: 이전 내용 deactivate Repo end Service -> Service: 프롬프트 생성 note right 시스템 프롬프트: - 역할: 회의록 작성 전문가 - 지시사항: 구어체→문어체 변환, 주제별 분류, 발언자별 정리 사용자 프롬프트: - 회의 제목: {title} - 참석자: {participants} - 이전 내용: {previous} - 현재 발언: {transcriptText} end note == LLM 기반 회의록 작성 == Service -> LLM: generateMinutes(prompt, meetingContext) activate LLM LLM -> OpenAI: POST /chat/completions activate OpenAI note right 요청 파라미터: - model: gpt-4o - temperature: 0.3 - max_tokens: 2000 - messages: [system, user] end note OpenAI -> OpenAI: 텍스트 분석 및 정리 note right 1. 주제별 분류 2. 발언자별 의견 정리 3. 중요 키워드 추출 4. 구어체→문어체 변환 5. 문법 교정 end note OpenAI --> LLM: 정리된 회의록 내용 deactivate OpenAI LLM --> Service: 회의록 초안 deactivate LLM == 회의록 저장 == Service -> Service: 회의록 데이터 구조화 note right 구조화 항목: - 논의 주제 - 발언자별 의견 - 결정 사항 - 보류 사항 - 요약문 end note Service -> Repo: saveTranscriptDraft(meetingId, content, timestamp) activate Repo Repo -> DB: INSERT INTO ai_transcripts activate DB note right 저장 데이터: - meeting_id - content (JSON) - generated_at - version - 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 input: 회의록 내용 end note OpenAI --> Vector: 임베딩 벡터 deactivate OpenAI Vector -> VectorDB: INSERT embedding activate VectorDB note right vector_id: transcriptId embedding: [float array] metadata: {meetingId, timestamp} end note VectorDB --> Vector: 저장 완료 deactivate VectorDB Vector --> Service: 임베딩 생성 완료 deactivate Vector == TranscriptSummaryCreated 이벤트 발행 == Service -> Controller: 회의록 생성 완료 응답 deactivate Service Controller -> Controller: TranscriptSummaryCreated 이벤트 발행 note right 이벤트 데이터: - meetingId - transcriptId - content - generatedAt Partition Key: {meetingId} Consumer: Meeting Service end note note over Controller, DB 처리 시간: - 맥락 정보 조회: 100-200ms - LLM 생성: 3-5초 - 저장 처리: 100-200ms - 벡터 임베딩: 500ms-1초 (비동기) 총 처리 시간: 약 4-7초 end note @enduml