- Auto Polish: LLM으로 전사 다듬기 (필러 제거, 문장 교정) - AI 채팅: 회의 전사 기반 Q&A (LocalLLMService.chatStream 활용, 스트리밍) - 마인드맵: 빌트인 템플릿 추가 (마크다운 계층 트리) - 공유: 클립보드 복사 메뉴 추가 - MeetingChatPanel UI (접기/펼치기, 스트리밍 인디케이터) - TranscriptTab에 AI 다듬기 버튼 추가 - 12개 locale i18n 키 추가
205 lines
6.1 KiB
Markdown
205 lines
6.1 KiB
Markdown
# Phase 15: 회의 모드 Pro — Auto Polish + AI 채팅 + 마인드맵 + 공유
|
|
|
|
> Phase 14.5 기반 확장: AI 전사 다듬기, 회의록 기반 AI 채팅, 마인드맵 생성, 공유 링크
|
|
|
|
---
|
|
|
|
## 1. 개요
|
|
|
|
### 1.1 기능 4종
|
|
|
|
| 기능 | 설명 | 난이도 |
|
|
|------|------|--------|
|
|
| **Auto Polish** | 전사 텍스트 AI 다듬기 (필러 제거, 가독성 향상) | 소 |
|
|
| **마인드맵** | 전사 내용에서 AI 마인드맵 생성 (마크다운 트리) | 소 |
|
|
| **AI 채팅** | 회의 전사 기반 Q&A 채팅 | 중 |
|
|
| **공유** | 마크다운 → 클립보드 복사 + 파일 공유 | 소 |
|
|
|
|
**화자 구분**: sidecar에 pyannote-audio 추가 필요 → TODO로 유지
|
|
|
|
---
|
|
|
|
## 2. Auto Polish
|
|
|
|
### 2.1 동작 방식
|
|
1. Transcript 탭에서 [AI 다듬기] 버튼 클릭
|
|
2. rawTranscript를 LLM에 전달 (refine 프롬프트)
|
|
3. 결과를 editedTranscript에 저장
|
|
4. "원본/AI 다듬기본" 토글 가능
|
|
|
|
### 2.2 IPC
|
|
```
|
|
MEETING_MODE.POLISH_TRANSCRIPT: 'meetingMode:polishTranscript'
|
|
```
|
|
|
|
### 2.3 서비스 메서드
|
|
```typescript
|
|
async polishTranscript(sessionId: string): Promise<string> {
|
|
// rawTranscript → LLM refine → editedTranscript 저장 → 반환
|
|
}
|
|
```
|
|
|
|
### 2.4 UI
|
|
TranscriptTab에 [AI 다듬기] PhysicalButton 추가. 처리 중 LinearProgress.
|
|
|
|
---
|
|
|
|
## 3. 마인드맵
|
|
|
|
### 3.1 동작 방식
|
|
MeetingDocTemplateType에 'mindmap' 추가. 빌트인 템플릿으로 등록.
|
|
LLM이 마크다운 트리 구조로 마인드맵 생성. DocumentTab에서 렌더링.
|
|
|
|
### 3.2 프롬프트
|
|
```
|
|
전사록을 분석하여 마인드맵을 작성하세요.
|
|
마크다운 계층 구조를 사용하세요:
|
|
# 중심 주제
|
|
## 주요 주제 1
|
|
- 세부 항목 A
|
|
- 세부 항목 B
|
|
## 주요 주제 2
|
|
- 세부 항목 C
|
|
```
|
|
|
|
### 3.3 DB 변경
|
|
`meetingDocuments.templateType` enum에 'mindmap' 추가.
|
|
`meetingSessions.templateType` (schema.ts) enum에 'mindmap' 추가.
|
|
|
|
---
|
|
|
|
## 4. AI 채팅
|
|
|
|
### 4.1 동작 방식
|
|
1. 상세 페이지 하단에 채팅 바 (고정, 탭과 별개)
|
|
2. 사용자가 질문 입력 → 전사+문서를 컨텍스트로 LLM 질문
|
|
3. 스트리밍 응답 표시
|
|
4. 대화 히스토리는 메모리에만 유지 (DB 저장 안 함)
|
|
|
|
### 4.2 IPC
|
|
```
|
|
MEETING_CHAT: {
|
|
SEND: 'meetingChat:send',
|
|
CANCEL: 'meetingChat:cancel',
|
|
CLEAR: 'meetingChat:clear',
|
|
// Main → Renderer
|
|
DELTA: 'meetingChat:delta',
|
|
MESSAGE: 'meetingChat:message',
|
|
ERROR: 'meetingChat:error',
|
|
}
|
|
```
|
|
|
|
### 4.3 서비스
|
|
MeetingModeService에 채팅 메서드 추가 (별도 서비스 불필요):
|
|
```typescript
|
|
async chatWithMeeting(sessionId: string, userMessage: string): Promise<void>
|
|
cancelMeetingChat(): void
|
|
clearMeetingChatHistory(): void
|
|
```
|
|
|
|
LocalLLMService.chatStream() 활용. 시스템 프롬프트에 전사 내용 포함.
|
|
|
|
### 4.4 UI
|
|
MeetingDetailTabs 하단에 고정 채팅 바:
|
|
```
|
|
┌──────────────────────────────────────┐
|
|
│ [탭 콘텐츠...] │
|
|
├──────────────────────────────────────┤
|
|
│ 🤖 AI: 예산은 5000만원으로 확정... │
|
|
│ 👤 다음 회의 일정은? │
|
|
│ 🤖 AI: 다음 주 수요일... │
|
|
│ ┌──────────────────────────┐ [Send] │
|
|
│ │ 질문을 입력하세요... │ │
|
|
│ └──────────────────────────┘ │
|
|
└──────────────────────────────────────┘
|
|
```
|
|
|
|
### 4.5 타입
|
|
```typescript
|
|
interface MeetingChatMessage {
|
|
role: 'user' | 'assistant'
|
|
content: string
|
|
timestamp: number
|
|
}
|
|
|
|
interface MeetingChatSendParams {
|
|
sessionId: string
|
|
message: string
|
|
}
|
|
|
|
interface MeetingChatDelta {
|
|
token: string
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 5. 공유
|
|
|
|
### 5.1 동작 방식
|
|
1. 클립보드 복사: 문서/전사 마크다운을 클립보드에 복사
|
|
2. 파일 공유: 기존 내보내기(MD/PDF/TXT/DOCX)로 파일 저장
|
|
3. 향후: 웹 서비스 연동 (TODO)
|
|
|
|
### 5.2 UI
|
|
ExportMenu에 "클립보드 복사" 항목 추가.
|
|
|
|
---
|
|
|
|
## 6. 에러 코드
|
|
```typescript
|
|
MeetingPolishFailed = 893,
|
|
MeetingChatFailed = 894,
|
|
```
|
|
|
|
---
|
|
|
|
## 7. i18n 키
|
|
```json
|
|
"meeting.polish": "AI 다듬기",
|
|
"meeting.polishing": "AI가 전사를 다듬고 있습니다...",
|
|
"meeting.polished": "AI 다듬기 완료",
|
|
"meeting.mindmapTemplate": "마인드맵",
|
|
"meeting.chat": "AI 채팅",
|
|
"meeting.chatPlaceholder": "회의 내용에 대해 질문하세요...",
|
|
"meeting.chatSend": "전송",
|
|
"meeting.chatClear": "대화 초기화",
|
|
"meeting.copyToClipboard": "클립보드 복사",
|
|
"meeting.copied": "복사됨"
|
|
```
|
|
|
|
---
|
|
|
|
## 8. 구현 순서
|
|
|
|
### Step A: 기반 (타입 + IPC + 에러)
|
|
### Step B: Auto Polish (서비스 + IPC + UI)
|
|
### Step C: 마인드맵 (템플릿 추가 + DB enum)
|
|
### Step D: AI 채팅 (서비스 + IPC + UI)
|
|
### Step E: 공유 (클립보드 복사)
|
|
### Step F: i18n + 검증
|
|
|
|
---
|
|
|
|
## 파일 목록
|
|
|
|
### 신규
|
|
| 파일 | 설명 |
|
|
|------|------|
|
|
| `src/renderer/components/meeting/MeetingChatPanel.tsx` | AI 채팅 UI |
|
|
|
|
### 수정
|
|
| 파일 | 변경 |
|
|
|------|------|
|
|
| `src/shared/types.ts` | MeetingChatMessage, MeetingChatSendParams, MeetingChatDelta, MeetingDocTemplateType에 mindmap 추가 |
|
|
| `src/shared/ipc-channels.ts` | MEETING_MODE.POLISH_TRANSCRIPT + MEETING_CHAT 그룹 |
|
|
| `src/shared/errors.ts` | 893-894 |
|
|
| `src/main/db/schema.ts` | meetingDocuments templateType enum에 mindmap |
|
|
| `src/main/services/MeetingModeService.ts` | polishTranscript, chatWithMeeting, cancelMeetingChat, clearMeetingChatHistory |
|
|
| `src/main/services/MeetingDocTemplateService.ts` | 빌트인 마인드맵 템플릿 |
|
|
| `src/main/ipc/meeting-mode-handlers.ts` | 4개 핸들러 추가 |
|
|
| `src/preload/index.ts` | meetingChat 그룹 + polishTranscript |
|
|
| `src/renderer/components/meeting/TranscriptTab.tsx` | AI 다듬기 버튼 |
|
|
| `src/renderer/components/meeting/MeetingDetailTabs.tsx` | 하단 채팅 패널 |
|
|
| `src/renderer/components/meeting/ExportMenu.tsx` | 클립보드 복사 |
|
|
| `src/renderer/i18n/*.json` | 12개 locale |
|