Todo 실시간 추출 기능 삭제

This commit is contained in:
hjmoons 2025-10-22 17:44:32 +09:00
parent 038fa40c2d
commit 27dc6433bd
3 changed files with 5 additions and 329 deletions

View File

@ -1,274 +0,0 @@
@startuml
!theme mono
title AI Service 내부 시퀀스 - 실시간Todo추출
participant "SuggestionController" as Controller
participant "RealtimeTodoService" as Service
participant "LLMClient" as LLM
participant "TranscriptRepository" as TranscriptRepo
database "Azure OpenAI<<E>>" as OpenAI
database "Redis Cache<<E>>" as Cache
database "PostgreSQL<<E>>" as DB
== 실시간 액션아이템 추출 요청 ==
note over Controller
TranscriptService로부터 호출
(회의록 자동작성 프로세스 내부)
end note
Controller -> Service: extractRealtimeActionItems(meetingId, transcriptText)
activate Service
== 회의 맥락 및 참석자 정보 조회 ==
Service -> TranscriptRepo: getMeetingContext(meetingId)
activate TranscriptRepo
TranscriptRepo -> DB: SELECT meeting_info, participants, roles\nFROM meeting_context
activate DB
DB --> TranscriptRepo: 회의 및 참석자 정보
deactivate DB
TranscriptRepo --> Service: meetingContext
deactivate TranscriptRepo
Service -> Cache: GET action-items:{meetingId}
activate Cache
note right
이전에 추출한 액션아이템 조회
(중복 제거용)
end note
Cache --> Service: previousActionItems
deactivate Cache
== LLM 기반 액션아이템 패턴 감지 ==
Service -> Service: 액션아이템 추출 프롬프트 생성
note right
시스템 프롬프트:
- 역할: 액션아이템 추출 전문가
- 목표: 실시간으로 Todo 발생 감지
액션아이템 패턴 예시:
- "제가 ~하겠습니다"
- "~까지 완료하겠습니다"
- "~을 담당하겠습니다"
- "~을 해보겠습니다"
- "~를 처리하겠습니다"
- "[이름]님, ~해주시겠어요?"
- "~하기로 했습니다" (결정 + 액션)
사용자 프롬프트:
- 회의 참석자: {participants}
- 이미 추출된 Todo: {previousActionItems}
- 현재 대화 내용: {transcriptText}
지시사항:
- 위 패턴이 포함된 문장 찾기
- Todo 내용 명확화
- 담당자 식별 (발언자 또는 지정된 사람)
- 마감일 추출 (명시적 또는 추정)
- 우선순위 판단
- 신뢰도 점수 계산
응답 형식:
{
"actionItems": [
{
"content": "할 일 내용",
"assignee": "담당자 이름",
"dueDate": "YYYY-MM-DD" or null,
"priority": "HIGH|MEDIUM|LOW",
"confidence": 0.0-1.0,
"extractedFrom": "원문 발췌",
"relatedDecision": "관련 결정사항 ID"
}
]
}
end note
Service -> LLM: detectActionItemPatterns(prompt)
activate LLM
LLM -> OpenAI: POST /chat/completions
activate OpenAI
note right
요청 파라미터:
- model: gpt-4o
- temperature: 0.2
(정확한 추출 위해 낮은 값)
- response_format: json_object
- max_tokens: 1500
end note
OpenAI -> OpenAI: 대화 텍스트 분석
note right
처리 단계:
1. 문장별로 액션아이템 패턴 검사
2. "하겠습니다" 등 키워드 탐지
3. 할 일 내용 추출 및 명확화
- 동사로 시작하도록 정리
- 구체적인 작업으로 변환
4. 담당자 식별
- 발언자 자신이 하는 경우
- 다른 사람을 지정한 경우
5. 마감일 추출
- 명시적: "내일까지", "이번 주 금요일"
- 암묵적: "빨리", "다음 회의 전"
- 없으면 null
6. 우선순위 판단
- HIGH: 긴급, 중요, 블로커
- MEDIUM: 중요하지만 여유 있음
- LOW: 추가 작업, 선택적
7. 신뢰도 계산
- 명확한 약속: 0.9-1.0
- 추정 약속: 0.7-0.9
- 암묵적 합의: 0.5-0.7
end note
OpenAI --> LLM: 액션아이템 후보 목록 (JSON)
deactivate OpenAI
LLM --> Service: actionItemSuggestions
deactivate LLM
== 제안 검증 및 필터링 ==
Service -> Service: 액션아이템 검증
note right
검증 기준:
- 신뢰도 70% 이상만 선택
- 중복 제거
* 이미 추출된 것과 비교
* 유사도 90% 이상이면 제외
- 담당자 검증
* 참석자 목록에 있는지 확인
* 없으면 "미지정"으로 표시
- 내용 명확성 검증
* 동사가 있는지
* 구체적인 작업인지
- 마감일 형식 검증
- 우선순위별 정렬
end note
loop 각 제안마다
Service -> Service: 제안 메타데이터 보강
note right
추가 정보:
- 생성 시각
- 회의 진행 시점 (분)
- 원문 위치 정보
- 고유 ID (UUID)
end note
end
== 임시 캐시 저장 (선택적) ==
Service -> Cache: APPEND action-items:{meetingId}
activate Cache
note right
Redis에 임시 저장:
- Key: action-items:{meetingId}
- Value: JSON array (제안 목록)
- TTL: 2시간 (회의 시간)
- APPEND로 기존 목록에 추가
목적:
- 중복 감지용
- 재접속 시 복원용
end note
Cache --> Service: 저장 완료
deactivate Cache
== 응답 반환 ==
Service -> Service: 응답 데이터 구성
note right
프론트엔드 전달 형식:
{
"suggestions": [
{
"id": "suggestion-uuid",
"content": "할 일 내용",
"assignee": "김철수",
"dueDate": "2025-02-01",
"priority": "HIGH",
"confidence": 0.85,
"extractedFrom": "원문 발췌",
"relatedDecision": "decision-uuid"
}
],
"totalCount": 제안 개수,
"timestamp": "생성 시각"
}
end note
Service --> Controller: 액션아이템 제안 목록
deactivate Service
Controller --> Controller: 이벤트 데이터에 포함하여 반환
note right
TranscriptSummaryCreated 이벤트에
actionItemSuggestions 필드로 포함
프론트엔드 처리:
- 오른쪽 "추천" 탭의 "액션아이템" 섹션 표시
- "적용" 버튼 활성화
- 담당자별로 그룹화 표시
- 우선순위별 색상 코딩
- 마감일 표시 (없으면 "미정")
- 신뢰도 표시 (%)
end note
== 사용자가 제안 적용 시 ==
note over Controller
사용자가 "적용" 버튼 클릭 시:
프론트엔드에서 직접 Meeting Service 호출
POST /api/meetings/{meetingId}/todos
Body: {
"content": "할 일 내용",
"assignee": "김철수",
"dueDate": "2025-02-01",
"priority": "HIGH",
"relatedSection": "관련 회의록 섹션"
}
Meeting Service에서:
- Todo 생성
- TodoCreated 이벤트 발행
- 담당자에게 알림 발송
end note
note over Controller, DB
처리 시간:
- 맥락 조회: 100-200ms
- LLM 패턴 감지: 1-2초
- 검증 및 필터링: 100-200ms
- 캐시 저장: 50-100ms
총 처리 시간: 약 1.5-2.5초
특징:
- DB 영구 저장 없음 (임시 데이터)
- Redis 캐시만 활용
* 중복 감지용
* 재접속 복원용
- 프론트엔드 메모리에서 관리
- "적용" 시에만 Todo 생성
차이점 (회의 종료 후 Todo 추출과):
- 실시간: 5초마다 즉시 추출, 임시 제안
- 종료 후: 전체 회의록 기반 종합 추출, 자동 생성
- 실시간은 "후보"로 제시, 사용자 선택
- 종료 후는 "확정" 추출 후 자동 생성
end note
@enduml

View File

@ -201,45 +201,6 @@ else 결정사항 제안 생성
deactivate DB deactivate DB
deactivate Repo deactivate Repo
else 실시간 액션아이템 추출
SuggestService -> LLM: extractRealtimeActionItems(meetingId, transcript)
activate LLM
LLM -> OpenAI: POST /chat/completions
activate OpenAI
note right
프롬프트:
- "~까지 하겠습니다" 패턴 감지
- "제가 담당하겠습니다" 패턴 감지
- 담당자 및 마감일 추출
응답 형식:
{
"actionItems": [
{
"content": "할 일 내용",
"assignee": "담당자",
"dueDate": "YYYY-MM-DD",
"priority": "HIGH|MEDIUM|LOW"
}
]
}
end note
OpenAI --> LLM: 액션아이템 후보 목록
deactivate OpenAI
LLM --> SuggestService: actionItemSuggestions
deactivate LLM
SuggestService -> Repo: saveSuggestions(meetingId, "ACTION_ITEM", suggestions)
activate Repo
Repo -> DB: INSERT INTO ai_suggestions
activate DB
DB --> Repo: 저장 완료
deactivate DB
deactivate Repo
end end
SuggestService --> Service: 모든 추천사항 생성 완료 SuggestService --> Service: 모든 추천사항 생성 완료
@ -259,7 +220,6 @@ note right
- suggestions: - suggestions:
* discussionTopics: [] * discussionTopics: []
* decisions: [] * decisions: []
* actionItems: []
end note end note
note over Controller, DB note over Controller, DB
@ -268,11 +228,10 @@ note over Controller, DB
- LLM 회의록 생성: 3-5초 - LLM 회의록 생성: 3-5초
- 저장: 100-200ms - 저장: 100-200ms
- 벡터화: 500ms-1초 - 벡터화: 500ms-1초
- 실시간 추천 병렬 처리: 5-8 - 실시간 추천 병렬 처리: 4-6
* 논의사항 제안: 2-3초 * 논의사항 제안: 2-3초
* 결정사항 제안: 2-3초 * 결정사항 제안: 2-3초
* 액션아이템 추출: 1-2초 총: 약 8-13초
총: 약 9-15초
end note end note
@enduml @enduml

View File

@ -92,12 +92,6 @@ else 결정사항 제안
"~하기로 함", "~로 결정" 등의 "~하기로 함", "~로 결정" 등의
결정 패턴 감지 및 구조화 결정 패턴 감지 및 구조화
end note end note
else 실시간 액션아이템 추출
AI -> AI: [6] 실시간 액션아이템 추출 (LLM)
note right
"~까지 하겠습니다" 등
즉시 감지하여 Todo 후보 추출
end note
end end
AI -> AI: AI 분석 결과 저장 AI -> AI: AI 분석 결과 저장
@ -109,7 +103,6 @@ note right
- 전문용어 목록 - 전문용어 목록
- 논의사항 제안 목록 - 논의사항 제안 목록
- 결정사항 제안 목록 - 결정사항 제안 목록
- 액션아이템 후보 목록
end note end note
AI --> EventHub: AI 분석 완료 AI --> EventHub: AI 분석 완료
@ -134,7 +127,6 @@ note right
- 회의록 내용 - 회의록 내용
- 논의사항 제안 (오른쪽 탭) - 논의사항 제안 (오른쪽 탭)
- 결정사항 제안 (오른쪽 탭) - 결정사항 제안 (오른쪽 탭)
- 액션아이템 후보 (오른쪽 탭)
- 전문용어 하이라이트 - 전문용어 하이라이트
end note end note
@ -153,7 +145,7 @@ deactivate Frontend
User -> Frontend: 추천 항목 "적용" 버튼 클릭 User -> Frontend: 추천 항목 "적용" 버튼 클릭
activate Frontend activate Frontend
note right note right
논의사항/결정사항/액션아이템 논의사항/결정사항 중
원하는 항목 선택하여 적용 원하는 항목 선택하여 적용
end note end note
@ -185,13 +177,12 @@ end
note over User, EventHub note over User, EventHub
처리 시간: 처리 시간:
- STT 변환: 1-3초 - STT 변환: 1-3초
- AI 병렬 처리: 8-12 - AI 병렬 처리: 7-10
* 회의록 정리: 3-5초 * 회의록 정리: 3-5초
* 전문용어: 2-4초 * 전문용어: 2-4초
* 논의사항 제안: 2-3초 * 논의사항 제안: 2-3초
* 결정사항 제안: 2-3초 * 결정사항 제안: 2-3초
* 액션아이템 추출: 1-2초
- 회의록 저장: 1-2초 - 회의록 저장: 1-2초
- 총 처리 시간: 10-17 - 총 처리 시간: 9-15
end note end note
@enduml @enduml