- 251122_coldmail_extraction_improvement_tdd: 새 문서 작성 - 251014_coldmail_ir_analysis_scenario: 후속 개선 링크 추가
3.4 KiB
3.4 KiB
콜드메일 추출 로직 개선 (TDD)
날짜: 2025-11-22 작성자: Claude 관련 파일:
rb8001/app/services/ir_analyzer.pyrb8001/app/services/coldmail_processor.pyrb8001/tests/test_coldmail_extraction.py
관련 문서: 251014_coldmail_ir_analysis_scenario.md
문제 상황
현재 추출 로직의 한계
-
회사명 추출: IR 분석에서 추출하지 않음, 휴리스틱(
_derive_company_name())에만 의존- 제목/발신자 기반 추출로 정확도 낮음
- IR 본문에 정확한 회사명("주식회사 ABC", "(주)ABC")이 있어도 활용하지 않음
-
연락처 추출: From 헤더 파싱에만 의존
- 헤더 형식이 다르면 실패 가능
- IR 본문의 연락처 정보 미활용
-
우선순위 미정의: IR → 휴리스틱 → 헤더 순서가 명확하지 않음
해결 방안
1. IR 분석에 회사명 추출 추가
extract_ir_metrics()프롬프트에 회사명 추출 쿼리 추가- JSON 키
company_name으로 반환 - IR 본문 기반 추출로 정확도 향상
2. 우선순위 분리
- 회사명: IR → 휴리스틱 → 헤더 (IR 본문이 가장 정확)
- 연락처: 헤더 → IR → 휴리스틱 (From 헤더가 가장 신뢰도 높음)
3. 방어 로직
- IR 추출 실패/공백 시에만 후속 경로로 폴백
- 불필요한 LLM 호출 최소화
TDD 계획
테스트 작성 (Red Phase)
test_extract_ir_metrics_with_company_name: IR 분석에서 회사명 추출 테스트test_company_name_priority: 우선순위 테스트 (IR → 휴리스틱 → 헤더)test_contact_priority: 연락처 우선순위 테스트 (헤더 → IR → 휴리스틱)
구현 (Green Phase)
extract_ir_metrics(): 회사명 추출 쿼리 및 JSON 파싱 추가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 규칙 준수