mirror of
https://github.com/hwanny1128/HGZero.git
synced 2025-12-06 09:06:24 +00:00
- 외부 시퀀스 설계 가이드 다운로드 (claude/sequence-outer-design.md) - 외부 시퀀스 설계 디렉토리 생성 (design/backend/sequence/) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
171 lines
4.4 KiB
Plaintext
171 lines
4.4 KiB
Plaintext
@startuml 회의시작및회의록작성
|
|
!theme mono
|
|
|
|
title 회의 시작 및 회의록 작성 플로우 (UFR-MEET-030, UFR-STT-010/020, UFR-AI-010, UFR-RAG-010/020, UFR-COLLAB-010)
|
|
|
|
actor "참석자" as User
|
|
participant "Frontend" as FE
|
|
participant "API Gateway" as GW
|
|
participant "Meeting Service" as MS
|
|
participant "STT Service" as STT
|
|
participant "AI Service" as AI
|
|
participant "RAG Service" as RAG
|
|
participant "Collaboration Service" as CS
|
|
participant "Redis" as Cache
|
|
database "Meeting DB" as MDB
|
|
database "STT DB" as STTDB
|
|
database "AI DB" as AIDB
|
|
database "RAG DB" as RAGDB
|
|
queue "RabbitMQ" as MQ
|
|
participant "Azure Speech" as Azure
|
|
participant "LLM Server" as LLM
|
|
|
|
== 회의 시작 ==
|
|
User -> FE: 회의 시작 버튼 클릭
|
|
activate FE
|
|
|
|
FE -> GW: POST /api/meetings/{meetingId}/start
|
|
activate GW
|
|
|
|
GW -> MS: 회의 시작 요청
|
|
activate MS
|
|
|
|
MS -> MDB: UPDATE meetings\nSET start_time = NOW(), status = 'in_progress'\n세션 생성
|
|
activate MDB
|
|
MDB --> MS: 회의 시작 시간 기록 완료
|
|
deactivate MDB
|
|
|
|
MS ->> MQ: MeetingStarted 이벤트 발행\n{meetingId, sessionId, startTime}
|
|
activate MQ
|
|
note right of MQ
|
|
이벤트: MeetingStarted
|
|
Routing Key: meeting.started
|
|
end note
|
|
MQ -->> MS: ACK
|
|
deactivate MQ
|
|
|
|
MS --> GW: 200 OK\n{sessionId, status: "in_progress"}
|
|
deactivate MS
|
|
|
|
GW --> FE: 회의 세션 정보 반환
|
|
deactivate GW
|
|
|
|
FE --> User: 회의 진행 화면 표시
|
|
deactivate FE
|
|
|
|
== 음성 녹음 시작 (비동기) ==
|
|
MQ ->> STT: MeetingStarted 이벤트 전달
|
|
activate STT
|
|
note right of STT
|
|
구독: meeting.started
|
|
큐: stt.meeting.started
|
|
end note
|
|
|
|
STT -> STTDB: INSERT INTO sessions\n(세션 생성)
|
|
activate STTDB
|
|
STTDB --> STT: 세션 ID 반환
|
|
deactivate STTDB
|
|
|
|
STT -> STT: 음성 녹음 시작\n(실시간 스트림)
|
|
STT -->> MQ: ACK
|
|
deactivate STT
|
|
|
|
== 실시간 음성 인식 (5초 간격 반복) ==
|
|
loop 발언 발생 (5초마다)
|
|
User -> FE: 음성 발언
|
|
activate FE
|
|
|
|
FE -> STT: 오디오 스트림 전송
|
|
activate STT
|
|
|
|
STT -> Azure: 음성-텍스트 변환 요청\n(실시간 스트림)
|
|
activate Azure
|
|
Azure --> STT: 변환된 텍스트 반환\n{speaker, text, timestamp}
|
|
deactivate Azure
|
|
|
|
STT -> STTDB: INSERT INTO transcripts\n(발언 텍스트 저장)
|
|
activate STTDB
|
|
STTDB --> STT: OK
|
|
deactivate STTDB
|
|
|
|
STT ->> MQ: TranscriptReady 이벤트 발행\n{sessionId, speaker, text, timestamp}
|
|
activate MQ
|
|
note right of MQ
|
|
이벤트: TranscriptReady
|
|
Routing Key: transcript.ready
|
|
주기: 5초
|
|
end note
|
|
MQ -->> STT: ACK
|
|
deactivate MQ
|
|
deactivate STT
|
|
|
|
== AI 회의록 자동 작성 (비동기) ==
|
|
MQ ->> AI: TranscriptReady 이벤트 전달
|
|
activate AI
|
|
note right of AI
|
|
구독: transcript.ready
|
|
큐: ai.transcript.ready
|
|
end note
|
|
|
|
AI -> AI: 회의 맥락 이해\n주제별 분류\n문장 다듬기
|
|
AI -> LLM: 회의록 자동 작성 요청\n{context, transcript, history}
|
|
activate LLM
|
|
LLM --> AI: 회의록 초안 반환\n{summary, topics, keyPoints}
|
|
deactivate LLM
|
|
|
|
AI -> AIDB: INSERT INTO minutes_draft\n(회의록 초안 저장)
|
|
activate AIDB
|
|
AIDB --> AI: OK
|
|
deactivate AIDB
|
|
|
|
AI -> CS: 실시간 동기화 요청\n{delta, version}
|
|
activate CS
|
|
|
|
CS -> FE: WebSocket 푸시\n(회의록 델타 전송)
|
|
activate FE
|
|
FE -> User: 회의록 실시간 업데이트 표시
|
|
deactivate FE
|
|
|
|
CS --> AI: 동기화 완료
|
|
deactivate CS
|
|
|
|
AI -->> MQ: ACK
|
|
deactivate AI
|
|
|
|
== 전문용어 자동 감지 및 설명 (비동기) ==
|
|
MQ ->> RAG: TranscriptReady 이벤트 전달
|
|
activate RAG
|
|
note right of RAG
|
|
구독: transcript.ready
|
|
큐: rag.transcript.ready
|
|
end note
|
|
|
|
RAG -> RAG: 전문용어 자동 감지\n(NER, 도메인 사전)
|
|
RAG -> RAGDB: SELECT explanation\nFROM terms\nWHERE term IN (detected_terms)
|
|
activate RAGDB
|
|
RAGDB --> RAG: 용어 설명 반환
|
|
deactivate RAGDB
|
|
|
|
alt 맥락 기반 설명 필요
|
|
RAG -> LLM: 맥락 기반 설명 생성 요청\n{term, context, domain}
|
|
activate LLM
|
|
LLM --> RAG: 맥락적 설명 반환
|
|
deactivate LLM
|
|
|
|
RAG -> RAGDB: INSERT INTO explanations\n(생성된 설명 저장)
|
|
activate RAGDB
|
|
RAGDB --> RAG: OK
|
|
deactivate RAGDB
|
|
end
|
|
|
|
RAG -> FE: WebSocket 푸시\n(용어 설명 툴팁 데이터)
|
|
activate FE
|
|
FE -> User: 용어 설명 툴팁 표시
|
|
deactivate FE
|
|
|
|
RAG -->> MQ: ACK
|
|
deactivate RAG
|
|
end
|
|
|
|
@enduml
|