- troubleshooting: 분석 문서 (129줄) - 문제 상황 및 근본 원인 - 3단계 하이브리드 아키텍처 - 기술 선택 근거 및 교훈 - plans: 구현 계획 문서 (94줄) - Phase별 상세 작업 내용 - DB 스키마 및 함수 설계 - 테스트 케이스 및 일정 코드 블록 대신 파일명:줄번호로 참조 변경 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
139 lines
3.3 KiB
Markdown
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
|