mirror of
https://github.com/hwanny1128/HGZero.git
synced 2025-12-06 13:46:24 +00:00
주요 변경사항:
1. AI 서비스 설정
- claude_max_tokens: 8192 → 25000으로 증가 (회의록 통합을 위한 충분한 토큰 확보)
- AI 서비스 타임아웃: 30초 → 60초로 증가
2. 프롬프트 개선 (consolidate_prompt.py)
- JSON 생성 전문가 역할 추가
- JSON 이스케이프 규칙 명시 (큰따옴표, 줄바꿈, 역슬래시)
- Markdown 볼드체(**) 제거하여 JSON 파싱 오류 방지
- 문자열 검증 지시사항 추가
3. JSON 파싱 개선 (claude_service.py)
- 4단계 재시도 전략 구현:
* 이스케이프되지 않은 개행 문자 자동 수정
* strict=False 옵션으로 파싱
* 잘린 응답 복구 시도
* 제어 문자 제거 후 재시도
- 디버깅 로깅 강화 (Input/Output Tokens, Stop Reason)
- 파싱 실패 시 전체 응답을 파일로 저장
4. 회의 종료 로직 개선 (EndMeetingService.java)
- 통합 회의록 생성 또는 조회 로직 추가 (userId=NULL)
- Minutes 테이블에 전체 결정사항 저장
- AgendaSection에 minutesId 정확히 매핑
5. 테스트 데이터 추가
- AI 회의록 요약 테스트용 SQL 스크립트 작성
- 3명 참석자, 3개 안건의 현실적인 회의 시나리오
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
153 lines
6.8 KiB
Python
153 lines
6.8 KiB
Python
"""회의록 통합 요약 프롬프트"""
|
|
|
|
|
|
def get_consolidate_prompt(participant_minutes: list, agendas: list = None) -> str:
|
|
"""
|
|
참석자별 회의록을 통합하여 요약하는 프롬프트 생성
|
|
"""
|
|
|
|
# 참석자 회의록 결합
|
|
participants_content = "\n\n".join([
|
|
f"## {p['user_name']}님의 회의록:\n{p['content']}"
|
|
for p in participant_minutes
|
|
])
|
|
|
|
# 안건 정보 (있는 경우)
|
|
agendas_info = ""
|
|
if agendas:
|
|
agendas_info = "\n\n**사전 정의된 안건**:\n" + "\n".join([
|
|
f"{i+1}. {agenda}" for i, agenda in enumerate(agendas)
|
|
])
|
|
|
|
prompt = f"""당신은 회의록 작성 전문가이며 JSON 생성 전문가입니다. 여러 참석자가 작성한 회의록을 통합하여 정확하고 체계적인 회의록을 생성해주세요.
|
|
|
|
**매우 중요**: 응답은 반드시 유효한 JSON 형식이어야 합니다. 문자열 내의 모든 특수문자를 올바르게 이스케이프해야 합니다.
|
|
|
|
# 입력 데이터
|
|
|
|
{participants_content}{agendas_info}
|
|
|
|
---
|
|
|
|
# 작업 지침
|
|
|
|
1. **주요 키워드 (keywords)**:
|
|
- 회의에서 자주 언급된 핵심 키워드 5-10개 추출
|
|
- 단어 또는 짧은 구문 (예: "신제품기획", "예산편성")
|
|
|
|
2. **통계 정보 (statistics)**:
|
|
- agendas_count: 안건 개수 (내용 기반 추정)
|
|
- todos_count: 추출된 Todo 총 개수
|
|
|
|
3. **회의 전체 결정사항 (decisions)**:
|
|
- 회의 전체에서 최종 결정된 사항들을 TEXT 형식으로 정리
|
|
- 안건별 결정사항을 모두 포함하여 회의록 수정 페이지에서 사용자가 확인 및 수정할 수 있도록 작성
|
|
- 형식: "안건1 결정사항:\n- 결정1\n- 결정2\n\n안건2 결정사항:\n- 결정3"
|
|
- **JSON 이스케이프 필수**:
|
|
* 큰따옴표(")는 반드시 제거하거나 작은따옴표(')로 대체
|
|
* 줄바꿈은 \\n으로 이스케이프
|
|
* 역슬래시(\\)는 \\\\로 이스케이프
|
|
|
|
4. **안건별 요약 (agenda_summaries)**:
|
|
회의 내용을 분석하여 안건별로 구조화:
|
|
|
|
각 안건마다:
|
|
- **agenda_number**: 안건 번호 (1, 2, 3...)
|
|
- **agenda_title**: 안건 제목 (간결하게)
|
|
- **summary_short**: AI가 생성한 1줄 요약 (20자 이내, 사용자 수정 불가)
|
|
- **summary**: 안건별 회의록 요약 (논의사항과 결정사항 모두 포함)
|
|
* 회의록 수정 페이지에서 사용자가 수정할 수 있는 입력 필드
|
|
* 형식: "논의 사항:\n- 논의내용1\n- 논의내용2\n\n결정 사항:\n- 결정1\n- 결정2"
|
|
* 사용자가 자유롭게 편집할 수 있도록 구조화된 텍스트로 작성
|
|
* **JSON 이스케이프 필수**: 큰따옴표(")는 제거하거나 작은따옴표(')로 대체, 줄바꿈은 \\n으로 표현
|
|
- **decisions**: 안건별 결정사항 배열 (대시보드 표시용, summary의 결정사항 부분을 배열로 추출)
|
|
* 형식: ["결정사항1", "결정사항2", "결정사항3"]
|
|
* 회의에서 최종 결정된 사항만 포함
|
|
- **pending**: 보류 사항 배열 (추가 논의 필요 사항)
|
|
- **todos**: Todo 배열 (제목과 담당자 추출)
|
|
- title: Todo 제목 (예: "시장 조사 보고서 작성")
|
|
- assignee: 담당자 이름 (있는 경우에만, 예: "김대리", "박과장")
|
|
|
|
**Todo 추출 가이드:**
|
|
- 자연스러운 표현도 인식: "김대리가 ~하기로 함", "박과장은 ~준비합니다", "이차장님께서 ~하시기로 하셨습니다"
|
|
- 실행 동사 패턴: ~하기로, ~준비, ~작성, ~제출, ~완료, ~진행, ~검토, ~분석
|
|
- 담당자 패턴: "OO님", "OO이/가", "OO은/는", "OO께서"
|
|
- 기한 표현: "다음주", "이번주", "~까지", "~일까지", "~월까지"
|
|
|
|
---
|
|
|
|
# 출력 형식
|
|
|
|
**매우 중요 - JSON 생성 규칙**:
|
|
1. JSON 외의 다른 텍스트는 절대 포함하지 마세요
|
|
2. 문자열 내부의 큰따옴표(")는 반드시 작은따옴표(')로 대체하세요
|
|
3. 문자열 내부의 줄바꿈은 반드시 \\n으로 이스케이프하세요
|
|
4. 역슬래시(\\)는 \\\\로 이스케이프하세요
|
|
5. 모든 문자열이 끝까지 올바르게 닫혀 있는지 확인하세요
|
|
6. 각 문자열 값이 유효한 JSON 문자열인지 검증하세요
|
|
|
|
```json
|
|
{{
|
|
"keywords": ["키워드1", "키워드2", "키워드3"],
|
|
"statistics": {{
|
|
"agendas_count": 2,
|
|
"todos_count": 3
|
|
}},
|
|
"decisions": "안건1 결정사항:\\n- 결정1\\n- 결정2\\n\\n안건2 결정사항:\\n- 결정3",
|
|
"agenda_summaries": [
|
|
{{
|
|
"agenda_number": 1,
|
|
"agenda_title": "안건 제목",
|
|
"summary_short": "짧은 요약",
|
|
"summary": "논의 사항:\\n- 논의내용1\\n- 논의내용2\\n\\n결정 사항:\\n- 결정1\\n- 결정2",
|
|
"decisions": ["결정사항1", "결정사항2"],
|
|
"pending": ["보류사항"],
|
|
"todos": [
|
|
{{
|
|
"title": "인플루언서 리스트 작성",
|
|
"assignee": "김대리"
|
|
}},
|
|
{{
|
|
"title": "캠페인 콘텐츠 기획안 초안 작성",
|
|
"assignee": "박과장"
|
|
}}
|
|
]
|
|
}}
|
|
]
|
|
}}
|
|
```
|
|
|
|
---
|
|
|
|
# 중요 규칙
|
|
|
|
1. **정확성**: 참석자 회의록에 명시된 내용만 사용
|
|
2. **객관성**: 추측이나 가정 없이 사실만 기록
|
|
3. **완전성**: 모든 필드를 빠짐없이 작성
|
|
4. **구조화**: 안건별로 명확히 분리
|
|
5. **결정사항 추출**:
|
|
- 회의 전체 결정사항(decisions): 모든 안건의 결정사항을 포함 (TEXT 형식, \\n 이스케이프 필수)
|
|
- 안건별 결정사항(agenda_summaries[].decisions): 각 안건의 결정사항을 배열로 추출
|
|
- 결정사항이 명확하게 언급된 경우에만 포함
|
|
6. **summary 작성**:
|
|
- summary_short: AI가 자동 생성한 1줄 요약 (사용자 수정 불가, 특수문자 이스케이프)
|
|
- summary: 논의사항과 결정사항 모두 포함 (사용자 수정 가능, \\n 이스케이프 필수)
|
|
- decisions: summary의 결정사항 부분을 배열로 별도 추출 (대시보드 표시용)
|
|
7. **Todo 추출**:
|
|
- 제목 필수, 담당자는 언급된 경우에만 추출
|
|
- 자연스러운 표현에서 추출: "김대리가 ~하기로 함" → title: "~", assignee: "김대리"
|
|
- 담당자가 없으면 assignee: "" (빈 문자열)
|
|
8. **JSON 형식 엄수 - 가장 중요**:
|
|
- 추가 설명, 주석, 서문 없이 JSON만 반환
|
|
- 문자열 내 큰따옴표(")는 작은따옴표(')로 대체
|
|
- 문자열 내 줄바꿈은 \\n으로 이스케이프
|
|
- 역슬래시는 \\\\로 이스케이프
|
|
- 모든 문자열을 올바르게 닫기
|
|
- 생성 후 유효한 JSON인지 자체 검증
|
|
|
|
**최종 지시**: 위 회의록들을 분석하여 **유효한 JSON 형식으로만** 통합 요약을 생성해주세요.
|
|
JSON 파싱 오류가 발생하지 않도록 모든 특수문자를 올바르게 이스케이프하세요.
|
|
"""
|
|
|
|
return prompt
|