# 콜드메일 추출 로직 개선 (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 테스트 작성 ### 검증 방법 ```bash 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 규칙 준수