diff --git a/journey/troubleshooting/251014_coldmail_ir_analysis_scenario.md b/journey/troubleshooting/251014_coldmail_ir_analysis_scenario.md index 69d860b..12fac18 100644 --- a/journey/troubleshooting/251014_coldmail_ir_analysis_scenario.md +++ b/journey/troubleshooting/251014_coldmail_ir_analysis_scenario.md @@ -78,3 +78,10 @@ - LLM 응답은 항상 전처리 (마크다운 블록 제거) - LangGraph State는 직렬화 가능한 타입만 (aiohttp.ClientSession은 각 노드에서 생성) - DRY 원칙 + 파일 크기 제한(300줄) → 로직 분리로 유지보수성 향상 (316줄 → 46+191+151+114줄) + +## 후속 개선 (2025-11-22) + +### 추출 로직 개선 +- **문제**: 회사명 추출이 휴리스틱에만 의존, IR 본문 미활용 +- **해결**: IR 분석에 회사명 추출 추가, 우선순위 분리 (회사명: IR→휴리스틱→헤더, 연락처: 헤더→IR→휴리스틱) +- **문서**: `251122_coldmail_extraction_improvement_tdd.md` 참고 \ No newline at end of file diff --git a/journey/troubleshooting/251122_coldmail_extraction_improvement_tdd.md b/journey/troubleshooting/251122_coldmail_extraction_improvement_tdd.md new file mode 100644 index 0000000..fa7484d --- /dev/null +++ b/journey/troubleshooting/251122_coldmail_extraction_improvement_tdd.md @@ -0,0 +1,102 @@ +# 콜드메일 추출 로직 개선 (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 규칙 준수 +