DOCS/journey/troubleshooting/251122_coldmail_extraction_improvement_tdd.md
2025-11-22 14:13:57 +09:00

3.9 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 테스트 작성

검증 방법

# 단위 테스트 (Mock)
cd /home/admin/ivada_project/rb8001
docker exec -it rb8001 python3 tests/test_coldmail_extraction.py

# 실제 파일 테스트
docker exec -it rb8001 python3 /code/scripts/test_ir_extraction_real_file.py [document_id] [team_id]
# 예시: docker exec -it rb8001 python3 /code/scripts/test_ir_extraction_real_file.py dc1da3f6-f0b6-4688-a399-9faf54aefe1d 79441171-3951-4870-beb8-916d07fe8be5

참고: 실제 파일 테스트 시 RAG 인덱싱이 완료된 document_id를 사용해야 함. 파일 저장 위치: /mnt/51123data/documents/{team_id}/YYYY-MM/{document_id}.pdf


교훈

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 규칙 준수