mirror of
https://github.com/hwanny1128/HGZero.git
synced 2025-12-06 12:36:23 +00:00
✅ 구현 완료 - AI Python Service (FastAPI, Claude API, 8087 포트) - POST /api/v1/transcripts/consolidate - 참석자별 회의록 → AI 통합 분석 - 키워드/안건별 요약/Todo 추출 - Meeting Service AI 통합 - EndMeetingService (@Primary) - AIServiceClient (RestTemplate, 30초 timeout) - AI 분석 결과 저장 (meeting_analysis, todos) - 회의 상태 COMPLETED 처리 - DTO 구조 (간소화) - ConsolidateRequest/Response - MeetingEndDTO - Todo 제목만 포함 (담당자/마감일 제거) 📝 기술스택 - Python: FastAPI, anthropic 0.71.0, psycopg2 - Java: Spring Boot, RestTemplate - Claude: claude-3-5-sonnet-20241022 🔧 주요 이슈 해결 - 포트 충돌: 8086(feature/stt-ai) → 8087(feat/meeting-ai) - Bean 충돌: @Primary 추가 - YAML 문법: ai.service.url 구조 수정 - anthropic 라이브러리 업그레이드 📚 테스트 가이드 및 스크립트 작성 - claude/MEETING-AI-TEST-GUIDE.md - test-meeting-ai.sh 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
393 lines
8.8 KiB
Markdown
393 lines
8.8 KiB
Markdown
# Meeting AI 통합 실행 및 테스트 가이드
|
|
|
|
작성일: 2025-10-28
|
|
작성자: 이동욱 (Backend Developer)
|
|
|
|
## 📋 목차
|
|
1. [사전 준비](#사전-준비)
|
|
2. [AI Python Service 실행](#ai-python-service-실행)
|
|
3. [Meeting Service 실행](#meeting-service-실행)
|
|
4. [통합 테스트](#통합-테스트)
|
|
5. [트러블슈팅](#트러블슈팅)
|
|
|
|
---
|
|
|
|
## 사전 준비
|
|
|
|
### 1. 포트 확인
|
|
```bash
|
|
# 포트 사용 확인
|
|
lsof -i :8082 # Meeting Service
|
|
lsof -i :8087 # AI Python Service
|
|
```
|
|
|
|
### 2. 데이터베이스 확인
|
|
```sql
|
|
-- PostgreSQL 연결 확인
|
|
psql -h 4.230.48.72 -U hgzerouser -d meetingdb
|
|
|
|
-- 필요한 테이블 확인
|
|
\dt meeting_analysis
|
|
\dt todos
|
|
\dt meetings
|
|
\dt agenda_sections
|
|
```
|
|
|
|
### 3. Redis 확인
|
|
```bash
|
|
# Redis 연결 테스트
|
|
redis-cli -h 20.249.177.114 -p 6379 -a Hi5Jessica! ping
|
|
```
|
|
|
|
---
|
|
|
|
## AI Python Service 실행
|
|
|
|
### 1. 디렉토리 이동
|
|
```bash
|
|
cd /Users/jominseo/HGZero/ai-python
|
|
```
|
|
|
|
### 2. 환경 변수 확인
|
|
```bash
|
|
# .env 파일 확인 (없으면 .env.example에서 복사)
|
|
cat .env
|
|
|
|
# 필수 환경 변수:
|
|
# - PORT=8087
|
|
# - CLAUDE_API_KEY=sk-ant-api03-...
|
|
# - REDIS_HOST=20.249.177.114
|
|
# - REDIS_PORT=6379
|
|
```
|
|
|
|
### 3. 의존성 설치
|
|
```bash
|
|
# Python 가상환경 활성화 (선택사항)
|
|
source venv/bin/activate # 또는 python3 -m venv venv
|
|
|
|
# 의존성 설치
|
|
pip install -r requirements.txt
|
|
```
|
|
|
|
### 4. 서비스 실행
|
|
```bash
|
|
# 방법 1: 직접 실행
|
|
python3 main.py
|
|
|
|
# 방법 2: uvicorn으로 실행
|
|
uvicorn main:app --host 0.0.0.0 --port 8087 --reload
|
|
|
|
# 방법 3: 백그라운드 실행
|
|
nohup python3 main.py > logs/ai-python.log 2>&1 & echo "Started AI Python Service with PID: $!"
|
|
```
|
|
|
|
### 5. 상태 확인
|
|
```bash
|
|
# Health Check
|
|
curl http://localhost:8087/health
|
|
|
|
# 기대 응답:
|
|
# {"status":"healthy","service":"AI Service (Python)"}
|
|
|
|
# API 문서 확인
|
|
open http://localhost:8087/docs
|
|
```
|
|
|
|
---
|
|
|
|
## Meeting Service 실행
|
|
|
|
### 1. 디렉토리 이동
|
|
```bash
|
|
cd /Users/jominseo/HGZero
|
|
```
|
|
|
|
### 2. 빌드
|
|
```bash
|
|
# Java 21 사용
|
|
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home
|
|
|
|
# 빌드
|
|
./gradlew :meeting:clean :meeting:build -x test
|
|
```
|
|
|
|
### 3. 실행
|
|
```bash
|
|
# 방법 1: Gradle로 실행
|
|
./gradlew :meeting:bootRun
|
|
|
|
# 방법 2: JAR 실행
|
|
java -jar meeting/build/libs/meeting-0.0.1-SNAPSHOT.jar
|
|
|
|
# 방법 3: IntelliJ 실행 프로파일 사용
|
|
python3 tools/run-intellij-service-profile.py meeting
|
|
```
|
|
|
|
### 4. 상태 확인
|
|
```bash
|
|
# Health Check
|
|
curl http://localhost:8082/actuator/health
|
|
|
|
# Swagger UI
|
|
open http://localhost:8082/swagger-ui.html
|
|
```
|
|
|
|
---
|
|
|
|
## 통합 테스트
|
|
|
|
### 테스트 시나리오
|
|
|
|
#### 1. 회의 생성 (사전 작업)
|
|
```bash
|
|
curl -X POST http://localhost:8082/api/meetings \
|
|
-H "Content-Type: application/json" \
|
|
-H "X-User-Id: user123" \
|
|
-H "X-User-Name: 홍길동" \
|
|
-H "X-User-Email: hong@example.com" \
|
|
-d '{
|
|
"title": "AI 통합 테스트 회의",
|
|
"purpose": "Meeting AI 기능 테스트",
|
|
"scheduledAt": "2025-10-28T14:00:00",
|
|
"endTime": "2025-10-28T15:00:00",
|
|
"location": "회의실 A",
|
|
"participantIds": ["user123", "user456"]
|
|
}'
|
|
```
|
|
|
|
응답에서 `meetingId` 저장
|
|
|
|
|
|
#### 2. 회의 시작
|
|
```bash
|
|
MEETING_ID="위에서 받은 meetingId"
|
|
|
|
curl -X POST http://localhost:8082/api/meetings/${MEETING_ID}/start \
|
|
-H "X-User-Id: user123" \
|
|
-H "X-User-Name: 홍길동" \
|
|
-H "X-User-Email: hong@example.com"
|
|
```
|
|
|
|
|
|
#### 3. 안건 섹션 생성 (테스트 데이터)
|
|
```sql
|
|
-- PostgreSQL에서 직접 실행
|
|
INSERT INTO agenda_sections (
|
|
id, minutes_id, meeting_id, agenda_number, agenda_title,
|
|
ai_summary_short, discussions,
|
|
decisions, pending_items, opinions, todos,
|
|
created_at, updated_at
|
|
) VALUES (
|
|
'agenda-001', 'minutes-001', '위의_meetingId', 1, '신제품 기획',
|
|
NULL,
|
|
'타겟 고객층을 20-30대로 설정하고 UI/UX 개선에 집중하기로 논의했습니다.',
|
|
'["타겟 고객: 20-30대 직장인", "UI/UX 개선 최우선"]'::json,
|
|
'["가격 정책 추가 검토 필요"]'::json,
|
|
'[]'::json,
|
|
'[]'::json,
|
|
NOW(), NOW()
|
|
),
|
|
(
|
|
'agenda-002', 'minutes-001', '위의_meetingId', 2, '마케팅 전략',
|
|
NULL,
|
|
'SNS 마케팅과 인플루언서 협업을 통한 브랜드 인지도 제고 방안을 논의했습니다.',
|
|
'["SNS 광고 집행", "인플루언서 3명과 계약"]'::json,
|
|
'["예산 승인 대기"]'::json,
|
|
'[]'::json,
|
|
'[]'::json,
|
|
NOW(), NOW()
|
|
);
|
|
```
|
|
|
|
|
|
#### 4. **핵심 테스트: 회의 종료 API 호출**
|
|
```bash
|
|
curl -X POST http://localhost:8082/api/meetings/${MEETING_ID}/end \
|
|
-H "X-User-Id: user123" \
|
|
-H "X-User-Name: 홍길동" \
|
|
-H "X-User-Email: hong@example.com" \
|
|
-v
|
|
```
|
|
|
|
**기대 응답:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"data": {
|
|
"title": "AI 통합 테스트 회의",
|
|
"participantCount": 2,
|
|
"durationMinutes": 60,
|
|
"agendaCount": 2,
|
|
"todoCount": 5,
|
|
"keywords": ["신제품", "UI/UX", "마케팅", "SNS", "인플루언서"],
|
|
"agendaSummaries": [
|
|
{
|
|
"title": "안건 1: 신제품 기획",
|
|
"aiSummaryShort": "타겟 고객 설정 및 UI/UX 개선 방향 논의",
|
|
"details": {
|
|
"discussion": "타겟 고객층을 20-30대로 설정...",
|
|
"decisions": ["타겟 고객: 20-30대 직장인", "UI/UX 개선 최우선"],
|
|
"pending": ["가격 정책 추가 검토 필요"]
|
|
},
|
|
"todos": [
|
|
{"title": "시장 조사 보고서 작성"},
|
|
{"title": "UI/UX 개선안 프로토타입 제작"}
|
|
]
|
|
},
|
|
{
|
|
"title": "안건 2: 마케팅 전략",
|
|
"aiSummaryShort": "SNS 마케팅 및 인플루언서 협업 계획",
|
|
"details": {
|
|
"discussion": "SNS 마케팅과 인플루언서 협업...",
|
|
"decisions": ["SNS 광고 집행", "인플루언서 3명과 계약"],
|
|
"pending": ["예산 승인 대기"]
|
|
},
|
|
"todos": [
|
|
{"title": "인플루언서 계약서 작성"},
|
|
{"title": "SNS 광고 컨텐츠 제작"},
|
|
{"title": "예산안 제출"}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
|
|
#### 5. 결과 확인
|
|
|
|
**데이터베이스 확인:**
|
|
```sql
|
|
-- 회의 상태 확인
|
|
SELECT meeting_id, title, status, ended_at
|
|
FROM meetings
|
|
WHERE meeting_id = '위의_meetingId';
|
|
-- 기대: status = 'COMPLETED'
|
|
|
|
-- AI 분석 결과 확인
|
|
SELECT analysis_id, meeting_id, keywords, status, completed_at
|
|
FROM meeting_analysis
|
|
WHERE meeting_id = '위의_meetingId';
|
|
|
|
-- Todo 확인
|
|
SELECT todo_id, title, status
|
|
FROM todos
|
|
WHERE meeting_id = '위의_meetingId';
|
|
-- 기대: 5개의 Todo 생성
|
|
```
|
|
|
|
**로그 확인:**
|
|
```bash
|
|
# AI Python Service 로그
|
|
tail -f logs/ai-python.log
|
|
|
|
# Meeting Service 로그
|
|
tail -f meeting/logs/meeting-service.log
|
|
```
|
|
|
|
---
|
|
|
|
## 트러블슈팅
|
|
|
|
### 1. AI Python Service 연결 실패
|
|
```
|
|
에러: Connection refused (8087)
|
|
|
|
해결:
|
|
1. AI Python Service가 실행 중인지 확인
|
|
ps aux | grep python | grep main.py
|
|
2. 포트 확인
|
|
lsof -i :8087
|
|
3. 로그 확인
|
|
tail -f logs/ai-python.log
|
|
```
|
|
|
|
### 2. Claude API 오류
|
|
```
|
|
에러: Invalid API key
|
|
|
|
해결:
|
|
1. .env 파일의 CLAUDE_API_KEY 확인
|
|
2. API 키 유효성 확인
|
|
curl https://api.anthropic.com/v1/messages \
|
|
-H "x-api-key: $CLAUDE_API_KEY" \
|
|
-H "anthropic-version: 2023-06-01"
|
|
```
|
|
|
|
### 3. 데이터베이스 연결 실패
|
|
```
|
|
에러: Connection to 4.230.48.72:5432 refused
|
|
|
|
해결:
|
|
1. PostgreSQL 서버 상태 확인
|
|
2. 방화벽 규칙 확인
|
|
3. application.yml의 DB 설정 확인
|
|
```
|
|
|
|
### 4. 타임아웃 오류
|
|
```
|
|
에러: Read timeout (30초)
|
|
|
|
해결:
|
|
1. application.yml에서 타임아웃 증가
|
|
ai.service.timeout=60000
|
|
2. Claude API 응답 시간 확인
|
|
3. 네트워크 상태 확인
|
|
```
|
|
|
|
### 5. 안건 데이터 없음
|
|
```
|
|
에러: No agenda sections found
|
|
|
|
해결:
|
|
1. agenda_sections 테이블에 데이터 확인
|
|
SELECT * FROM agenda_sections WHERE meeting_id = '해당ID';
|
|
2. 테스트 데이터 삽입 (위 SQL 참조)
|
|
```
|
|
|
|
---
|
|
|
|
## 성능 측정
|
|
|
|
### 응답 시간 측정
|
|
```bash
|
|
# 회의 종료 API 응답 시간
|
|
time curl -X POST http://localhost:8082/api/meetings/${MEETING_ID}/end \
|
|
-H "X-User-Id: user123" \
|
|
-H "X-User-Name: 홍길동" \
|
|
-H "X-User-Email: hong@example.com"
|
|
|
|
# 기대 시간: 5-15초 (Claude API 호출 포함)
|
|
```
|
|
|
|
### 동시성 테스트
|
|
```bash
|
|
# Apache Bench로 부하 테스트 (선택사항)
|
|
ab -n 10 -c 2 -H "X-User-Id: user123" \
|
|
http://localhost:8087/health
|
|
```
|
|
|
|
---
|
|
|
|
## 체크리스트
|
|
|
|
- [ ] AI Python Service 실행 (8087)
|
|
- [ ] Meeting Service 실행 (8082)
|
|
- [ ] 데이터베이스 연결 확인
|
|
- [ ] Redis 연결 확인
|
|
- [ ] 회의 생성 API 성공
|
|
- [ ] 회의 시작 API 성공
|
|
- [ ] 안건 데이터 삽입
|
|
- [ ] **회의 종료 API 성공**
|
|
- [ ] AI 분석 결과 저장 확인
|
|
- [ ] Todo 자동 생성 확인
|
|
- [ ] 회의 상태 COMPLETED 확인
|
|
|
|
---
|
|
|
|
## 참고 링크
|
|
|
|
- AI Python Service: http://localhost:8087/docs
|
|
- Meeting Service Swagger: http://localhost:8082/swagger-ui.html
|
|
- Claude API 문서: https://docs.anthropic.com/claude/reference
|