# 콜드메일 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:40-42: langchain==0.3.27, langchain-openai==0.3.35, langgraph==0.6.10
- 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% 감소)

### 리팩토링 (커밋 6777165, fd89d8d, 28ef36c)
- coldmail_briefing.py:8: 미사용 import 제거
- requirements.txt:40-42: langchain 버전 고정 (pip backtracking 방지)
- requirements.txt:20: openai>=1.110.0 (langchain-openai 충돌 해결)

---

## 최종 테스트 및 배포 (2025-10-14)

### 테스트 완료
- ✅ Priority 2: LLM JSON 파싱 (마크다운 블록 제거) - 4가지 케이스 정상
- ✅ Priority 3: Slack 메시지 포맷 (IR 분석 결과 포함) - "스타트업A: 120.5억원 (신뢰도 85%)"
- ✅ Priority 4: LangGraph 워크플로우 - 컴파일 성공, 모든 노드 정상 작동

### 배포 완료
- rb8001 컨테이너: healthy 상태
- openai: 2.3.0 (langchain-openai 호환)
- langgraph: 0.6.10 설치 완료
- coldmail_workflow: 정상 로드

---

## 분석 결과 예시

굿베이션 (IT 인테리어 플랫폼): 27페이지 → 14 chunks, 밸류에이션 100억원 (30-300억원), 신뢰도 90%

---

## 교훈

- 전체 시나리오 문서 먼저 작성 후 세부 구현
- LLM 응답은 항상 전처리 (마크다운 블록 제거)
- LangGraph State는 직렬화 가능한 타입만 (aiohttp.ClientSession은 각 노드에서 생성)
- DRY 원칙 + 파일 크기 제한(300줄) → 로직 분리로 유지보수성 향상 (316줄 → 46+191+151+114줄)

## 후속 개선 (2025-11-22)

### 추출 로직 개선
- **문제**: 회사명 추출이 휴리스틱에만 의존, IR 본문 미활용
- **해결**: IR 분석에 회사명 추출 추가, 우선순위 분리 (회사명: IR→휴리스틱→헤더, 연락처: 헤더→IR→휴리스틱)
- **문서**: `251122_coldmail_extraction_improvement_tdd.md` 참고