mirror of
https://github.com/hwanny1128/HGZero.git
synced 2025-12-06 19:36:23 +00:00
## 변경 내용 - minutes 테이블에 user_id 컬럼 추가 (참석자별 회의록 지원) * user_id IS NULL: AI 통합 회의록 * user_id IS NOT NULL: 참석자별 회의록 - agenda_sections 테이블 생성 (안건별 AI 요약 저장) * agenda_number, agenda_title * ai_summary_short, discussions, decisions (JSON) * pending_items (JSON), opinions (JSON) - ai_summaries 테이블 생성 (AI 결과 캐싱) * summary_type: CONSOLIDATED, TODO_EXTRACTION * keywords, statistics (JSON) * processing_time_ms (성능 모니터링) - todos 테이블 확장 (AI 추출 정보) * extracted_by: AI, MANUAL * section_reference: 관련 안건 참조 * extraction_confidence: 0.00~1.00 ## 문서 - DB-Schema-회의종료.md: 상세 스키마 문서 - ERD-회의종료.puml: ERD 다이어그램 - 회의종료-개발계획.md: 전체 개발 계획 ## 설계 개선 - is_consolidated 컬럼 제거 (user_id로 구분 가능) - 중복 정보 제거로 데이터 일관성 향상
361 lines
9.9 KiB
Markdown
361 lines
9.9 KiB
Markdown
# 회의종료 기능 개발 계획
|
|
|
|
## 📋 개요
|
|
회의가 종료되면 모든 참석자의 회의록을 수집하여 Claude AI가 통합 요약하고 Todo를 자동 추출하는 기능
|
|
|
|
## 🎯 핵심 기능
|
|
1. **참석자별 회의록 통합**: 모든 참석자가 작성한 회의록을 DB에서 조회
|
|
2. **AI 통합 요약**: Claude AI가 안건별로 요약 및 구조화
|
|
3. **Todo 자동 추출**: AI가 회의록에서 액션 아이템 자동 추출
|
|
4. **통계 생성**: 참석자 수, 회의 시간, 안건 수, Todo 수 통계
|
|
|
|
---
|
|
|
|
## 🗄️ 데이터베이스 스키마 설계
|
|
|
|
### 1. minutes (회의록 테이블) - 확장
|
|
```sql
|
|
-- 기존 테이블 확장
|
|
ALTER TABLE minutes ADD COLUMN user_id VARCHAR(50); -- 작성자 ID
|
|
ALTER TABLE minutes ADD COLUMN is_consolidated BOOLEAN DEFAULT FALSE; -- 통합 회의록 여부
|
|
ALTER TABLE minutes ADD COLUMN consolidated_by VARCHAR(255); -- 통합 처리자 (AI)
|
|
|
|
-- 인덱스 추가
|
|
CREATE INDEX idx_minutes_meeting_user ON minutes(meeting_id, user_id);
|
|
CREATE INDEX idx_minutes_consolidated ON minutes(is_consolidated);
|
|
```
|
|
|
|
### 2. agenda_sections (안건별 섹션 테이블) - 신규
|
|
```sql
|
|
CREATE TABLE agenda_sections (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
minutes_id VARCHAR(36) NOT NULL,
|
|
meeting_id VARCHAR(36) NOT NULL,
|
|
agenda_number INT NOT NULL, -- 안건 번호 (1, 2, 3...)
|
|
agenda_title VARCHAR(200) NOT NULL, -- 안건 제목
|
|
|
|
-- AI 요약 결과
|
|
ai_summary_short TEXT, -- 짧은 요약 (1줄)
|
|
discussion TEXT, -- 논의 사항
|
|
decisions JSON, -- 결정 사항 배열
|
|
pending_items JSON, -- 보류 사항 배열
|
|
opinions JSON, -- 참석자별 의견 배열
|
|
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
|
|
FOREIGN KEY (minutes_id) REFERENCES minutes(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (meeting_id) REFERENCES meetings(id) ON DELETE CASCADE,
|
|
|
|
INDEX idx_sections_meeting (meeting_id),
|
|
INDEX idx_sections_agenda (meeting_id, agenda_number)
|
|
);
|
|
```
|
|
|
|
### 3. ai_summaries (AI 요약 결과 캐시) - 신규
|
|
```sql
|
|
CREATE TABLE ai_summaries (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
meeting_id VARCHAR(36) NOT NULL,
|
|
summary_type VARCHAR(50) NOT NULL, -- 'CONSOLIDATED', 'TODO_EXTRACTION'
|
|
|
|
-- 입력 정보
|
|
source_minutes_ids JSON NOT NULL, -- 통합에 사용된 회의록 ID 배열
|
|
|
|
-- AI 처리 결과
|
|
result JSON NOT NULL, -- AI 응답 전체 결과
|
|
processing_time_ms INT, -- 처리 시간 (밀리초)
|
|
model_version VARCHAR(50), -- 사용한 AI 모델 버전
|
|
|
|
-- 통계
|
|
keywords JSON, -- 주요 키워드 배열
|
|
statistics JSON, -- 통계 정보 (참석자 수, 안건 수 등)
|
|
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
FOREIGN KEY (meeting_id) REFERENCES meetings(id) ON DELETE CASCADE,
|
|
|
|
INDEX idx_summaries_meeting (meeting_id),
|
|
INDEX idx_summaries_type (meeting_id, summary_type)
|
|
);
|
|
```
|
|
|
|
### 4. todos (Todo 테이블) - 확장
|
|
```sql
|
|
-- 기존 테이블 확장
|
|
ALTER TABLE todos ADD COLUMN extracted_by VARCHAR(50) DEFAULT 'AI'; -- 'AI' 또는 'MANUAL'
|
|
ALTER TABLE todos ADD COLUMN section_reference VARCHAR(200); -- 관련 안건 참조
|
|
ALTER TABLE todos ADD COLUMN extraction_confidence DECIMAL(3,2); -- AI 추출 신뢰도 (0.00~1.00)
|
|
|
|
-- 인덱스 추가
|
|
CREATE INDEX idx_todos_extracted ON todos(extracted_by);
|
|
CREATE INDEX idx_todos_meeting ON todos(meeting_id);
|
|
```
|
|
|
|
---
|
|
|
|
## 🔌 API 설계
|
|
|
|
### Meeting Service API
|
|
|
|
#### 1. 참석자별 회의록 조회
|
|
```yaml
|
|
GET /meetings/{meetingId}/minutes/by-participants
|
|
Response:
|
|
participantMinutes:
|
|
- userId: "user1"
|
|
userName: "김민준"
|
|
minutesId: "uuid"
|
|
content: "회의록 내용..."
|
|
status: "DRAFT"
|
|
- userId: "user2"
|
|
userName: "박서연"
|
|
...
|
|
```
|
|
|
|
#### 2. 안건별 섹션 조회
|
|
```yaml
|
|
GET /meetings/{meetingId}/agenda-sections
|
|
Response:
|
|
sections:
|
|
- agendaNumber: 1
|
|
agendaTitle: "신제품 기획 방향성"
|
|
aiSummaryShort: "타겟 고객을 20-30대로 설정..."
|
|
discussions: "..."
|
|
decisions: [...]
|
|
todos: [...]
|
|
```
|
|
|
|
#### 3. 회의 통계 조회
|
|
```yaml
|
|
GET /meetings/{meetingId}/statistics
|
|
Response:
|
|
participantsCount: 4
|
|
durationMinutes: 90
|
|
agendasCount: 3
|
|
todosCount: 5
|
|
keywords: ["신제품기획", "예산편성", ...]
|
|
```
|
|
|
|
### AI Service API
|
|
|
|
#### 1. 통합 회의록 요약 API (신규)
|
|
```yaml
|
|
POST /transcripts/consolidate
|
|
Request:
|
|
meetingId: "uuid"
|
|
participantMinutes:
|
|
- userId: "user1"
|
|
content: "회의록 내용..."
|
|
- userId: "user2"
|
|
content: "회의록 내용..."
|
|
agendas:
|
|
- number: 1
|
|
title: "신제품 기획 방향성"
|
|
|
|
Response:
|
|
consolidatedMinutesId: "uuid"
|
|
agendaSections:
|
|
- agendaNumber: 1
|
|
aiSummaryShort: "타겟 고객을 20-30대로 설정..."
|
|
discussions: "..."
|
|
decisions: [...]
|
|
pendingItems: [...]
|
|
keywords: ["신제품기획", "예산편성"]
|
|
processingTimeMs: 3500
|
|
```
|
|
|
|
#### 2. Todo 자동 추출 API (기존)
|
|
```yaml
|
|
POST /todos/extract
|
|
Request:
|
|
meetingId: "uuid"
|
|
minutesContent: "통합된 회의록 전체 내용..."
|
|
|
|
Response:
|
|
todos:
|
|
- content: "시장 조사 보고서 작성"
|
|
assignee: "김민준"
|
|
dueDate: "2025-11-01"
|
|
priority: "HIGH"
|
|
sectionReference: "안건 1"
|
|
confidence: 0.92
|
|
```
|
|
|
|
---
|
|
|
|
## 🤖 Claude AI 프롬프트 설계
|
|
|
|
### 1. 통합 회의록 요약 프롬프트
|
|
```
|
|
당신은 회의록 통합 전문가입니다.
|
|
|
|
입력:
|
|
- 회의 제목: {meetingTitle}
|
|
- 안건 목록: {agendas}
|
|
- 참석자별 회의록:
|
|
* {userName1}: {content1}
|
|
* {userName2}: {content2}
|
|
...
|
|
|
|
작업:
|
|
각 안건별로 다음을 생성하세요:
|
|
1. 짧은 요약 (1줄, 20자 이내)
|
|
2. 논의 사항 (핵심 내용 3-5문장)
|
|
3. 결정 사항 (배열 형태)
|
|
4. 보류 사항 (배열 형태)
|
|
5. 참석자별 의견 (speaker, opinion)
|
|
|
|
출력 형식 (JSON):
|
|
{
|
|
"agendaSections": [
|
|
{
|
|
"agendaNumber": 1,
|
|
"aiSummaryShort": "...",
|
|
"discussions": "...",
|
|
"decisions": ["결정1", "결정2"],
|
|
"pendingItems": ["보류1"],
|
|
"opinions": [
|
|
{"speaker": "김민준", "opinion": "..."}
|
|
]
|
|
}
|
|
],
|
|
"keywords": ["키워드1", "키워드2", ...]
|
|
}
|
|
```
|
|
|
|
### 2. Todo 자동 추출 프롬프트
|
|
```
|
|
당신은 Todo 추출 전문가입니다.
|
|
|
|
입력:
|
|
- 회의록 전체 내용: {minutesContent}
|
|
- 참석자 목록: {participants}
|
|
|
|
작업:
|
|
회의록에서 액션 아이템(Todo)을 추출하세요.
|
|
- "~하기로 함", "~가 작성", "~까지 완료" 등의 패턴 탐지
|
|
- 담당자와 마감일 식별
|
|
- 우선순위 판단 (HIGH/MEDIUM/LOW)
|
|
|
|
출력 형식 (JSON):
|
|
{
|
|
"todos": [
|
|
{
|
|
"content": "시장 조사 보고서 작성",
|
|
"assignee": "김민준",
|
|
"dueDate": "2025-11-01",
|
|
"priority": "HIGH",
|
|
"sectionReference": "안건 1",
|
|
"confidence": 0.92
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 🔄 통합 플로우
|
|
|
|
### 회의 종료 처리 시퀀스
|
|
```
|
|
1. 사용자가 "회의 종료" 버튼 클릭
|
|
↓
|
|
2. Meeting Service: 회의 상태를 'ENDED'로 변경
|
|
↓
|
|
3. Meeting Service: 모든 참석자의 회의록 조회 (GET /meetings/{meetingId}/minutes/by-participants)
|
|
↓
|
|
4. AI Service 호출: 통합 요약 요청 (POST /transcripts/consolidate)
|
|
↓
|
|
5. Claude AI: 안건별 요약 및 구조화
|
|
↓
|
|
6. AI Service: agenda_sections 테이블에 저장
|
|
↓
|
|
7. AI Service 호출: Todo 자동 추출 (POST /todos/extract)
|
|
↓
|
|
8. Claude AI: Todo 추출 및 담당자 식별
|
|
↓
|
|
9. Meeting Service: todos 테이블에 저장
|
|
↓
|
|
10. Meeting Service: ai_summaries 테이블에 캐시 저장
|
|
↓
|
|
11. 프론트엔드: 07-회의종료.html 화면 렌더링
|
|
```
|
|
|
|
---
|
|
|
|
## 📊 성능 고려사항
|
|
|
|
### 1. 처리 시간 목표
|
|
- AI 통합 요약: 3-5초 이내
|
|
- Todo 추출: 2-3초 이내
|
|
- 전체 회의 종료 처리: 10초 이내
|
|
|
|
### 2. 최적화 방안
|
|
- **병렬 처리**: 통합 요약과 Todo 추출을 병렬로 실행
|
|
- **캐싱**: ai_summaries 테이블에 결과 캐싱 (재조회 시 0.5초 이내)
|
|
- **비동기 처리**: 회의 종료 후 백그라운드에서 AI 처리
|
|
- **진행 상태 표시**: WebSocket으로 실시간 진행률 전달
|
|
|
|
### 3. 대용량 처리
|
|
- 10명 이상 참석자: 회의록을 청크 단위로 분할 처리
|
|
- 긴 회의 (2시간 이상): 안건별 병렬 처리
|
|
|
|
---
|
|
|
|
## 🧪 테스트 시나리오
|
|
|
|
### 1. 단위 테스트
|
|
- [ ] 참석자별 회의록 조회 API 테스트
|
|
- [ ] AI 통합 요약 API 테스트
|
|
- [ ] Todo 자동 추출 API 테스트
|
|
- [ ] 안건별 섹션 저장 및 조회 테스트
|
|
|
|
### 2. 통합 테스트
|
|
- [ ] 회의 종료 → AI 요약 → Todo 추출 전체 플로우
|
|
- [ ] 다수 참석자 (10명) 회의록 통합 테스트
|
|
- [ ] 긴 회의록 (5000자 이상) 처리 테스트
|
|
|
|
### 3. 성능 테스트
|
|
- [ ] AI 요약 응답 시간 측정 (목표: 5초 이내)
|
|
- [ ] 동시 다발적 회의 종료 처리 (10개 동시)
|
|
- [ ] 대용량 회의록 (10000자 이상) 처리 시간
|
|
|
|
---
|
|
|
|
## 📅 개발 일정 (예상)
|
|
|
|
### Phase 1: DB 및 기본 API (3일)
|
|
- Day 1: DB 스키마 설계 및 마이그레이션
|
|
- Day 2: Meeting Service API 개발
|
|
- Day 3: 단위 테스트 및 API 검증
|
|
|
|
### Phase 2: AI 통합 (4일)
|
|
- Day 1-2: Claude AI 프롬프트 설계 및 테스트
|
|
- Day 3: AI Service API 개발
|
|
- Day 4: 통합 테스트
|
|
|
|
### Phase 3: 최적화 및 배포 (2일)
|
|
- Day 1: 성능 최적화 및 캐싱
|
|
- Day 2: 프론트엔드 연동 테스트 및 배포
|
|
|
|
**총 예상 기간: 9일**
|
|
|
|
---
|
|
|
|
## 🚀 배포 체크리스트
|
|
- [ ] DB 마이그레이션 스크립트 준비
|
|
- [ ] API 명세서 업데이트
|
|
- [ ] AI 프롬프트 버전 관리
|
|
- [ ] 성능 모니터링 설정
|
|
- [ ] 에러 로깅 및 알림 설정
|
|
- [ ] 백업 및 롤백 계획 수립
|
|
|
|
---
|
|
|
|
## 📝 참고 문서
|
|
- [유저스토리](../design/userstory.md)
|
|
- [AI Service API 명세](../design/backend/api/ai-service-api.yaml)
|
|
- [Meeting Service API 명세](../design/backend/api/meeting-service-api.yaml)
|
|
- [07-회의종료.html 프로토타입](../design/uiux/prototype/07-회의종료.html)
|