75 lines
2.6 KiB
Markdown
75 lines
2.6 KiB
Markdown
# 콜드메일 추출 로직 개선 (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`
|
|
- `251122_happybell80_chromadb_dimension_mismatch.md`
|
|
- `251122_rag_search_chunk_text_key_fix.md`
|
|
|
|
---
|
|
|
|
## 문제 상황
|
|
|
|
**실제 파일 테스트 결과**: IR 분석 모든 필드 N/A
|
|
|
|
### 초기 가설 (오류)
|
|
1. IR 분석에서 회사명 추출하지 않음 → **실제로는 이미 구현됨** (ir_analyzer.py:148,169,283)
|
|
2. 우선순위 미정의 → **코드에 우선순위 로직 존재** (coldmail_processor.py:139-144)
|
|
|
|
### 실제 원인
|
|
1. **RAG 검색 실패** → `raw_results = {}` → LLM에 빈 입력 → N/A
|
|
2. **연쇄 문제**: 차원 불일치(384→768) → 재인덱싱 → 키 불일치(chunk_text vs content)
|
|
|
|
---
|
|
|
|
## 분석 결과
|
|
|
|
### 코드 확인
|
|
- **ir_analyzer.py:148,169,244,283**: `company_name` 추출 이미 구현됨
|
|
- **coldmail_processor.py:139-144**: 우선순위 로직 존재 (IR → 휴리스틱)
|
|
- **문제**: RAG 검색 0건 → `raw_results = {}` → N/A
|
|
|
|
### Mock 테스트의 한계
|
|
- `tests/test_coldmail_extraction.py`: Mock 기반으로 실제 RAG 문제 감지 못함
|
|
- 테스트 통과했으나 실제 파일에서는 N/A
|
|
- 교훈: 실제 document_id로 통합 테스트 필수
|
|
|
|
---
|
|
|
|
## 해결 과정
|
|
|
|
### 1단계: 차원 불일치 발견 및 해결
|
|
- ChromaDB 384차원 → 768차원 재인덱싱 완료
|
|
- 참고: `251122_happybell80_chromadb_dimension_mismatch.md`
|
|
|
|
### 2단계: 키 불일치 발견 및 수정
|
|
- skill-rag-file: `chunk_text` 키로 반환
|
|
- ir_analyzer.py:47: `content` 키 읽기 시도 → 빈 문자열
|
|
- 커밋 `8feea8b`: `content` → `chunk_text` 수정
|
|
- 참고: `251122_rag_search_chunk_text_key_fix.md`
|
|
|
|
---
|
|
|
|
## 교훈
|
|
|
|
### 코드 확인 먼저, 가정은 나중에
|
|
- "IR에서 회사명 추출 안 함"이라고 가정 → 실제로는 이미 구현됨
|
|
- 교훈: 문제 분석 시 코드 직접 읽고 확인 (가정으로 시작하지 말 것)
|
|
|
|
### Mock 테스트의 한계
|
|
- Mock 테스트 통과 ≠ 실제 환경 정상 동작
|
|
- RAG/ChromaDB 같은 외부 의존성은 실제 데이터로 검증 필수
|
|
- 교훈: 통합 테스트용 실제 document_id 항상 준비
|
|
|
|
### 연쇄 문제 해결 시 각 단계 검증
|
|
- 차원 불일치 해결 → 재인덱싱 → 여전히 N/A
|
|
- 각 단계마다 실제 API 응답 출력/로그 확인으로 숨은 문제 조기 발견
|
|
- 교훈: 문제 해결 후 반드시 end-to-end 검증
|
|
|