AI 기반 회의 관리 플랫폼 DialoG의 AI 서버 (FastAPI)
| 이름 | 담당 업무 |
|---|---|
| 김나운 | 실시간 STT 개발 (WebSocket 기반) 화자 구분 분석 시스템 구현 |
| 장문선 | 챗봇 시스템 개발 (회의 검색 + IT 용어 FAQ) CI/CD 파이프라인 구축 (GitHub Actions) |
| 지승엽 | HyperCLOVA X 회의 요약 생성 액션 아이템 자동 추출 기능 개발 |
fastapi==0.121.0
uvicorn==0.33.0
websockets==13.1
python-multipart
pymysql
mysql-connector-python
redis
httpx==0.27.0 # 비동기 HTTP 클라이언트
grpcio==1.70.0 # gRPC 통신
protobuf==5.29.5 # 직렬화
pydub==0.25.1 # 오디오 변환
soundfile==0.13.1 # 오디오 I/O
boto3==1.6.19 # AWS SDK
python-dotenv==1.0.1 # 환경 변수
pydantic==2.10.6 # 데이터 검증
loguru==0.7.3 # 로깅
arrow # 날짜 처리
python-dateutil # 날짜 파싱
dialog-ai-server/
│
├── 📄 main.py # FastAPI 메인 엔드포인트
│
├── 🎤 STT 관련
│ ├── sttStreaming.py # 실시간 STT (WebSocket gRPC)
│ ├── sttSpeaker.py # 화자 구분 분석
│ ├── nest.proto # gRPC 프로토콜 정의
│ └── nest_pb2.py # gRPC 생성 코드
│
├── 📝 요약 & 액션 아이템
│ ├── summary_service.py # 회의 요약 생성
│ └── action_service.py # 액션 아이템 생성
│
├── 🤖 챗봇 시스템
│ │
│ ├── 📂 chatbotFAQ/
│ │ ├── 📂 data/
│ │ │ └── terms_database.json # IT 용어 데이터베이스
│ │ └── chatbotFAQMain.py # IT 용어 FAQ 챗봇
│ │
│ └── 📂 chatbotSearch/
│ ├── chatbotSearchMain.py # 회의 검색 챗봇 (메인)
│ ├── search.py # 회의 검색 로직
│ ├── selection.py # 쿼리 타입 분류
│ ├── formatting.py # 응답 포맷팅
│ ├── llm.py # HyperCLOVA X API 호출
│ ├── database.py # MySQL 연결 관리
│ ├── context.py # Redis 컨텍스트 관리
│ ├── models.py # Pydantic 데이터 모델
│ └── config.py # 환경 변수 설정
│
└── 🚀 배포
├── Dockerfile # 컨테이너 이미지
├── deploy.yml # GitHub Actions CI/CD
├── requirements.txt # Python 라이브러리
└── .env # 환경 변수
담당: 김나운
- CLOVA Speech API 활용한 실시간 음성 인식
- WebSocket 기반 gRPC 스트리밍
- 실시간 텍스트 변환 및 전송
# sttStreaming.py
# WebSocket으로 실시간 음성 데이터 수신 → gRPC로 CLOVA에 전송 → 텍스트 반환담당: 김나운
- CLOVA Speech ExternalURL Async API 활용
- OBS(Object Storage)를 통한 비동기 처리
- 발화자별 발언 시간, 비율 통계 제공
지원 기능:
- ✅ 최소 2명 ~ 최대 10명 화자 자동 인식
- ✅ 발화자별 발언 시간 및 비율 계산
- ✅ 타임스탬프 기반 세그먼트 분리
담당: 지승엽
- HyperCLOVA X 기반 AI 요약
생성 항목 (5가지):
| 항목 | 설명 | 예시 |
|---|---|---|
| 회의 목적 | 한 문장 요약 | "Q4 예산 확정 및 일정 논의" |
| 주요 안건 | 3~5개 키워드 | "예산 확정, 일정 조율, 인력 배치" |
| 전체 요약 | 서술형 3문장 | "Q4 예산은 1억으로 확정되었으며..." |
| 중요도 | HIGH/MEDIUM/LOW + 사유 | "HIGH - 예산 결정으로 프로젝트 착수 가능" |
| 키워드 | 핵심 명사 5개 | "예산, 일정, 인력, API, 데이터베이스" |
직무별 페르소나 지원:
- 🔧 프로젝트 매니저 (PM)
- 🎨 프론트엔드 개발자
- ⚙️ 백엔드 개발자
- 🗄️ 데이터베이스 관리자 (DBA)
- 🔒 보안 전문가
- 📋 일반 (기본값)
담당: 지승엽
- 회의 내용에서 사용자의 할 일 자동 추출
- 날짜 자동 계산 (회의 날짜 기준)
- 담당자 자동 매핑 (화자 → 실명 변환)
추출 유형 (3가지):
1️⃣ 본인 작업 "API 명세서 작성 (장문선) [2025-12-15]"
2️⃣ 지시받은 작업 "DB 스키마 설계 (장문선) [2025-12-20]"
3️⃣ 팀 전체 작업 "[백엔드팀] 서버 성능 최적화 (담당자 미지정) [2025-12-30]"
담당: 장문선
- Template 기반 RAG 아키텍처 (비용 최적화)
- Redis 기반 컨텍스트 관리 (다회차 대화 지원)
- 자연어 질문 → SQL 쿼리 자동 변환
기본 검색 유형 (4가지):
| 검색 유형 | 예시 질문 | 처리 방식 |
|---|---|---|
| 날짜 검색 | "어제 회의 보여줘", "지난주 회의" | meeting_date 조건 검색 |
| 키워드 검색 | "API 관련 회의", "데이터베이스 논의" | keywords, purpose, agenda LIKE 검색 |
| 참가자 검색 | "김나운님 참석한 회의" | participants 컬럼 검색 |
| 할 일 검색 | "내 할 일", "미완료 업무" | action_items 테이블 조인 |
고급 기능:
1️⃣ 조합 질문 처리
"지난주 김나운님이 참석한 API 관련 회의"
→ 날짜 + 참가자 + 키워드 조합 검색
2️⃣ 단계적 완화 (검색 결과 없을 때)
1차 시도: 모든 조건 만족하는 회의 검색
↓ 결과 없음
2차 시도: 일부 조건 완화 (예: 날짜 범위 확대)
↓ 결과 없음
3차 시도: 핵심 키워드만으로 재검색
3️⃣ 상태별 분리 표시
- ✅ 완료된 할 일 - 체크 표시와 함께 표시
- ⏰ 예정된 할 일 - 마감일 강조 표시
⚠️ 지연된 할 일 - 경고 표시
4️⃣ 자연어 날짜 파싱
"이번주" → 2025-12-09 ~ 2025-12-15
"10월 27일부터 오늘" → 2025-10-27 ~ 2025-12-09
"어제" → 2025-12-08
"지난주 금요일" → 2025-12-06
5️⃣ 확인 질문 처리 (컨텍스트 기반)
사용자: "어제 회의 뭐했어?"
챗봇: [회의 2개 표시]
사용자: "그거 하나야?"
챗봇: "네, 어제는 총 2개의 회의가 있었습니다."
사용자: "더 없어?"
챗봇: "어제 회의는 이것이 전부입니다."
주요 기능:
- ✅ 페르소나 커스터마이징 (직무별 맞춤 응답)
- ✅ 컨텍스트 유지 (이전 질문 기억)
- ✅ 자연스러운 대화체 응답
- ✅ 복합 조건 검색 지원
- ✅ 지능형 오류 복구 (단계적 완화)
담당: 장문선
- 3-tier 폴백 시스템 (비용 최적화)
┌─────────────────────────────────────┐
│ Tier 1: JSON 데이터베이스 검색 │ ← 무료 (우선 시도)
│ (terms_database.json) │
└─────────────────────────────────────┘
↓ 실패 시
┌─────────────────────────────────────┐
│ Tier 2: CLOVA Chatbot Builder │ ← 저비용
└─────────────────────────────────────┘
↓ 실패 시
┌─────────────────────────────────────┐
│ Tier 3: HyperCLOVA X │ ← 고비용 (최종 폴백)
└─────────────────────────────────────┘
주요 기능:
- ✅ 100개 이상 IT 용어 데이터베이스
- ✅ 유사 용어 자동 매칭
- ✅ 오타 처리 및 비공식 표현 지원
┌────────────────┐
│ 회의 시작 │
└────────┬───────┘
│
▼
┌─────────────────────────────────────┐
│ 실시간 STT (sttStreaming.py) │ ← WebSocket + gRPC
│ 음성 → 텍스트 변환 │
└────────┬────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ 회의 종료 → 음성 파일 OBS 업로드 │
└────────┬────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ 화자 구분 분석 (sttSpeaker.py) │ ← Async 처리
│ 발화자 정보 추출 │
└────────┬────────────────────────────┘
│
├──────────────────┬──────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌──────────────┐ ┌──────────────┐
│ AI 요약 생성 │ │ 액션 아이템 │ │ 중요도 평가 │
│ (5가지 항목) │ │ 생성 │ │ (HIGH/LOW) │
└────────┬────────┘ └──────┬───────┘ └──────┬───────┘
│ │ │
└──────────────────┴──────────────────┘
│
▼
┌─────────────────┐
│ MySQL 저장 │
└─────────────────┘
┌─────────────────────┐
│ 사용자 질문 입력 │ 예: "어제 회의 뭐했어?"
└──────────┬──────────┘
│
▼
┌──────────────────────────────────────┐
│ 세션 확인 (Redis) │
│ - 이전 대화 컨텍스트 로드 │
└──────────┬───────────────────────────┘
│
▼
┌──────────────────────────────────────┐
│ 쿼리 타입 분류 (selection.py) │
│ → 날짜 / 키워드 / 참가자 / 할일 │
└──────────┬───────────────────────────┘
│
▼
┌──────────────────────────────────────┐
│ Template 기반 검색 (search.py) │ ← HyperCLOVA X 없이 처리
│ - SQL 쿼리 자동 생성 │ (비용 0원)
│ - MySQL 검색 실행 │
└──────────┬───────────────────────────┘
│
▼
┌──────────────────────────────────────┐
│ 응답 포맷팅 (formatting.py) │
│ - 검색 결과 → 자연어 변환 │
└──────────┬───────────────────────────┘
│
▼
┌──────────────────────────────────────┐
│ 컨텍스트 저장 (Redis, TTL 10분) │
└──────────┬───────────────────────────┘
│
▼
┌──────────────────────────────────────┐
│ 사용자에게 응답 반환 │
└──────────────────────────────────────┘
┌─────────────────────┐
│ 사용자 용어 질문 │ 예: "REST API가 뭐야?"
└──────────┬──────────┘
│
▼
┌──────────────────────────────────────┐
│ Tier 1: JSON DB 검색 │ ✅ 무료
│ (terms_database.json) │
└──────────┬───────────────────────────┘
│
│ 매칭 실패 시
▼
┌──────────────────────────────────────┐
│ Tier 2: CLOVA Chatbot Builder │ 💰 저비용
└──────────┬───────────────────────────┘
│
│ 매칭 실패 시
▼
┌──────────────────────────────────────┐
│ Tier 3: HyperCLOVA X │ 💰💰 고비용
└──────────┬───────────────────────────┘
│
▼
┌──────────────────────────────────────┐
│ 응답 반환 │
└──────────────────────────────────────┘
기존 방식: 모든 질문 → HyperCLOVA X → 💰💰💰
최적화 방식: Template 패턴 사용 → 💰 (0원)
✅ 결과: 80% 비용 절감
Tier 1: JSON 검색 (무료) ← 대부분 여기서 해결
Tier 2: CLOVA Chatbot Builder ← 저비용
Tier 3: HyperCLOVA X ← 최종 수단
# 5개 항목을 순차 호출 → 25초
# 5개 항목을 병렬 호출 → 5초 (asyncio.gather 사용)
✅ 결과: 응답 시간 80% 단축 + 서버 리소스 절약- 컨텍스트 TTL: 10분
- 불필요한 DB 조회 감소
- 빠른 응답 속도
- ✅ 서비스별 모듈 분리 (
summary_service,action_service,chatbot) - ✅ 직무별 페르소나 확장 가능
- ✅ 새로운 검색 유형 추가 용이
- ✅ 모든 API 호출에
try-except적용 - ✅ 타임아웃 설정 (30초)
- ✅ 상세한 에러 로깅 (
loguru)
- ✅ WebSocket 기반 실시간 STT
- ✅ 비동기 처리 (
asyncio,httpx) - ✅ 병렬 API 호출
- ✅ Template 우선 → LLM 최소화
- ✅ 3-tier 폴백 시스템
- ✅ Redis 캐싱