mirror of
https://github.com/hwanny1128/HGZero.git
synced 2025-12-06 13:46:24 +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로 구분 가능) - 중복 정보 제거로 데이터 일관성 향상
9.9 KiB
9.9 KiB
회의종료 기능 개발 계획
📋 개요
회의가 종료되면 모든 참석자의 회의록을 수집하여 Claude AI가 통합 요약하고 Todo를 자동 추출하는 기능
🎯 핵심 기능
- 참석자별 회의록 통합: 모든 참석자가 작성한 회의록을 DB에서 조회
- AI 통합 요약: Claude AI가 안건별로 요약 및 구조화
- Todo 자동 추출: AI가 회의록에서 액션 아이템 자동 추출
- 통계 생성: 참석자 수, 회의 시간, 안건 수, Todo 수 통계
🗄️ 데이터베이스 스키마 설계
1. minutes (회의록 테이블) - 확장
-- 기존 테이블 확장
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 (안건별 섹션 테이블) - 신규
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 요약 결과 캐시) - 신규
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 테이블) - 확장
-- 기존 테이블 확장
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. 참석자별 회의록 조회
GET /meetings/{meetingId}/minutes/by-participants
Response:
participantMinutes:
- userId: "user1"
userName: "김민준"
minutesId: "uuid"
content: "회의록 내용..."
status: "DRAFT"
- userId: "user2"
userName: "박서연"
...
2. 안건별 섹션 조회
GET /meetings/{meetingId}/agenda-sections
Response:
sections:
- agendaNumber: 1
agendaTitle: "신제품 기획 방향성"
aiSummaryShort: "타겟 고객을 20-30대로 설정..."
discussions: "..."
decisions: [...]
todos: [...]
3. 회의 통계 조회
GET /meetings/{meetingId}/statistics
Response:
participantsCount: 4
durationMinutes: 90
agendasCount: 3
todosCount: 5
keywords: ["신제품기획", "예산편성", ...]
AI Service API
1. 통합 회의록 요약 API (신규)
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 (기존)
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 프롬프트 버전 관리
- 성능 모니터링 설정
- 에러 로깅 및 알림 설정
- 백업 및 롤백 계획 수립