- 커밋 해시 추가: 0ef3489, c2ac162 - 각 우선순위별 완료 표시 및 파일:줄번호 - 교훈 추가: LangGraph 직렬화, DRY + 파일 크기 제한 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
85 lines
3.3 KiB
Markdown
85 lines
3.3 KiB
Markdown
# 콜드메일 IR 자동 분석 시나리오
|
|
|
|
**날짜**: 2025-10-14
|
|
**작성자**: happybell80
|
|
**관련 파일**: `rb8001/app/scheduler/jobs/coldmail_briefing.py`
|
|
|
|
---
|
|
|
|
## 최종 목표 시나리오
|
|
|
|
### 평일 오전 9시 5분 자동 실행
|
|
1. NAVER WORKS 메일 중 콜드메일 감지 (Naive Bayes)
|
|
2. IR 첨부파일(PDF) 다운로드
|
|
3. skill-rag-file에 업로드 → 51123 HDD 영구 저장
|
|
4. AI 분석 실행:
|
|
- 페이지별 요약 (RAG 기반 핵심 내용 추출)
|
|
- 기업 평가 (사업분야, 재무, 기술 우위)
|
|
- 베이지안 밸류에이션 및 신뢰도 계산
|
|
5. Slack Lists에 정리된 보고서 첨부:
|
|
- 회사명, 이메일, IR 파일
|
|
- 밸류에이션, 신뢰도, 핵심 평가
|
|
6. Slack 채널에 요약 메시지 + 피드백 버튼
|
|
|
|
---
|
|
|
|
## 구현 완료 (2025-10-14)
|
|
|
|
### 초기 구현 (우선순위 1)
|
|
- naverworks_file_processor.py:94-135: PDF → skill-rag-file 업로드
|
|
- ir_analyzer.py:86-178: RAG 6회 쿼리 → LLM 요약
|
|
- startup_valuation.py:63-173: 베이지안 VC Method
|
|
- coldmail_briefing.py:204-232,252,257: Slack Lists 파일 첨부
|
|
- coldmail_briefing.py:273-296: Slack 피드백 버튼
|
|
- coldmail_filter.py:29-76: Naive Bayes 학습
|
|
|
|
### 우선순위 2,3 (커밋 0ef3489)
|
|
- ir_analyzer.py:155-163: LLM 마크다운 블록 전처리
|
|
- coldmail_briefing.py:145,192-200,302-305: Slack 요약 메시지 포맷
|
|
|
|
### 우선순위 4 (커밋 c2ac162)
|
|
- requirements.txt:42: langgraph>=0.2.0
|
|
- coldmail_email_fetcher.py:15-44: 메일 조회 (46줄)
|
|
- coldmail_processor.py:23-191: IR 분석 + Slack 등록 (191줄)
|
|
- workflows/coldmail_workflow.py:17-151: StateGraph (151줄)
|
|
- coldmail_briefing.py:78-115: LangGraph 워크플로우 (114줄, 63% 감소)
|
|
|
|
---
|
|
|
|
## 분석 결과 예시
|
|
|
|
굿베이션 (IT 인테리어 플랫폼): 27페이지 → 14 chunks, 밸류에이션 100억원 (30-300억원), 신뢰도 90%
|
|
|
|
---
|
|
|
|
## 구현 계획
|
|
|
|
### 우선순위 1: Slack Lists 파일 첨부 (✅ 완료)
|
|
- 상세: 251014_slack_lists_file_attachment.md
|
|
- skill-rag-file/app/api/download.py: GET /api/download/{document_id}
|
|
- skill-slack/app/api/endpoints/files.py: POST /files/upload (X-API-Key)
|
|
- coldmail_briefing.py:191-221, 241, 246: document_id → file_id 변환
|
|
|
|
### 우선순위 2: LLM JSON 파싱 에러 (✅ 완료)
|
|
- ir_analyzer.py:155-163: 마크다운 블록 제거 전처리
|
|
|
|
### 우선순위 3: Slack 메시지 IR 분석 결과 (✅ 완료)
|
|
- coldmail_briefing.py:145,192-200,302-305: processed_results 추적 및 요약
|
|
|
|
### 우선순위 4: LangGraph 워크플로우 (✅ 완료)
|
|
- requirements.txt:42: langgraph>=0.2.0
|
|
- coldmail_email_fetcher.py:15-44: fetch_emails(user_id, start_time, now)
|
|
- coldmail_processor.py:23-191: process_coldmail(email, user_id)
|
|
- workflows/__init__.py: 빈 파일
|
|
- workflows/coldmail_workflow.py:17-151: StateGraph 4노드 + 조건부 엣지
|
|
- coldmail_briefing.py:78-115: workflow.ainvoke() 호출 (316줄 → 114줄)
|
|
|
|
---
|
|
|
|
## 교훈
|
|
|
|
- 전체 시나리오 문서 먼저 작성 후 세부 구현
|
|
- LLM 응답은 항상 전처리 (마크다운 블록 제거)
|
|
- LangGraph State는 직렬화 가능한 타입만 (aiohttp.ClientSession은 각 노드에서 생성)
|
|
- DRY 원칙 + 파일 크기 제한(300줄) → 로직 분리로 유지보수성 향상 (316줄 → 46+191+151+114줄)
|