DOCS/journey/troubleshooting/251216_coldmail_processing_improvements.md

4.2 KiB

콜드메일 처리 시스템 개선

날짜: 2025-12-16
작성자: Claude
관련 파일:

  • rb8001/app/services/coldmail_processor.py
  • rb8001/app/services/workflows/coldmail_workflow.py
  • rb8001/app/router/slack_handler.py

문제

  1. 신뢰도 판단 부족: 모든 콜드메일을 동일하게 처리하여 오탐 시 사용자 혼란
  2. 회사명/대표명 추출 불완전: 제목/발신자 기반 휴리스틱만 사용, 이메일 본문 정보 미활용
  3. Slack Lists 통합 미흡: 사용자 확인 없이 자동 등록, IR 분석 결과 업데이트 불가
  4. JSON 파싱 중복 코드: 9개 위치에서 유사한 JSON 파싱 로직 반복

해결

1. 신뢰도 기반 자동 처리

  • 신뢰도 95% 이상: 자동으로 Slack Lists 등록
  • 신뢰도 95% 미만: 확인 버튼만 전송, 사용자 확인 후 등록
  • _filter_confidence 필드를 이메일 객체에 추가하여 워크플로우 전체에서 활용

2. 회사명/대표명 추출 개선

  • 회사명 추출 로직 강화:
    • 작은따옴표 패턴 추가 ('온앤온' 형태)
    • 일반 이메일 도메인 제외 (gmail.com, naver.com 등)
    • 괄호 패턴 지원 ([회사명], (회사명))
  • LLM 기반 본문 파싱 추가: extract_company_info_from_email_body() 함수로 이메일 본문에서 정보 추출
  • 우선순위: LLM 본문 파싱 → IR 분석 → 휴리스틱

3. Slack 인터랙티브 버튼 연동

  • "맞음"/"아님" 확인 버튼으로 사용자 검증
  • "이 기업을 분석해 드릴까요?" 버튼으로 IR Deck 분석 요청
  • 확인 버튼 클릭 시 skip_email_detail=True로 중복 API 호출 방지
  • IR 분석 백그라운드 실행 후 웹 프론트엔드 링크 제공

4. JSON 추출 유틸리티 함수 도입

  • app/utils/json_extractor.py 추가: 범용 JSON 추출 함수
  • 7개 파일, 9개 위치에서 중복 코드 제거 (90줄 절약)
  • 다양한 LLM 응답 형식 자동 처리 (코드 블록, 설명 텍스트 등)

잘못된 부분 수정 (2025-12-22)

문제

  • skip_ir_analysis=True일 때 IR 분석을 건너뛰면서 email_metadata도 저장되지 않음
  • 확인 버튼 클릭 시 첫 처리에서 추출한 정보(company_name, representative_name, date)를 재사용할 수 없어 리스트에 "Unknown", "없음", 날짜 없음으로 등록됨

해결

  • ir_valuation_repository.py: save_email_metadata_only() 함수 추가
  • coldmail_processor.py:490-502: skip_ir_analysis=True일 때도 email_metadata 저장 (company_name, representative_name 포함)
  • coldmail_service.py:75-99: 확인 버튼 클릭 시 저장된 email_metadata에서 정보 불러와서 사용

올바른 플로우

  1. 이메일 수신 → 베이지안 학습
  2. 신뢰도 95% 이상: email_metadata 저장 → 리스트 등록
  3. 신뢰도 95% 이하: 확인 버튼 전송 → "예" 클릭 시 email_metadata 저장 → 리스트 등록

교훈

  1. 신뢰도 기반 분기: LLM 필터링 결과의 신뢰도를 활용하여 사용자 개입 최소화
  2. 우선순위 명확화: 여러 소스에서 정보 추출 시 우선순위 정의 (LLM → IR → 휴리스틱)
  3. 사용자 확인 프로세스: 불확실한 경우 확인 버튼으로 검증 후 처리
  4. 유틸리티 함수 우선: 중복 코드는 공통 유틸리티 함수로 추출하여 재사용
  5. API 호출 최적화: 이미 조회한 데이터는 재사용 (skip_email_detail, document_id 재사용)
  6. 저장과 분석 분리: IR 분석 스킵과 email_metadata 저장은 별개 작업. 분석 없이도 메타데이터는 저장해야 함

개선 필요 사항

함수 분리 필요

  • process_coldmail 함수가 이메일 처리, IR 분석, 리스트 등록을 모두 포함하여 복잡함
  • skip_ir_analysis 플래그로 제어하는 대신 함수를 분리하여 워크플로우에서 순차 호출
  • 분리 대상:
    • 이메일 정보 추출 및 email_metadata 저장
    • IR 분석
    • 리스트 등록
  • 워크플로우에 IR 분석 노드 추가하여 순차 처리

관련 문서

  • JSON 추출 유틸리티: app/utils/json_extractor.py
  • 콜드메일 워크플로우: app/services/workflows/coldmail_workflow.py