mirror of
https://github.com/hwanny1128/HGZero.git
synced 2026-06-13 17:39:09 +00:00
내부 시퀀스 설계 완료
- 총 21개 PlantUML 파일 생성 (Meeting 10개, AI 6개, STT 2개, Notification 3개) - 서브 에이전트를 활용한 병렬 설계로 효율성 극대화 - 모든 시나리오는 유저스토리 및 외부 시퀀스와 1:1 매칭 - Controller → Service → Repository 계층 구조 명확히 표현 - Redis Cache, Azure Event Hubs 등 인프라 컴포넌트 표시 - 동기(→)/비동기(-->) 구분 명확 - 외부 참여자 <<E>> 표시 적용 - PlantUML 문법 검사 및 오류 수정 완료 (13개 파일 수정) - par/and 블록 문법 오류 수정 - return 형식 적용으로 참여자 없는 화살표 오류 해결 설계 특징: - 캐시 전략: Cache-Aside 패턴, TTL 관리, 즉시 무효화 - 비동기 처리: Azure Event Hubs 기반 이벤트 구독 - 실시간 협업: WebSocket 기반 동기화, 변경 델타 전송 - 데이터 일관성: 버전 관리, 양방향 연결, 트랜잭션 처리 추가 파일: - claude/sequence-inner-design.md: 내부시퀀스설계 가이드 - tools/check-plantuml.ps1: PlantUML 문법 검사 스크립트 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,185 @@
|
||||
@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<<E>>" as OpenAI
|
||||
database "Vector DB<<E>>" as VectorDB
|
||||
database "PostgreSQL<<E>>" 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
|
||||
and "이전 내용 조회"
|
||||
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
|
||||
Reference in New Issue
Block a user