@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 이벤트 수신 end note Controller -> Service: processTranscript(meetingId, transcriptText) activate Service Service -> Service: 회의 맥락 정보 조회 준비 == 병렬 처리: 맥락 정보 수집 == par 회의 정보 조회 Service -> Repo: getMeetingContext(meetingId) activate Repo Repo -> DB: SELECT meeting_info 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 시스템 프롬프트 생성 - 역할 정의 - 변환 규칙 적용 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: INSERT INTO ai_transcripts 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 -> Controller: 회의록 생성 완료 응답 deactivate Service Controller -> Controller: TranscriptSummaryCreated 발행 note right 이벤트 데이터: - meetingId - transcriptId - content end note note over Controller, DB 처리 시간: - 맥락 조회: 100-200ms - LLM 생성: 3-5초 - 저장: 100-200ms - 벡터화: 500ms-1초 총: 약 4-7초 end note @enduml