DOCS/plans/251014_claude_coldmail_hybrid_implementation.md
Claude-51124 bf6873a2f0 docs: 문서 작성 원칙 준수 (100줄 이하 분리, 코드 블록 최소화)
- troubleshooting: 분석 문서 (129줄)
  - 문제 상황 및 근본 원인
  - 3단계 하이브리드 아키텍처
  - 기술 선택 근거 및 교훈
- plans: 구현 계획 문서 (94줄)
  - Phase별 상세 작업 내용
  - DB 스키마 및 함수 설계
  - 테스트 케이스 및 일정

코드 블록 대신 파일명:줄번호로 참조 변경

Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-14 13:07:29 +09:00

139 lines
3.3 KiB
Markdown

# Coldmail 하이브리드 필터 구현 계획
**날짜**: 2025-10-14
**작성자**: Claude (51124 서버 전담)
**관련**: `251014_claude_coldmail_filter_tokenization_issue.md`
---
## 구현 개요
**목표**: KoBERT + Gemini + Naive Bayes 3단계 하이브리드 coldmail 필터
**예상 시간**: 12시간 (1.5일)
---
## Phase 1: KoBERT 임베딩 필터 (4시간)
### 신규 파일
- `rb8001/app/services/coldmail_embedding_filter.py`
### 주요 함수
- `create_embedding()`: skill-embedding (8515)로 임베딩 생성
- `calculate_similarity()`: cosine similarity 계산
- `is_coldmail_by_embedding()`: threshold 0.6 기반 판단
### DB 테이블
```sql
CREATE TABLE coldmail_embedding_clusters (
id SERIAL PRIMARY KEY,
embedding VECTOR(768),
label VARCHAR(10),
example_subject TEXT,
created_at TIMESTAMP DEFAULT NOW()
);
```
**필요 확장**: pgvector extension (`CREATE EXTENSION vector;`)
---
## Phase 2: Gemini LLM 분류기 (2시간)
### 신규 파일
- `rb8001/app/services/coldmail_llm_classifier.py`
### 주요 함수
- `classify_by_llm()`: Gemini zero-shot 분류 + 이유 설명
### Prompt 예시
```
다음 이메일이 투자/제안/협업 관련 coldmail인지 판단하시오.
제목: {subject}
발신자: {sender_email}
응답: {"is_coldmail": true/false, "reason": "..."}
```
### 주의사항
- JSON 마크다운 블록(```json) 제거 필요
- gemini-2.5-flash-lite 사용 (비용 최소화)
---
## Phase 3: 하이브리드 통합 (3시간)
### 신규 파일
- `rb8001/app/services/coldmail_hybrid_filter.py`
### 주요 함수
- `hybrid_coldmail_filter()`: 3단계 순차 실행
- `update_from_feedback()`: Slack 버튼 피드백 처리
### 반환 구조
```python
{
"stage": "embedding" | "llm" | "hybrid",
"embedding_similarity": 0.75,
"llm_reason": "투자 유치 관련 IR 자료",
"naive_bayes_score": 0.85
}
```
---
## Phase 4: coldmail_briefing 통합 (1시간)
### 수정 파일
- coldmail_briefing.py:121-136
### 변경 내용
- 기존 `is_coldmail()``hybrid_coldmail_filter()` 교체
- 로그에 분류 상세 정보 추가
- `email["coldmail_details"]` 저장
---
## Phase 5: 테스트 및 검증 (2시간)
### 테스트 케이스
**Success (coldmail)**:
1. "251013_올굿즈컴퍼니_회사소개서.pdf" from gomtose@naver.com
2. "2025 빅웨이브 하반기 IR 초대" from biigwave@ccei.kr
3. "투자제안서 검토 요청" from silkro2009@silkro.org
**Failure (normal)**:
1. "[KBAN] 피싱 메일 주의" from jointips@kban.or.kr
2. "[SSG.COM] 주문 내역" from ssgadmin@ssg.com
3. "회의 일정 안내" from team@company.com
### 검증 항목
- [ ] 임베딩 클러스터 로딩 성공
- [ ] LLM JSON 파싱 정상
- [ ] Slack 피드백 → DB 반영 확인
- [ ] 응답 시간 500ms 이내
- [ ] API 호출 로그 확인 (10% 이하)
---
## 구현 일정
| Phase | 작업 | 시간 | 우선순위 |
|-------|------|------|---------|
| 1 | KoBERT 임베딩 필터 | 4h | 높음 |
| 2 | Gemini LLM 분류기 | 2h | 중간 |
| 3 | 하이브리드 통합 | 3h | 높음 |
| 4 | coldmail_briefing 통합 | 1h | 높음 |
| 5 | 테스트 및 검증 | 2h | 높음 |
**총 12시간** (1.5일)
---
## 참고
- 2024년 연구: BERT F1 0.99 (Journal of Big Data)
- KoBERT: github.com/SKTBrain/KoBERT
- skill-embedding: localhost:8515