DOCS/journey/troubleshooting/251122_coldmail_extraction_improvement_tdd.md
Claude-51124 e404e1d19d docs: 콜드메일 추출 로직 개선 TDD 문서 추가
- 251122_coldmail_extraction_improvement_tdd: 새 문서 작성
- 251014_coldmail_ir_analysis_scenario: 후속 개선 링크 추가
2025-11-22 14:11:26 +09:00

3.4 KiB

콜드메일 추출 로직 개선 (TDD)

날짜: 2025-11-22 작성자: Claude 관련 파일:

  • rb8001/app/services/ir_analyzer.py
  • rb8001/app/services/coldmail_processor.py
  • rb8001/tests/test_coldmail_extraction.py

관련 문서: 251014_coldmail_ir_analysis_scenario.md


문제 상황

현재 추출 로직의 한계

  1. 회사명 추출: IR 분석에서 추출하지 않음, 휴리스틱(_derive_company_name())에만 의존

    • 제목/발신자 기반 추출로 정확도 낮음
    • IR 본문에 정확한 회사명("주식회사 ABC", "(주)ABC")이 있어도 활용하지 않음
  2. 연락처 추출: From 헤더 파싱에만 의존

    • 헤더 형식이 다르면 실패 가능
    • IR 본문의 연락처 정보 미활용
  3. 우선순위 미정의: IR → 휴리스틱 → 헤더 순서가 명확하지 않음


해결 방안

1. IR 분석에 회사명 추출 추가

  • extract_ir_metrics() 프롬프트에 회사명 추출 쿼리 추가
  • JSON 키 company_name으로 반환
  • IR 본문 기반 추출로 정확도 향상

2. 우선순위 분리

  • 회사명: IR → 휴리스틱 → 헤더 (IR 본문이 가장 정확)
  • 연락처: 헤더 → IR → 휴리스틱 (From 헤더가 가장 신뢰도 높음)

3. 방어 로직

  • IR 추출 실패/공백 시에만 후속 경로로 폴백
  • 불필요한 LLM 호출 최소화

TDD 계획

테스트 작성 (Red Phase)

  1. test_extract_ir_metrics_with_company_name: IR 분석에서 회사명 추출 테스트
  2. test_company_name_priority: 우선순위 테스트 (IR → 휴리스틱 → 헤더)
  3. test_contact_priority: 연락처 우선순위 테스트 (헤더 → IR → 휴리스틱)

구현 (Green Phase)

  1. extract_ir_metrics(): 회사명 추출 쿼리 및 JSON 파싱 추가
  2. coldmail_processor.py: 우선순위 분리 로직 수정

리팩터링 (Refactor Phase)

  • 중복 코드 제거
  • 에러 처리 개선

구현 완료 (2025-11-22)

수정된 파일

  • rb8001/app/services/ir_analyzer.py:
    • 회사명 추출 쿼리 추가 (company_name)
    • Gemini/RAG 경로 모두 프롬프트에 company_name 키 추가
    • config 제거, os.getenv() 직접 사용
  • rb8001/app/services/coldmail_processor.py:
    • 회사명 우선순위: IR → 휴리스틱 → 헤더
    • 연락처 우선순위: 헤더 → IR → 휴리스틱 (향후 확장 가능)
    • IR 추출 실패/공백 시에만 후속 경로로 폴백
  • rb8001/tests/test_coldmail_extraction.py: TDD 테스트 작성

검증 방법

cd /home/admin/ivada_project/rb8001
docker exec -it rb8001 python3 tests/test_coldmail_extraction.py

교훈

IR 본문 활용의 중요성

  • 휴리스틱보다 IR 본문에서 추출한 정보가 정확도 높음
  • 회사명은 본문에 정확한 법인명("주식회사 ABC", "(주)ABC")이 포함되어 있음
  • LLM이 본문에서 직접 추출하면 휴리스틱보다 신뢰도 높음

우선순위 분리의 필요성

  • 회사명과 연락처는 신뢰도가 다른 소스에서 나옴
  • 회사명: IR 본문이 가장 정확 (법인명 명시)
  • 연락처: From 헤더가 가장 신뢰도 높음 (발신자 정보)
  • 각각 최적의 우선순위를 설정하여 정확도 향상

config 사용 금지 원칙 적용

  • ir_analyzer.py에서 settings.DEFAULT_LLM_MODEL 제거
  • os.getenv("DEFAULT_LLM_MODEL", "gemini-2.5-flash-lite") 직접 사용
  • AGENTS.md 규칙 준수