diff --git a/journey/plans/251016_ontology_coldmail_implementation.md b/journey/plans/251016_ontology_coldmail_implementation.md index 58b609f..1e95e62 100644 --- a/journey/plans/251016_ontology_coldmail_implementation.md +++ b/journey/plans/251016_ontology_coldmail_implementation.md @@ -48,6 +48,52 @@ --- +## Phase 2-3 상세 작업 (결정 완료) + +### 1) 데이터 구조 (Neo4j) +- **노드**: `Email`, `Rule`, `Company`, `Topic`, `User` +- **관계**: `(:Email)-[:MATCHED_RULE]->(:Rule)`, `(:Email)-[:MENTIONS]->(:Company|Topic)`, `(:User)-[:RECEIVED]->(:Email)` +- **필수 속성**: + - `Email`: `email_id`, `subject`, `sender`, `received_at`, `confidence`, `source`(hybrid/ontology) + - `Rule`: `rule_id`, `rule_type`, `confidence` + - `Company`: `name`, `domain` + - `Topic`: `keyword` + - `User`: `user_id` + +### 2) 서비스/레포지토리 구조 (계층 분리) +- **state/repositories**: `rb8001/app/state/repositories/coldmail_memory_repository.py` (Neo4j CRUD) +- **services**: `rb8001/app/services/coldmail_memory_service.py` (기억 저장/조회/요약 로직) +- **services**: `rb8001/app/services/coldmail_ontology_reasoner.py`와 연결 (규칙/기억 반영) +- **workflows**: `rb8001/app/services/workflows/coldmail_workflow.py`에서 기억 저장 호출 + +### 3) 인터페이스 (입출력 고정) +- `save_email_memory(user_id, email_payload, matched_rules, topics, companies) -> memory_id` +- `get_recent_memory(user_id, limit=20) -> List[MemoryItem]` +- `get_rule_context(rule_id) -> Dict` (해당 규칙과 연결된 최근 이메일 요약) + +### 4) 데이터 흐름 (실행 순서) +1. hybrid_coldmail_filter 결과에 `matched_rules` 포함 +2. 콜드메일 확정 시 `coldmail_memory_service.save_email_memory()` 호출 +3. 온톨로지 판단 시 `get_rule_context()`로 기억 기반 보정 + +### 5) DB 스키마 확인/동기화 +- Neo4j 실제 스키마 확인 후 Repository/Service 동시 반영 +- 스키마 변경 시 ORM/DDL/Repository 동기화 원칙 준수 + +### 6) 테스트 (TDD, pytest) +- **파일**: `rb8001/tests/test_coldmail_memory_repository.py` + - Neo4j 저장/조회/관계 생성 검증 +- **파일**: `rb8001/tests/test_coldmail_memory_service.py` + - save/get 동작, rule context 요약 결과 검증 +- **UX 검증**: “왜 콜드메일인지” 설명 문구 포함 여부 확인 + +### 7) 완료 기준 +- Neo4j에 콜드메일 기억 저장/조회 성공 +- 온톨로지 판단에 기억 보정 값 반영 +- Slack 브리핑에서 누락/오판 사례 재현 시 개선 확인 + +--- + ## 참고 - `book/300_architecture/311_백엔드_구조_원칙.md`