docs: 콜드메일 추출 로직 개선 TDD 문서 추가
- 251122_coldmail_extraction_improvement_tdd: 새 문서 작성 - 251014_coldmail_ir_analysis_scenario: 후속 개선 링크 추가
This commit is contained in:
parent
20f4412241
commit
e404e1d19d
@ -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` 참고
|
||||
@ -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 규칙 준수
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user