This commit is contained in:
yabo0812 2025-10-23 13:52:44 +09:00
commit 0602dd0740
17 changed files with 778 additions and 357 deletions

View File

@ -503,8 +503,8 @@ Product Designer (UI/UX 전문가)
- develop/database/exec/db-exec-dev.md
- develop/database/exec/db-exec-prod.md
- 캐시설치결과서
- develop/database/exec/cache-exec-{service-name}-dev.md
- develop/database/exec/cache-exec-{service-name}-prod.md
- develop/database/exec/cache-exec-dev.md
- develop/database/exec/cache-exec-prod.md
- MQ설치결과서
- develop/mq/mq-exec-dev.md
- develop/mq/mq-exec-prod.md

View File

@ -0,0 +1,16 @@
apiVersion: v1
kind: Service
metadata:
name: ai-postgresql-external
spec:
ports:
- name: tcp-postgresql
port: 5432
protocol: TCP
targetPort: tcp-postgresql
selector:
app.kubernetes.io/component: primary
app.kubernetes.io/instance: ai
app.kubernetes.io/name: postgresql
sessionAffinity: None
type: LoadBalancer

View File

@ -0,0 +1,16 @@
apiVersion: v1
kind: Service
metadata:
name: meeting-postgresql-external
spec:
ports:
- name: tcp-postgresql
port: 5432
protocol: TCP
targetPort: tcp-postgresql
selector:
app.kubernetes.io/component: primary
app.kubernetes.io/instance: meeting
app.kubernetes.io/name: postgresql
sessionAffinity: None
type: LoadBalancer

View File

@ -0,0 +1,16 @@
apiVersion: v1
kind: Service
metadata:
name: notification-postgresql-external
spec:
ports:
- name: tcp-postgresql
port: 5432
protocol: TCP
targetPort: tcp-postgresql
selector:
app.kubernetes.io/component: primary
app.kubernetes.io/instance: notification
app.kubernetes.io/name: postgresql
sessionAffinity: None
type: LoadBalancer

View File

@ -0,0 +1,20 @@
apiVersion: v1
kind: Service
metadata:
name: redis-external
spec:
ports:
- name: tcp-redis
port: 6379
protocol: TCP
targetPort: redis
- name: tcp-sentinel
port: 26379
protocol: TCP
targetPort: redis-sentinel
publishNotReadyAddresses: true
selector:
app.kubernetes.io/instance: redis
app.kubernetes.io/name: redis
sessionAffinity: None
type: LoadBalancer

View File

@ -0,0 +1,16 @@
apiVersion: v1
kind: Service
metadata:
name: stt-postgresql-external
spec:
ports:
- name: tcp-postgresql
port: 5432
protocol: TCP
targetPort: tcp-postgresql
selector:
app.kubernetes.io/component: primary
app.kubernetes.io/instance: stt
app.kubernetes.io/name: postgresql
sessionAffinity: None
type: LoadBalancer

View File

@ -0,0 +1,16 @@
apiVersion: v1
kind: Service
metadata:
name: user-postgresql-external
spec:
ports:
- name: tcp-postgresql
port: 5432
protocol: TCP
targetPort: tcp-postgresql
selector:
app.kubernetes.io/component: primary
app.kubernetes.io/instance: user
app.kubernetes.io/name: postgresql
sessionAffinity: None
type: LoadBalancer

View File

@ -0,0 +1,68 @@
architecture: replication
auth:
enabled: true
password: "Hi5Jessica!"
master:
persistence:
enabled: true
storageClass: "managed"
size: 10Gi
configuration: |
maxmemory 1610612736
maxmemory-policy allkeys-lru
appendonly yes
appendfsync everysec
save 900 1 300 10 60 10000
resources:
limits:
memory: "2Gi"
cpu: "1"
requests:
memory: "1Gi"
cpu: "0.5"
replica:
replicaCount: 2
persistence:
enabled: true
storageClass: "managed"
size: 10Gi
configuration: |
maxmemory 1610612736
maxmemory-policy allkeys-lru
resources:
limits:
memory: "2Gi"
cpu: "1"
requests:
memory: "1Gi"
cpu: "0.5"
sentinel:
enabled: true
quorum: 2
image:
registry: registry-1.docker.io
repository: bitnamilegacy/redis-sentinel
service:
type: ClusterIP
ports:
redis: 6379
podAntiAffinityPreset: soft
securityContext:
enabled: true
fsGroup: 1001
runAsUser: 1001
# image: organization이 bitnami -> bitnamilegacy로 변경
image:
registry: registry-1.docker.io
repository: bitnamilegacy/redis

View File

@ -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

View File

@ -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

View File

@ -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 요약 재생성으로 변경 (프로토타입 반영) |

View File

@ -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

View File

@ -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

View File

@ -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)
- 과거 회의록 및 사내 문서 검색
@ -497,40 +497,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
@ -912,7 +913,7 @@ UFR-TODO-030: [Todo완료처리] Todo 담당자로서 | 나는, 완료된 Todo
- **핵심 기능**:
- LLM 기반 회의록 자동 작성
- Todo 자동 추출 및 담당자 식별
- 프롬프팅 기반 회의록 개선
- 섹션 AI 요약 재생성 (버튼 클릭 시 요약 생성)
- 관련 회의록 자동 연결 (벡터 유사도 검색)
- 전문용어 자동 감지 및 맥락 기반 설명 생성 (RAG)
- 과거 회의록 및 사내 문서 검색

View File

@ -0,0 +1,5 @@
# 캐시설치결과서
- DB 유형: Redis
- DB Host: 20.249.177.114
- DB Port: 6379
- DB Password: Hi5Jessica!

View File

@ -0,0 +1,90 @@
# 데이터베이스설치결과서
## 1. AI 서비스
- DB 유형: PostgreSQL
- DB Host: 20.249.153.213
- DB Port: 5432
- DB Username: hgzerouser
- DB Password: Hi5Jessica!
- DB Name: aidb
---
## 2. Meeting 서비스
- DB 유형: PostgreSQL
- DB Host: 4.230.48.72
- DB Port: 5432
- DB Username: hgzerouser
- DB Password: Hi5Jessica!
- DB Name: meetingdb
---
## 3. Notification 서비스
- DB 유형: PostgreSQL
- DB Host: 4.230.159.143
- DB Port: 5432
- DB Username: hgzerouser
- DB Password: Hi5Jessica!
- DB Name: notificationdb
---
## 4. STT 서비스
- DB 유형: PostgreSQL
- DB Host: 4.230.65.89
- DB Port: 5432
- DB Username: hgzerouser
- DB Password: Hi5Jessica!
- DB Name: sttdb
---
## 5. User 서비스
- DB 유형: PostgreSQL
- DB Host: 20.214.121.121
- DB Port: 5432
- DB Username: hgzerouser
- DB Password: Hi5Jessica!
- DB Name: userdb
---
## 설치 요약
### PostgreSQL 데이터베이스 (5개)
| 서비스 | Host | Port | Database | Username | Password |
|--------|------|------|----------|----------|----------|
| ai | 20.249.153.213 | 5432 | aidb | hgzerouser | Hi5Jessica! |
| meeting | 4.230.48.72 | 5432 | meetingdb | hgzerouser | Hi5Jessica! |
| notification | 4.230.159.143 | 5432 | notificationdb | hgzerouser | Hi5Jessica! |
| stt | 4.230.65.89 | 5432 | sttdb | hgzerouser | Hi5Jessica! |
| user | 20.214.121.121 | 5432 | userdb | hgzerouser | Hi5Jessica! |
---
## 접속 정보 확인
### PostgreSQL 접속 예시
```bash
# AI 서비스 DB 접속
psql -h 20.249.153.213 -p 5432 -U hgzerouser -d aidb
# Meeting 서비스 DB 접속
psql -h 4.230.48.72 -p 5432 -U hgzerouser -d meetingdb
# Notification 서비스 DB 접속
psql -h 4.230.159.143 -p 5432 -U hgzerouser -d notificationdb
# STT 서비스 DB 접속
psql -h 4.230.65.89 -p 5432 -U hgzerouser -d sttdb
# User 서비스 DB 접속
psql -h 20.214.121.121 -p 5432 -U hgzerouser -d userdb
```
---
## 비고
- 모든 PostgreSQL 데이터베이스는 동일한 인증 정보를 사용합니다 (hgzerouser/Hi5Jessica!)
- 개발 환경(dev)을 위한 설치 결과입니다

View File

@ -0,0 +1,8 @@
# MQ설치결과서
- EventHub Name: hgzero-eventhub-name
- EventHub Namespace: hgzero-eventhub-ns
- EventHub Connection String: Endpoint=sb://hgzero-eventhub-ns.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=VUqZ9vFgu35E3c6RiUzoOGVUP8IZpFvlV+AEhC6sUpo=
- Storage Account ID: hgzerostorge
- Storage Connection String: DefaultEndpointsProtocol=https;EndpointSuffix=core.windows.net;AccountName=hgzerostorage;AccountKey=xOQGJhDT6sqOGyTohS7K5dMgGNlryuaQSg8dNCJ40sdGpYok5T5Z88M3xVlk39oeFKiQdGYCihqC+AStBsoBPw==;BlobEndpoint=https://hgzerostorage.blob.core.windows.net/;FileEndpoint=https://hgzerostorage.file.core.windows.net/;QueueEndpoint=https://hgzerostorage.queue.core.windows.net/;TableEndpoint=https://hgzerostorage.table.core.windows.net/
- Storage Container ID: hgzero-checkpoints