DOCS/journey/plans/260113_coldmail_ontology_phase1_5_bayesian_learning.md
Claude-51124 09c4b3372c docs: Phase 1.5 계획 문서 코드 원칙 준수 내용 추가
- Beta 업데이트 패턴 참고 명시 (intent_runtime_repository)
- Repository 분리 타당성 명시 (도메인별 분리)
- 코드 원칙 준수 확인 내용 추가
2026-01-13 10:45:11 +09:00

5.4 KiB
Raw Blame History

콜드메일 온톨로지 Phase 1.5: 베이지안 학습 구현 계획

날짜: 2026-01-13
목표: 온톨로지 규칙 confidence 값을 하드코딩에서 베이지안 학습 기반으로 전환
원본 계획: plans/251016_ontology_coldmail_implementation.md (Phase 1 완료)


배경

현재 문제점

  • 하드코딩된 confidence: 온톨로지 규칙의 confidence 값(0.7, 0.9 등)이 코드에 하드코딩되어 있음
  • 학습 불가능: 사용자 피드백이 규칙 confidence에 반영되지 않음
  • 정적 판정: 시간이 지나도 규칙 신뢰도가 개선되지 않음

기존 구현 상태

  • Phase 1 완료: 온톨로지 규칙 엔진 구현 완료 (10개 규칙)
  • Naive Bayes: 단어 빈도 기반 학습은 구현되어 있으나, 온톨로지 규칙과 분리됨
  • 피드백 시스템: Slack 피드백 수집은 되지만 규칙 confidence 업데이트에 미사용

목표

핵심 목표

  • 규칙별 Beta(α,β) 분포: 각 온톨로지 규칙(R1, R1B, R2 등)별로 Beta 분포 파라미터 저장
  • 피드백 기반 업데이트: 사용자 "맞음" 피드백 → α 증가, "틀림" 피드백 → β 증가
  • 동적 confidence 계산: confidence = α/(α+β)로 실시간 계산하여 하드코딩 값 대체

기대 효과

  • 지속적 개선: 피드백이 누적될수록 정확도 향상
  • 규칙별 적응: 각 규칙이 실제 데이터에 맞게 자동 조정
  • 투명성 유지: 온톨로지 규칙의 설명 가능성 보존

구현 계획

Phase 1.5.1: DB 스키마 설계 (2시간)

테이블: coldmail_ontology_rule_stats

CREATE TABLE coldmail_ontology_rule_stats (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    rule_id VARCHAR(50) NOT NULL UNIQUE,  -- R1, R1B, R2, R3, ...
    alpha FLOAT DEFAULT 1.0,  -- Beta 분포 α 파라미터
    beta FLOAT DEFAULT 1.0,   -- Beta 분포 β 파라미터
    created_at TIMESTAMP DEFAULT NOW(),
    updated_at TIMESTAMP DEFAULT NOW()
);

CREATE INDEX idx_rule_id ON coldmail_ontology_rule_stats(rule_id);

초기 데이터: 10개 규칙에 대해 alpha=1.0, beta=1.0 (균등 분포)로 초기화

참고: 다른 모듈의 베이지안 구현

  • app/core/emotion/bayesian.py: Beta 분포 업데이트 패턴
  • app/services/brain/intent_store.py: intent_path_stats 테이블의 alpha/beta 구조

Phase 1.5.2: Repository 구현 (3시간)

파일: rb8001/app/state/repositories/coldmail_ontology_repository.py

필수 함수:

  • get_rule_confidence(rule_id): 규칙별 confidence 조회 (α/(α+β))
  • update_rule_feedback(rule_id, is_correct): 피드백 기반 alpha/beta 업데이트 (맞음→alpha+1, 틀림→beta+1)
  • get_all_rule_stats(): 모든 규칙의 alpha/beta 조회

참고 패턴:

  • coldmail_classifier_repository.py: 단어 카운트 도메인 (다른 도메인이므로 분리 유지)
  • intent_runtime_repository.py: update_beta() 함수의 INSERT ... ON CONFLICT 패턴 참고 (테이블 구조는 다르므로 완전 공통화는 어려움)

Phase 1.5.3: 온톨로지 Reasoner 수정 (4시간)

파일: coldmail_ontology_reasoner.py:251-328

변경 사항:

  • decide_coldmail() 함수를 async로 변경
  • 매칭된 규칙의 confidence를 DB에서 동적 조회 (하드코딩 값 대신)
  • DB 없을 때 하드코딩 값 폴백 (하위 호환성)

Phase 1.5.4: 피드백 연동 (3시간)

파일: coldmail_feedback.py, coldmail_processor.py, slack/coldmail_service.py

변경 사항:

  • process_coldmail()에서 매칭된 규칙 ID 저장
  • 사용자 피드백 시 매칭된 규칙들의 alpha/beta 업데이트 (맞음→alpha+1, 틀림→beta+1)

Phase 1.5.5: 테스트 및 검증 (2시간)

테스트 케이스:

  1. 초기 상태: DB 없을 때 하드코딩 값 사용 확인
  2. 피드백 업데이트: "맞음" 클릭 후 alpha 증가 확인
  3. confidence 계산: α/(α+β) 값이 올바르게 계산되는지 확인
  4. 다중 규칙: 여러 규칙 매칭 시 각각 독립적으로 업데이트되는지 확인

검증 지표:

  • 피드백 반영 시간: 즉시 반영 (< 1초)
  • 하위 호환성: 기존 하드코딩 값과 유사한 초기 동작
  • 정확도 개선: 피드백 누적 후 정확도 향상 측정

구현 순서

  1. DB 스키마 생성 (Phase 1.5.1)
  2. Repository 구현 (Phase 1.5.2)
  3. 온톨로지 Reasoner 수정 (Phase 1.5.3)
  4. 피드백 연동 (Phase 1.5.4)
  5. 테스트 및 검증 (Phase 1.5.5)

소요 시간: 총 14시간 (약 2일)


참고 문서

  • 원본 계획: plans/archive/251016_ontology_coldmail_implementation.md
  • Phase 1 구현: troubleshooting/251014_claude_coldmail_filter_tokenization_issue.md
  • 검증 문서: troubleshooting/251016_ontology_filter_validation.md
  • 베이지안 패턴: app/core/emotion/bayesian.py, app/services/brain/intent_store.py

주의사항

  • 하위 호환성: 기존 하드코딩 값은 초기값으로 유지 (DB 없을 때 폴백)
  • 점진적 전환: 기존 규칙 confidence를 DB에 마이그레이션하여 초기값 설정
  • 성능: DB 조회는 비동기로 처리하여 필터링 속도 저하 방지
  • 코드 원칙 준수: Repository 패턴 사용, 도메인별 분리 유지 (coldmail_classifier_repository는 단어 카운트, coldmail_ontology_repository는 규칙 통계로 분리)