Feat: AI 서비스 통합 및 회의록 기능 개선

- AI 서비스와 Meeting 서비스 통합 개선
  - AgendaSummaryDTO에 decisions 필드 추가 (안건별 결정사항 배열)
  - EndMeetingService에서 AI 서비스 타임아웃 처리 개선
  - AIServiceClient에 상세한 에러 로깅 추가

- 회의록 consolidate 프롬프트 개선
  - Todo 추출 로직 강화 (자연스러운 표현 인식)
  - 안건별 decisions 필드 추가 (대시보드 표시용)
  - 담당자 패턴 인식 개선

- Kubernetes 배포 설정 개선
  - meeting-service.yaml에 AI_SERVICE_URL 환경변수 추가
  - AI_SERVICE_TIMEOUT 설정 추가

- 데이터베이스 관리 SQL 스크립트 추가
  - check-agenda-sections.sql: 안건 섹션 확인
  - cleanup-test-data.sql: 테스트 데이터 정리
  - insert-test-data-final.sql: 최종 테스트 데이터

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Minseo-Jo
2025-10-30 18:07:57 +09:00
parent 4a87be88f0
commit 0caa1ec3b6
11 changed files with 458 additions and 54 deletions
+1
View File
@@ -30,6 +30,7 @@ class AgendaSummary(BaseModel):
agenda_title: str = Field(..., description="안건 제목")
summary_short: str = Field(..., description="AI 생성 짧은 요약 (1줄, 20자 이내)")
summary: str = Field(..., description="안건별 회의록 요약 (논의사항+결정사항, 사용자 수정 가능)")
decisions: List[str] = Field(default_factory=list, description="안건별 결정사항 배열 (대시보드 표시용)")
pending: List[str] = Field(default_factory=list, description="보류 사항")
todos: List[ExtractedTodo] = Field(default_factory=list, description="Todo 목록 (제목만)")
+25 -7
View File
@@ -49,13 +49,23 @@ def get_consolidate_prompt(participant_minutes: list, agendas: list = None) -> s
- **agenda_number**: 안건 번호 (1, 2, 3...)
- **agenda_title**: 안건 제목 (간결하게)
- **summary_short**: AI가 생성한 1줄 요약 (20자 이내, 사용자 수정 불가)
- **summary**: 안건별 회의록 요약 (논의사항과 결정사항을 포함한 전체 요약)
- **summary**: 안건별 회의록 요약 (논의사항과 결정사항 모두 포함)
* 회의록 수정 페이지에서 사용자가 수정할 수 있는 입력 필드
* 형식: "**논의 사항:**\n- 논의내용1\n- 논의내용2\n\n**결정 사항:**\n- 결정1\n- 결정2"
* 사용자가 자유롭게 편집할 수 있도록 구조화된 텍스트로 작성
- **decisions**: 안건별 결정사항 배열 (대시보드 표시용, summary의 결정사항 부분을 배열로 추출)
* 형식: ["결정사항1", "결정사항2", "결정사항3"]
* 회의에서 최종 결정된 사항만 포함
- **pending**: 보류 사항 배열 (추가 논의 필요 사항)
- **todos**: Todo 배열 (제목만, 담당자/마감일/우선순위 없음)
- title: Todo 제목만 추출 (예: "시장 조사 보고서 작성")
- **todos**: Todo 배열 (제목 담당자 추출)
- title: Todo 제목 (예: "시장 조사 보고서 작성")
- assignee: 담당자 이름 (있는 경우에만, 예: "김대리", "박과장")
**Todo 추출 가이드:**
- 자연스러운 표현도 인식: "김대리가 ~하기로 함", "박과장은 ~준비합니다", "이차장님께서 ~하시기로 하셨습니다"
- 실행 동사 패턴: ~하기로, ~준비, ~작성, ~제출, ~완료, ~진행, ~검토, ~분석
- 담당자 패턴: "OO님", "OO이/가", "OO은/는", "OO께서"
- 기한 표현: "다음주", "이번주", "~까지", "~일까지", "~월까지"
---
@@ -77,10 +87,16 @@ def get_consolidate_prompt(participant_minutes: list, agendas: list = None) -> s
"agenda_title": "안건 제목",
"summary_short": "짧은 요약 (20자 이내)",
"summary": "**논의 사항:**\\n- 논의내용1\\n- 논의내용2\\n\\n**결정 사항:**\\n- 결정1\\n- 결정2",
"decisions": ["결정사항1", "결정사항2"],
"pending": ["보류사항"],
"todos": [
{{
"title": "Todo 제목"
"title": "인플루언서 리스트 작성",
"assignee": "김대리"
}},
{{
"title": "캠페인 콘텐츠 기획안 초안 작성",
"assignee": "박과장"
}}
]
}}
@@ -97,11 +113,13 @@ def get_consolidate_prompt(participant_minutes: list, agendas: list = None) -> s
3. **완전성**: 모든 필드를 빠짐없이 작성
4. **구조화**: 안건별로 명확히 분리
5. **결정사항 추출**:
- 회의 전체 결정사항(decisions) 모든 안건의 결정사항을 포함
- 안건별 summary에도 결정사항을 포함하여 사용자가 수정 가능하도록 작성
- 회의 전체 결정사항(decisions): 모든 안건의 결정사항을 포함 (TEXT 형식)
- 안건별 결정사항(agenda_summaries[].decisions): 각 안건의 결정사항을 배열로 추출
- 결정사항이 명확하게 언급된 경우에만 포함
6. **summary 작성**:
- summary_short: AI가 자동 생성한 1줄 요약 (사용자 수정 불가)
- summary: 논의사항과 결정사항을 포함한 전체 요약 (사용자 수정 가능)
- summary: 논의사항과 결정사항 모두 포함 (사용자 수정 가능)
- decisions: summary의 결정사항 부분을 배열로 별도 추출 (대시보드 표시용)
7. **Todo 추출**: 제목만 추출 (담당자나 마감일 없어도 됨)
8. **JSON만 출력**: 추가 설명 없이 JSON만 반환
@@ -96,6 +96,7 @@ class TranscriptService:
agenda_title=agenda_data.get("agenda_title", ""),
summary_short=agenda_data.get("summary_short", ""),
summary=agenda_data.get("summary", ""),
decisions=agenda_data.get("decisions", []),
pending=agenda_data.get("pending", []),
todos=todos
)