diff --git a/design/backend/api/ai-service-api.yaml b/design/backend/api/ai-service-api.yaml index 4f33e50..d345ad9 100644 --- a/design/backend/api/ai-service-api.yaml +++ b/design/backend/api/ai-service-api.yaml @@ -31,8 +31,8 @@ tags: description: 회의록 자동 작성 관련 API - name: Todo description: Todo 자동 추출 관련 API - - name: Improve - description: 회의록 개선 관련 API + - name: Section + description: 섹션 AI 요약 재생성 관련 API - name: Relation description: 관련 회의록 연결 관련 API - name: Term @@ -101,38 +101,38 @@ paths: '500': $ref: '#/components/responses/InternalServerError' - /transcripts/{meetingId}/improve: + /sections/{sectionId}/regenerate-summary: post: tags: - - Improve - summary: 회의록 개선 + - Section + summary: 섹션 AI 요약 재생성 description: | - 프롬프팅을 통해 회의록을 다양한 형식으로 변환합니다. - (1Page 요약, 핵심 요약, 상세 보고서 등) - operationId: improveTranscript - x-user-story: UFR-AI-030 - x-controller: ImproveController + 사용자가 작성한 섹션 내용을 기반으로 AI 요약을 재생성합니다. + 회의록 작성/수정 중에 사용됩니다. + operationId: regenerateSectionSummary + x-user-story: UFR-AI-035 + x-controller: SectionController parameters: - - name: meetingId + - name: sectionId in: path required: true schema: type: string format: uuid - description: 회의 ID + description: 섹션 ID requestBody: required: true content: application/json: schema: - $ref: '#/components/schemas/TranscriptImproveRequest' + $ref: '#/components/schemas/SectionSummaryRequest' responses: '200': - description: 회의록 개선 성공 + description: AI 요약 재생성 성공 content: application/json: schema: - $ref: '#/components/schemas/TranscriptImproveResponse' + $ref: '#/components/schemas/SectionSummaryResponse' '400': $ref: '#/components/responses/BadRequest' '404': @@ -385,31 +385,29 @@ components: ## 보류사항 - 배포 일정은 다음 회의에서 논의 - TranscriptImproveRequest: + SectionSummaryRequest: type: object required: - - promptType + - sectionContent properties: - promptType: + sectionContent: type: string - enum: - - 1PAGE_SUMMARY - - CORE_SUMMARY - - DETAILED_REPORT - - DECISION_FOCUSED - - ACTION_FOCUSED - - EXECUTIVE_REPORT - - CUSTOM - description: 프롬프트 유형 - example: "1PAGE_SUMMARY" - customPrompt: + description: 사용자가 작성/수정한 섹션 내용 (Markdown 형식) + example: | + **논의 사항:** + - AI 기반 회의록 자동화 서비스 출시 결정 + - 타겟 고객: 중소기업, 스타트업 + - 주요 기능: 음성인식, AI 요약, Todo 자동 추출 + - 차별화 포인트: 실시간 검증, 협업 기능 + + **결정 사항:** + - 베타 버전 출시일: 2025년 12월 1일 + - 초기 목표 사용자: 100개 팀 + meetingId: type: string - description: 사용자 정의 프롬프트 (promptType이 CUSTOM일 때) - example: "경영진 보고용으로 3가지 핵심 결정사항만 요약해주세요" - userId: - type: string - description: 사용자 ID - example: "user123" + format: uuid + description: 회의 ID (맥락 이해용, 선택적) + example: "550e8400-e29b-41d4-a716-446655440000" TermDetectionRequest: type: object @@ -517,39 +515,18 @@ components: description: 추출 시간 example: "2025-01-23T11:00:00Z" - TranscriptImproveResponse: + SectionSummaryResponse: type: object properties: - transcriptId: + summary: type: string - format: uuid - description: 개선된 회의록 ID - example: "770e8400-e29b-41d4-a716-446655440002" - version: - type: integer - description: 버전 번호 - example: 2 - baseVersion: - type: integer - description: 원본 버전 번호 - example: 1 - improvementType: - type: string - description: 개선 유형 - example: "1PAGE_SUMMARY" - content: - type: string - description: 개선된 회의록 내용 - example: "## 프로젝트 킥오프 미팅 요약\n\n### 핵심 결정사항\n1. React 기반 프론트엔드 개발..." - originalLink: - type: string - description: 원본 회의록 링크 - example: "/transcripts/660e8400-e29b-41d4-a716-446655440001" - createdAt: + description: 생성된 AI 요약 (2-3문장) + example: "AI 기반 회의록 자동화 서비스로 결정. 타겟은 중소기업 및 스타트업이며, 주요 기능은 음성인식, AI 요약, Todo 추출입니다. 경쟁사 대비 차별점은 실시간 검증 및 협업 기능입니다." + generatedAt: type: string format: date-time description: 생성 시간 - example: "2025-01-23T11:30:00Z" + example: "2025-01-23T11:00:00Z" RelatedTranscriptsResponse: type: object diff --git a/design/backend/api/meeting-service-api.yaml b/design/backend/api/meeting-service-api.yaml index 1061c30..f4ad099 100644 --- a/design/backend/api/meeting-service-api.yaml +++ b/design/backend/api/meeting-service-api.yaml @@ -99,20 +99,13 @@ paths: priority: "MEDIUM" status: "IN_PROGRESS" minutesId: "770e8400-e29b-41d4-a716-446655440001" - recentMinutes: + myMinutes: - minutesId: "770e8400-e29b-41d4-a716-446655440000" title: "아키텍처 설계 회의" meetingDate: "2025-01-23T14:00:00Z" status: "FINALIZED" participantCount: 6 lastModified: "2025-01-23T16:30:00Z" - sharedMinutes: - - minutesId: "770e8400-e29b-41d4-a716-446655440002" - title: "프로젝트 킥오프 미팅" - meetingDate: "2025-01-22T10:00:00Z" - status: "FINALIZED" - sharedBy: "김철수" - sharedAt: "2025-01-22T15:00:00Z" statistics: upcomingMeetingsCount: 2 activeTodosCount: 5 @@ -154,6 +147,7 @@ paths: startTime: "2025-01-25T14:00:00Z" endTime: "2025-01-25T16:00:00Z" location: "회의실 A" + agenda: "1. Q1 목표 달성 현황 검토\n2. Q2 전략 방향 논의\n3. 주요 이슈 및 리스크 검토" participants: - "user1@example.com" - "user2@example.com" @@ -288,6 +282,7 @@ paths: - 회의 통계 생성 - AI 제안 데이터 회의록에 반영 - 참석자에게 종료 알림 + - 검증 완료 화면 데이터 반환 operationId: endMeeting x-user-story: UFR-MEET-040 x-controller: MeetingController @@ -296,6 +291,15 @@ paths: parameters: - $ref: '#/components/parameters/MeetingIdPath' - $ref: '#/components/parameters/UserIdHeader' + requestBody: + required: false + content: + application/json: + schema: + $ref: '#/components/schemas/EndMeetingRequest' + example: + finalAgenda: "1. Q1 목표 달성률 85% 확인\n2. 신규 기능 우선순위 결정\n3. 다음 주 개발 일정 조율" + applyAiSuggestions: true responses: '200': description: 회의 종료 성공 @@ -320,6 +324,53 @@ paths: discussion: 3 decision: 2 todo: 3 + verificationStatus: + totalSections: 4 + verifiedSections: 2 + verificationRate: 50 + sections: + - sectionId: "880e8400-e29b-41d4-a716-446655440000" + sectionType: "DISCUSSION" + title: "회의 개요" + isVerified: true + isLocked: false + verifiers: + - userId: "user1" + name: "김민준" + verifiedAt: "2025-01-25T15:30:00Z" + - userId: "user2" + name: "박서연" + verifiedAt: "2025-01-25T15:35:00Z" + - sectionId: "880e8400-e29b-41d4-a716-446655440001" + sectionType: "DECISION" + title: "논의 사항" + isVerified: true + isLocked: true + verifiers: + - userId: "user1" + name: "김민준" + verifiedAt: "2025-01-25T15:40:00Z" + - userId: "user2" + name: "박서연" + verifiedAt: "2025-01-25T15:42:00Z" + - userId: "user3" + name: "이준호" + verifiedAt: "2025-01-25T15:45:00Z" + - sectionId: "880e8400-e29b-41d4-a716-446655440002" + sectionType: "TODO" + title: "결정 사항" + isVerified: false + isLocked: false + verifiers: + - userId: "user2" + name: "박서연" + verifiedAt: "2025-01-25T15:50:00Z" + - sectionId: "880e8400-e29b-41d4-a716-446655440003" + sectionType: "TODO" + title: "액션 아이템" + isVerified: false + isLocked: false + verifiers: [] '404': $ref: '#/components/responses/NotFoundError' '409': @@ -629,6 +680,85 @@ paths: # ==================== Todo APIs ==================== /todos: + get: + tags: + - Todo + summary: Todo 목록 조회 + description: | + 사용자별 Todo 목록을 조회하고 필터링합니다. + - 상태별 필터링 (전체/진행중/완료/마감임박) + - 우선순위별 정렬 + - 통계 정보 포함 + operationId: getTodoList + x-user-story: UFR-TODO-020 + x-controller: TodoController + security: + - bearerAuth: [] + parameters: + - $ref: '#/components/parameters/UserIdHeader' + - name: status + in: query + schema: + type: string + enum: [ALL, IN_PROGRESS, COMPLETED, URGENT] + default: ALL + description: | + Todo 상태 필터 + - ALL: 전체 + - IN_PROGRESS: 진행중 + - COMPLETED: 완료 + - URGENT: 마감 임박 (3일 이내) + - name: sort + in: query + schema: + type: string + enum: [DUE_DATE, PRIORITY, CREATED_AT] + default: DUE_DATE + description: 정렬 기준 + responses: + '200': + description: Todo 목록 조회 성공 + content: + application/json: + schema: + $ref: '#/components/schemas/TodoListResponse' + example: + statistics: + total: 12 + inProgress: 8 + completed: 4 + urgent: 3 + completionRate: 33.3 + todos: + - todoId: "660e8400-e29b-41d4-a716-446655440000" + content: "API 설계 문서 작성" + assignee: + userId: "user1" + email: "user@example.com" + name: "김민준" + dueDate: "2025-01-30" + priority: "HIGH" + status: "IN_PROGRESS" + progress: 60 + minutesId: "770e8400-e29b-41d4-a716-446655440000" + meetingTitle: "아키텍처 설계 회의" + createdAt: "2025-01-23T10:00:00Z" + - todoId: "660e8400-e29b-41d4-a716-446655440001" + content: "데이터베이스 스키마 설계" + assignee: + userId: "user1" + email: "user@example.com" + name: "김민준" + dueDate: "2025-02-05" + priority: "MEDIUM" + status: "IN_PROGRESS" + progress: 30 + minutesId: "770e8400-e29b-41d4-a716-446655440001" + meetingTitle: "주간 스프린트 리뷰" + createdAt: "2025-01-22T14:00:00Z" + '401': + $ref: '#/components/responses/UnauthorizedError' + post: tags: - Todo @@ -712,6 +842,7 @@ paths: summary: 템플릿 목록 조회 description: | 사용 가능한 회의록 템플릿 목록을 조회합니다. + 각 템플릿의 섹션 정보를 포함하여 반환합니다. - 일반 회의 - 스크럼 회의 - 프로젝트 킥오프 @@ -730,34 +861,47 @@ paths: type: array items: $ref: '#/components/schemas/TemplateResponse' - - /templates/{templateId}: - get: - tags: - - Template - summary: 템플릿 상세 조회 - description: 특정 템플릿의 상세 정보를 조회합니다. - operationId: getTemplate - x-user-story: UFR-MEET-020 - x-controller: TemplateController - security: - - bearerAuth: [] - parameters: - - name: templateId - in: path - required: true - schema: - type: string - description: 템플릿 ID - responses: - '200': - description: 템플릿 상세 조회 성공 - content: - application/json: - schema: - $ref: '#/components/schemas/TemplateDetailResponse' - '404': - $ref: '#/components/responses/NotFoundError' + example: + - templateId: "general-meeting" + name: "일반 회의" + description: "기본 회의록 형식" + icon: "📋" + category: "GENERAL" + sections: + - sectionType: "DISCUSSION" + title: "회의 개요" + order: 1 + isRequired: true + - sectionType: "DISCUSSION" + title: "논의 사항" + order: 2 + isRequired: true + - sectionType: "DECISION" + title: "결정 사항" + order: 3 + isRequired: true + - sectionType: "TODO" + title: "액션 아이템" + order: 4 + isRequired: true + - templateId: "scrum-meeting" + name: "스크럼 회의" + description: "데일리 스탠드업 형식" + icon: "🏃" + category: "SCRUM" + sections: + - sectionType: "DISCUSSION" + title: "어제 한 일" + order: 1 + isRequired: true + - sectionType: "TODO" + title: "오늘 할 일" + order: 2 + isRequired: true + - sectionType: "CUSTOM" + title: "블로커/이슈" + order: 3 + isRequired: true # ==================== WebSocket Endpoints ==================== /ws/minutes/{minutesId}: @@ -880,16 +1024,11 @@ components: items: $ref: '#/components/schemas/ActiveTodo' description: 진행 중 Todo 목록 - recentMinutes: + myMinutes: type: array items: - $ref: '#/components/schemas/RecentMinutes' - description: 최근 회의록 목록 - sharedMinutes: - type: array - items: - $ref: '#/components/schemas/SharedMinutes' - description: 공유받은 회의록 목록 + $ref: '#/components/schemas/MyMinutes' + description: 내 회의록 목록 statistics: $ref: '#/components/schemas/DashboardStatistics' description: 통계 정보 @@ -949,7 +1088,7 @@ components: - priority - status - RecentMinutes: + MyMinutes: type: object properties: minutesId: @@ -974,30 +1113,6 @@ components: - meetingDate - status - SharedMinutes: - type: object - properties: - minutesId: - type: string - format: uuid - title: - type: string - meetingDate: - type: string - format: date-time - status: - type: string - enum: [DRAFT, FINALIZED] - sharedBy: - type: string - sharedAt: - type: string - format: date-time - required: - - minutesId - - title - - status - DashboardStatistics: type: object properties: @@ -1034,6 +1149,10 @@ components: type: string maxLength: 200 description: 회의 장소 + agenda: + type: string + maxLength: 1000 + description: 회의 안건 (선택 사항) participants: type: array items: @@ -1319,14 +1438,7 @@ components: type: array items: $ref: '#/components/schemas/MinutesSection' - aiSummaries: - type: array - items: - $ref: '#/components/schemas/AISummary' - relatedMinutes: - type: array - items: - $ref: '#/components/schemas/RelatedMinutes' + description: 섹션별 내용 (AI 요약 및 관련 회의록 포함) permissions: $ref: '#/components/schemas/MinutesPermissions' status: @@ -1390,6 +1502,14 @@ components: verifiedAt: type: string format: date-time + aiSummary: + $ref: '#/components/schemas/AISummary' + description: 이 섹션의 AI 요약 + relatedMinutes: + type: array + items: + $ref: '#/components/schemas/RelatedMinutes' + description: 이 섹션과 관련된 회의록 목록 (최대 3개) required: - sectionId - sectionType @@ -1405,11 +1525,9 @@ components: summaryId: type: string format: uuid - sectionId: - type: string - format: uuid content: type: string + description: AI가 생성한 요약 내용 createdAt: type: string format: date-time @@ -1418,7 +1536,6 @@ components: format: date-time required: - summaryId - - sectionId - content RelatedMinutes: @@ -1475,6 +1592,13 @@ components: type: string aiSummary: type: string + relatedMinutesIds: + type: array + items: + type: string + format: uuid + description: 이 섹션과 연결할 관련 회의록 ID 목록 (최대 3개) + maxItems: 3 required: - sectionId @@ -1541,6 +1665,102 @@ components: - isVerified # ==================== Todo Schemas ==================== + TodoListResponse: + type: object + properties: + statistics: + $ref: '#/components/schemas/TodoStatistics' + todos: + type: array + items: + $ref: '#/components/schemas/TodoDetail' + required: + - statistics + - todos + + TodoStatistics: + type: object + properties: + total: + type: integer + description: 전체 Todo 개수 + inProgress: + type: integer + description: 진행 중 Todo 개수 + completed: + type: integer + description: 완료된 Todo 개수 + urgent: + type: integer + description: 마감 임박 Todo 개수 (3일 이내) + completionRate: + type: number + format: double + description: 완료율 (%) + required: + - total + - inProgress + - completed + - urgent + - completionRate + + TodoDetail: + type: object + properties: + todoId: + type: string + format: uuid + content: + type: string + assignee: + $ref: '#/components/schemas/TodoAssignee' + dueDate: + type: string + format: date + priority: + type: string + enum: [HIGH, MEDIUM, LOW] + status: + type: string + enum: [IN_PROGRESS, COMPLETED] + progress: + type: integer + minimum: 0 + maximum: 100 + description: 진행률 (%) + minutesId: + type: string + format: uuid + meetingTitle: + type: string + description: 관련 회의 제목 + createdAt: + type: string + format: date-time + required: + - todoId + - content + - assignee + - priority + - status + - minutesId + - meetingTitle + + TodoAssignee: + type: object + properties: + userId: + type: string + email: + type: string + format: email + name: + type: string + required: + - userId + - email + - name + CreateTodoRequest: type: object properties: @@ -1643,29 +1863,17 @@ components: type: string description: type: string + icon: + type: string + description: 템플릿 아이콘 (이모지) category: type: string enum: [GENERAL, SCRUM, KICKOFF, WEEKLY] - required: - - templateId - - name - - category - - TemplateDetailResponse: - type: object - properties: - templateId: - type: string - name: - type: string - description: - type: string - category: - type: string sections: type: array items: $ref: '#/components/schemas/TemplateSection' + description: 템플릿 섹션 목록 required: - templateId - name diff --git a/design/backend/api/spec/ai-service-api-spec.md b/design/backend/api/spec/ai-service-api-spec.md index f47e19c..c50cdcf 100644 --- a/design/backend/api/spec/ai-service-api-spec.md +++ b/design/backend/api/spec/ai-service-api-spec.md @@ -7,7 +7,7 @@ AI Service는 회의록 작성 및 공유 개선 서비스의 핵심 차별화 ### 주요 기능 - **회의록 자동 작성**: LLM 기반 회의록 자동 생성 - **Todo 자동 추출**: 액션 아이템 자동 식별 및 담당자 추출 -- **회의록 개선**: 프롬프팅 기반 다양한 형식 변환 +- **섹션 AI 요약 재생성**: 작성한 섹션 내용을 AI가 자동으로 요약 - **관련 회의록 연결**: RAG 기반 벡터 유사도 검색 - **전문용어 감지**: 맥락 기반 용어 설명 제공 - **실시간 추천**: 논의사항/결정사항 자동 제안 @@ -101,45 +101,30 @@ Todo 자동 추출 --- -### 3. 회의록 개선 (Improve) +### 3. 섹션 AI 요약 재생성 (Section Summary) -#### POST /transcripts/{meetingId}/improve -회의록 개선 +#### POST /sections/{sectionId}/regenerate-summary +섹션 AI 요약 재생성 -**유저스토리**: UFR-AI-030 -**Controller**: ImproveController +**유저스토리**: UFR-AI-035 +**Controller**: SectionController **Path Parameters**: -- `meetingId` (uuid, required): 회의 ID +- `sectionId` (uuid, required): 섹션 ID **Request Body**: ```json { - "promptType": "1PAGE_SUMMARY", - "customPrompt": "경영진 보고용으로 3가지 핵심 결정사항만 요약해주세요", - "userId": "user123" + "sectionContent": "**논의 사항:**\n- AI 기반 회의록 자동화 서비스 출시 결정\n- 타겟 고객: 중소기업, 스타트업\n- 주요 기능: 음성인식, AI 요약, Todo 자동 추출\n- 차별화 포인트: 실시간 검증, 협업 기능\n\n**결정 사항:**\n- 베타 버전 출시일: 2025년 12월 1일\n- 초기 목표 사용자: 100개 팀", + "meetingId": "550e8400-e29b-41d4-a716-446655440000" } ``` -**Prompt Types**: -- `1PAGE_SUMMARY`: A4 1장 분량 요약 -- `CORE_SUMMARY`: 3-5개 핵심 포인트 -- `DETAILED_REPORT`: 시간순 상세 기록 -- `DECISION_FOCUSED`: 의사결정 중심 -- `ACTION_FOCUSED`: 액션 아이템 중심 -- `EXECUTIVE_REPORT`: 경영진 보고용 -- `CUSTOM`: 사용자 정의 - **Response (200 OK)**: ```json { - "transcriptId": "770e8400-e29b-41d4-a716-446655440002", - "version": 2, - "baseVersion": 1, - "improvementType": "1PAGE_SUMMARY", - "content": "## 프로젝트 킥오프 미팅 요약\n\n### 핵심 결정사항...", - "originalLink": "/transcripts/660e8400-e29b-41d4-a716-446655440001", - "createdAt": "2025-01-23T11:30:00Z" + "summary": "AI 기반 회의록 자동화 서비스로 결정. 타겟은 중소기업 및 스타트업이며, 주요 기능은 음성인식, AI 요약, Todo 추출입니다. 경쟁사 대비 차별점은 실시간 검증 및 협업 기능입니다.", + "generatedAt": "2025-01-23T11:00:00Z" } ``` @@ -425,10 +410,10 @@ docker run -p 8080:8080 \ - 회의록과 양방향 연결 - Meeting Service로 실시간 전달 -### 3. 프롬프팅 기반 회의록 개선 -- 7가지 프롬프트 유형 지원 -- 원본 보존 + 버전 관리 -- 사용자 정의 프롬프트 지원 +### 3. 섹션 AI 요약 재생성 +- 작성 중 실시간 AI 요약 생성 +- 섹션별 독립적 요약 처리 +- 회의 맥락 기반 정확도 향상 ### 4. 실시간 추천 - 논의사항 제안 (빠진 안건 자동 감지) @@ -443,7 +428,7 @@ docker run -p 8080:8080 \ |-----|---------------| | 회의록 자동 작성 | 8-13초 | | Todo 자동 추출 | 4-7초 | -| 회의록 개선 | 5-9초 | +| 섹션 AI 요약 재생성 | 2-5초 | | 관련 회의록 연결 | 5-8초 | | 전문용어 감지 | 3-5초 | | 맥락 기반 용어 설명 | 5-8초 | @@ -457,3 +442,4 @@ docker run -p 8080:8080 \ | 버전 | 작성일 | 작성자 | 변경 내용 | |------|--------|--------|----------| | 1.0 | 2025-01-23 | 준호 (Backend Developer) | AI Service API 설계 완료 | +| 1.1 | 2025-01-23 | 준호 (Backend Developer) | 회의록 개선 → 섹션 AI 요약 재생성으로 변경 (프로토타입 반영) | diff --git a/design/backend/sequence/inner/ai-회의록개선.puml b/design/backend/sequence/inner/ai-회의록개선.puml index a12683e..02688fa 100644 --- a/design/backend/sequence/inner/ai-회의록개선.puml +++ b/design/backend/sequence/inner/ai-회의록개선.puml @@ -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<>" as OpenAI database "PostgreSQL<>" 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 diff --git a/design/backend/sequence/outer/회의록상세조회및수정.puml b/design/backend/sequence/outer/회의록상세조회및수정.puml index 146fa68..0154277 100644 --- a/design/backend/sequence/outer/회의록상세조회및수정.puml +++ b/design/backend/sequence/outer/회의록상세조회및수정.puml @@ -141,4 +141,39 @@ end deactivate Frontend +== 섹션 AI 요약 재생성 (선택적) == + +User -> Frontend: "AI 재생성" 버튼 클릭\n(특정 섹션) +activate Frontend + +Frontend -> Frontend: 로딩 상태 표시\n"AI 요약을 생성 중입니다..." + +Frontend -> Gateway: POST /api/ai/sections/{sectionId}/regenerate-summary\n{\n "sectionContent": "**논의 사항:**\n- AI 기반...",\n "meetingId": "..."\n} +activate Gateway + +Gateway -> AI: POST /sections/{sectionId}/regenerate-summary +activate AI + +AI -> AI: 섹션 내용 분석 및 요약 생성\n- 회의 맥락 조회\n- LLM 기반 요약 (2-3문장)\n- 처리 시간: 2-5초 + +AI --> Gateway: 생성된 AI 요약\n{\n "summary": "AI 기반 회의록...",\n "generatedAt": "..."\n} +deactivate AI + +Gateway --> Frontend: 200 OK\nAI 요약 +deactivate Gateway + +Frontend -> Frontend: AI 요약 영역 업데이트\n- 생성된 요약 표시\n- "저장됨" 표시 + +Frontend --> User: AI 요약 재생성 완료 +deactivate Frontend + +note over User, AI +AI 재생성 특징: +- 각 섹션별 독립 처리 +- 사용자가 수정한 내용 기반 +- 프롬프트 입력 없이 자동 생성 +- 생성된 요약은 사용자가 다시 수정 가능 +- 처리 시간 2-5초 (빠름) +end note + @enduml diff --git a/design/userstory.md b/design/userstory.md index 9376800..3aaf51b 100644 --- a/design/userstory.md +++ b/design/userstory.md @@ -19,7 +19,7 @@ ### 2. 핵심 차별화 포인트 (Differentiators) - **맥락 기반 용어 설명**: 단순 용어 설명을 넘어, 관련 회의록과 업무이력을 바탕으로 실용적인 정보 제공 - **강화된 Todo 연결**: Action item이 담당자의 Todo와 실시간으로 연결되고, 진행 상황이 회의록에 자동 반영 -- **프롬프팅 기반 회의록 개선**: AI를 활용한 다양한 형식의 회의록 생성 (1Page 요약, 핵심 요약 등) +- **섹션 AI 요약 재생성**: 버튼 클릭으로 작성한 섹션 내용을 AI가 요약 (2-3문장, 2-5초 처리) - **지능형 회의 진행 지원**: 회의 패턴 분석을 통한 안건 추천, 효율성 분석 및 개선 제안 --- @@ -38,7 +38,7 @@ 4. **AI** - AI 기반 회의록 자동화, Todo 추출, 지능형 검색 (RAG 통합) - LLM 기반 회의록 자동 작성 - Todo 자동 추출 및 담당자 식별 - - 프롬프팅 기반 회의록 개선 (1Page 요약, 핵심 요약 등) + - 섹션 AI 요약 재생성 (버튼 클릭 시 요약 생성) - 관련 회의록 자동 연결 (벡터 유사도 검색) - 전문용어 자동 감지 및 맥락 기반 설명 생성 (RAG) - 과거 회의록 및 사내 문서 검색 @@ -489,40 +489,41 @@ UFR-AI-020: [Todo자동추출] 회의록 작성자로서 | 나는, 회의 후 --- -3) 프롬프팅 기반 회의록 개선 (신규, 차별화 포인트) -UFR-AI-030: [회의록개선] 회의록 작성자로서 | 나는, 회의록을 다양한 형식으로 변환하기 위해 | 프롬프팅을 통해 회의록을 개선하고 재구성하고 싶다. -- 시나리오: 프롬프팅 기반 회의록 개선 - 회의록이 작성된 상황에서 | "1Page 요약", "핵심 요약", "상세 보고서" 등의 프롬프트를 입력하면 | AI가 해당 형식에 맞춰 회의록을 재구성하여 제공한다. +3) 섹션 AI 요약 재생성 (신규, 차별화 포인트) +UFR-AI-035: [섹션AI요약] 회의록 작성자로서 | 나는, 작성한 섹션 내용을 쉽게 요약하기 위해 | 버튼 클릭으로 AI가 섹션 내용을 요약해주기를 원한다. +- 시나리오: 섹션 AI 요약 재생성 + 회의록 작성/수정 중에 | 특정 섹션의 "AI 재생성" 버튼을 클릭하면 | AI가 해당 섹션 내용을 분석하여 2-3문장의 요약을 자동 생성한다. - [지원 프롬프트 유형] - - "1Page 요약": A4 1장 분량의 요약본 생성 - - "핵심 요약": 3-5개 핵심 포인트만 추출 - - "상세 보고서": 시간순 상세 기록 with 타임스탬프 - - "의사결정 중심": 결정 사항과 근거만 정리 - - "액션 아이템 중심": Todo와 담당자만 강조 - - "경영진 보고용": 임원진에게 보고할 형식으로 재구성 - - "커스텀 프롬프트": 사용자 정의 형식 + [사용 시점] + - 회의록 작성 중 각 섹션 완료 시 + - 회의록 수정 중 섹션 내용 변경 후 + - 기존 요약이 부적절하다고 판단될 때 [AI 처리 과정] - - 원본 회의록 분석 - - 프롬프트 의도 파악 - - 내용 재구성 - - 중요도 기반 필터링 - - 형식에 맞춘 재배치 - - 불필요한 내용 제거 - - 스타일 조정 - - 문체 변환 (격식체, 구어체 등) - - 길이 조정 (압축 또는 확장) + - 회의 맥락 조회 (선택적) + - 회의 제목, 참석자, 안건 파악 + - 섹션 내용 파싱 + - 논의사항 추출 + - 결정사항 추출 + - 보류사항 추출 + - 핵심 내용 식별 + - 중요도 평가 + - 키워드 추출 + - 요약 생성 + - 2-3문장으로 압축 + - 논의→결정 흐름 반영 + - 명확한 문장 구성 [처리 결과] - - 개선된 회의록이 생성됨 (새 버전) - - 원본 회의록 링크 유지 - - 생성 시간 및 프롬프트 기록 + - 생성된 AI 요약 (2-3문장, 150자 이내) + - 생성 시간 기록 + - 사용자는 생성된 요약을 다시 수정 가능 [Policy/Rule] - - 원본 회의록은 항상 보존 - - 여러 버전 동시 생성 가능 - - 버전 간 비교 기능 제공 + - 섹션 내용이 변경되면 요약도 재생성 가능 + - 이전 요약은 이력으로 보관 + - 처리 시간 2-5초 (빠른 응답) + - 프롬프트 입력 불필요 (자동 처리) - M/21 @@ -904,7 +905,7 @@ UFR-TODO-030: [Todo완료처리] Todo 담당자로서 | 나는, 완료된 Todo - **핵심 기능**: - LLM 기반 회의록 자동 작성 - Todo 자동 추출 및 담당자 식별 - - 프롬프팅 기반 회의록 개선 + - 섹션 AI 요약 재생성 (버튼 클릭 시 요약 생성) - 관련 회의록 자동 연결 (벡터 유사도 검색) - 전문용어 자동 감지 및 맥락 기반 설명 생성 (RAG) - 과거 회의록 및 사내 문서 검색