섹션 AI 요약 재생성으로 변경 (프로토타입 반영)

- 프롬프트 기반 회의록 개선 → 섹션 AI 요약 재생성으로 변경
- UFR-AI-030 → UFR-AI-035로 유저스토리 교체
- API 엔드포인트: POST /sections/{sectionId}/regenerate-summary
- 내부 시퀀스, 외부 시퀀스, API 설계서, 유저스토리 일관성 확보
- 프로토타입의 "AI 재생성" 버튼 기능과 정확히 매칭

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Minseo-Jo
2025-10-23 13:46:59 +09:00
parent d3faf55657
commit b8ff2a8339
5 changed files with 200 additions and 258 deletions
@@ -1,106 +1,74 @@
@startuml
!theme mono
title AI Service 내부 시퀀스 - 회의록개선
title AI Service 내부 시퀀스 - 섹션AI요약재생성
participant "ImproveController" as Controller
participant "ImproveService" as Service
participant "SectionController" as Controller
participant "SectionSummaryService" as Service
participant "LLMClient" as LLM
participant "PromptTemplateService" as Template
participant "ImproveRepository" as Repo
participant "SectionRepository" as Repo
database "Azure OpenAI<<E>>" as OpenAI
database "PostgreSQL<<E>>" as DB
== 회의록 개선 요청 수신 ==
== 섹션 AI 요약 재생성 요청 수신 ==
note over Controller
API 요청:
POST /api/ai/transcripts/{meetingId}/improve
POST /api/ai/sections/{sectionId}/regenerate-summary
Body: {
"promptType": "1PAGE_SUMMARY",
"customPrompt": "optional"
"sectionContent": "**논의 사항:**\n- AI 기반...",
"meetingId": "550e8400-..."
}
end note
Controller -> Service: improveTranscript(meetingId, promptType, customPrompt)
Controller -> Service: regenerateSummary(sectionId, sectionContent, meetingId)
activate Service
== 원본 회의록 조회 ==
== 회의 맥락 조회 (선택적) ==
Service -> Repo: getOriginalTranscript(meetingId)
Service -> Repo: getMeetingContext(meetingId)
activate Repo
Repo -> DB: 원본 회의록 조회
Repo -> DB: 회의 정보 조회\n- 회의 제목\n- 참석자\n- 안건
activate DB
DB --> Repo: 원본 회의록 내용
DB --> Repo: 회의 맥락 정보
deactivate DB
Repo --> Service: originalContent, version
Repo --> Service: meetingContext
deactivate Repo
== 프롬프트 템플릿 선택 ==
note right of Service
회의 맥락을 통해
더 정확한 요약 생성
Service -> Template: getPromptTemplate(promptType)
activate Template
Template -> Template: 프롬프트 유형별 템플릿 선택
note right
지원 프롬프트 유형:
1. 1PAGE_SUMMARY
- A4 1장 분량 요약
- 핵심 내용만 압축
2. CORE_SUMMARY
- 3-5개 핵심 포인트
- 불릿 포인트 형식
3. DETAILED_REPORT
- 시간순 상세 기록
- 타임스탬프 포함
4. DECISION_FOCUSED
- 의사결정 중심
- 결정 사항과 근거
5. ACTION_FOCUSED
- 액션 아이템 중심
- Todo와 담당자 강조
6. EXECUTIVE_REPORT
- 경영진 보고용
- 간결하고 임팩트 있게
7. CUSTOM
- 사용자 정의 프롬프트
예: "신규 프로젝트 킥오프"
→ 기술/일정 중심 요약
end note
Template --> Service: promptTemplate
deactivate Template
== 프롬프트 생성 ==
Service -> Service: 최종 프롬프트 구성
Service -> Service: 요약 프롬프트 구성
note right
시스템 프롬프트:
- 역할: 회의록 개선 전문가
- 지시사항: {promptTemplate}
- 역할: 회의록 섹션 요약 전문가
- 목표: 핵심 내용을 2-3문장으로 압축
- 스타일: 명확하고 간결한 문체
사용자 프롬프트:
- 원본 회의록: {originalContent}
- 개선 요구사항: {promptType}
- 추가 지시사항: {customPrompt}
- 회의 맥락: {meetingContext}
- 섹션 내용: {sectionContent}
출력 형식 지정:
- 구조화된 마크다운
- 적절한 헤딩과 섹션
- 가독성 최적화
요구사항:
- 2-3문장으로 요약
- 논의사항과 결정사항 구분
- 핵심 키워드 포함
- 불필요한 세부사항 제외
end note
== LLM 기반 회의록 재구성 ==
== LLM 기반 요약 생성 ==
Service -> LLM: regenerateTranscript(prompt, originalContent)
Service -> LLM: generateSummary(prompt, sectionContent)
activate LLM
LLM -> OpenAI: POST /chat/completions
@@ -109,80 +77,55 @@ note right
요청 파라미터:
- model: gpt-4o
- temperature: 0.3
- max_tokens: 3000
- max_tokens: 200
- messages: [system, user]
end note
OpenAI -> OpenAI: 회의록 재구성
OpenAI -> OpenAI: 섹션 내용 분석 및 요약
note right
처리 단계:
1. 원본 분석
2. 프롬프트 의도 파악
3. 중요도 기반 필터링
4. 형식에 맞춰 재배치
5. 불필요한 내용 제거
6. 스타일 조정
- 문체 변환
- 길이 조정
7. 구조화
1. 섹션 내용 파싱
- 논의사항 추출
- 결정사항 추출
- 보류사항 추출
2. 핵심 내용 식별
- 중요도 평가
- 키워드 추출
3. 요약 생성
- 2-3문장으로 압축
- 논의→결정 흐름 반영
- 명확한 문장 구성
4. 품질 검증
- 길이 확인 (150자 이내)
- 핵심 누락 여부 확인
end note
OpenAI --> LLM: 개선된 회의록
OpenAI --> LLM: 생성된 AI 요약
deactivate OpenAI
LLM --> Service: improvedContent
LLM --> Service: summaryText
deactivate LLM
== 개선된 회의록 저장 ==
== 생성된 요약 저장 (선택적) ==
Service -> Service: 새 버전 생성
note right
버전 정보:
- base_version: 원본 버전 번호
- improvement_type: {promptType}
- version: 새 버전 번호
end note
Service -> Repo: saveImprovedTranscript(meetingId, improvedContent, metadata)
Service -> Repo: saveSectionSummary(sectionId, summaryText)
activate Repo
Repo -> DB: 개선된 회의록 저장
Repo -> DB: AI 요약 저장
activate DB
note right
저장 데이터:
- meeting_id
- content (개선된 내용)
- version (새 버전)
- base_version (원본 버전)
- improvement_type
- prompt_type
- custom_prompt
- created_at
- status: IMPROVED
- section_id
- summary_text
- generated_at
- model: "gpt-4o"
- token_usage
end note
DB --> Repo: newTranscriptId
deactivate DB
Repo --> Service: transcriptId, version
deactivate Repo
== 버전 연결 저장 ==
Service -> Repo: linkVersions(originalId, improvedId)
activate Repo
Repo -> DB: 버전 연결 정보 저장
activate DB
note right
버전 연결 정보:
- original_transcript_id
- improved_transcript_id
- improvement_type
- created_at
end note
DB --> Repo: 연결 완료
DB --> Repo: 저장 완료
deactivate DB
Repo --> Service: 완료
@@ -193,32 +136,32 @@ deactivate Repo
Service -> Service: 응답 데이터 구성
note right
응답 데이터:
- transcriptId (새 버전)
- version
- baseVersion
- improvementType
- content (개선된 내용)
- originalLink
- createdAt
- summary: "AI 기반 회의록 자동화..."
- generatedAt: "2025-01-23T11:00:00Z"
end note
Service --> Controller: 개선 완료 응답
Service --> Controller: 요약 생성 완료 응답
deactivate Service
Controller --> Controller: 200 OK 응답 반환
note over Controller, DB
처리 시간:
- 원본 조회: 100-200ms
- 템플릿 선택: 10-50ms
- LLM 재구성: 4-8
- 저장 처리: 200-300ms
총 처리 시간: 약 5-9
- 회의 맥락 조회: 50-100ms
- 프롬프트 구성: 10-20ms
- LLM 요약 생성: 2-4
- 저장 처리: 50-100ms
총 처리 시간: 약 2-5
정책:
- 원본 회의록은 항상 보존
- 여러 버전 동시 생성 가능
- 버전 간 비교 기능 제공
- 섹션 내용이 변경되면 요약도 재생성
- 이전 요약은 이력으로 보관
- 사용자는 생성된 요약을 수정 가능
- 수정된 요약은 AI 재생성 가능
처리량:
- max_tokens: 200 (요약은 짧음)
- 비용 효율적 (전체 회의록 대비)
end note
@enduml