DOCS/troubleshooting/251014_coldmail_ir_analysis_scenario.md
happybell80 b6a60d725c docs: 콜드메일 시나리오 구현 계획 상세화
- 우선순위 1: Lists 파일 첨부 완료 표시
- 우선순위 2: ir_analyzer.py:155 JSON 전처리 구체화
- 우선순위 3: coldmail_briefing.py:144,176,291 수정 위치 명시
- 우선순위 4: LangGraph 워크플로우 구조 정의
- 미구현/버그 섹션 제거 (구현 계획에 통합)
- 교훈 간소화, 100줄 이하 유지

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-14 22:25:35 +09:00

3.8 KiB

콜드메일 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)

파일 처리

  • coldmail_briefing.py:75-263: 전체 플로우
  • naverworks_file_processor.py:94-135: PDF 다운로드 → skill-rag-file 업로드
  • 파일 영속성: SSHFS allow_other 해결 (251014_skill-rag-file_sshfs_allow_other_해결.md)

AI 분석 기능

  • ir_analyzer.py:86-168: extract_ir_metrics() - RAG 6회 쿼리 → LLM 요약
  • startup_valuation.py:63-173: valuate_startup() - 베이지안 VC Method

Slack 통합

  • coldmail_briefing.py:176-248: Slack Lists 아이템 생성
  • coldmail_briefing.py:221-247: 피드백 버튼 ( 맞음 / 아님)
  • coldmail_filter.py:29-76: Naive Bayes 학습 루프

분석 결과 예시 (굿베이션)

파일: 27페이지, 4.7MB → 14 chunks

기업: 굿베이션 (IT 인테리어 플랫폼) / 설립 7개월 / 팀 4명 / 자본 2억

강점: 시장 문제 인식, IT 차별화, 24조 시장 약점: 실적 전무, 소규모 팀, 자본 부족, 경쟁사 존재

밸류에이션: 100억원 (범위: 30-300억원) 신뢰도: 90% (Bayesian adjustment factor 기반)


구현 계획

우선순위 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 다음 (156 전): llm_response 전처리
    • cleaned = llm_response.strip()
    • if cleaned.startswith("```json"): cleaned = cleaned[7:]
    • if cleaned.startswith("```"): cleaned = cleaned[3:]
    • if cleaned.endswith("```"): cleaned = cleaned[:-3]
    • cleaned = cleaned.strip()
  • ir_analyzer.py:156: parsed = json.loads(cleaned)

우선순위 3: Slack 메시지에 IR 분석 결과 추가

  • coldmail_briefing.py:144 다음: processed_results = [] 추가
  • coldmail_briefing.py:176 다음: processed_results.append({"company": company_name, "ir": ir_metrics, "valuation": valuation_result})
  • coldmail_briefing.py:291: summary_text 수정
    • 현재: f"콜드메일 {processed_count}건 처리 완료 (...)"
    • 변경: for 루프로 각 회사별 밸류에이션, 신뢰도 포함

우선순위 4: LangGraph 워크플로우

  • requirements.txt: langgraph, langgraph-checkpoint-postgres 추가
  • app/workflows/coldmail_workflow.py: StateGraph 정의
    • State: TypedDict (emails, coldmail_candidates, processed_results)
    • 노드: fetch_emails, filter_coldmail, process_attachments, analyze_ir, create_slack_item, send_summary
    • 엣지: fetch → filter → process → analyze → create → send
    • 조건부 엣지: process (첨부파일 유무), analyze (성공/실패)
  • coldmail_briefing.py:78: _run_coldmail_briefing()에서 workflow.invoke() 호출

교훈

  • 전체 시나리오 문서 먼저 작성 후 세부 구현
  • LLM 응답은 항상 전처리 (마크다운 블록 제거)