04-rules-importance-scoring

Dec 7, 2025

Importance Scoring

메모리의 중요도를 점수화하는 로직입니다.

왜 중요도를 점수화하는가?

문제

사용자 이메일 1000
추출된 Memory 3000
질문: "중요한 거 뭐야?"

모든 메모리가 동등하지 않습니다:

  • 계약금 500만원 입금 ← 매우 중요

  • 50% 할인 이벤트 ← 덜 중요

해결

memory.importance = ImportanceTier.CRITICAL;  // 1.0

ImportanceTier

enum ImportanceTier {
  CRITICAL = 1.0,  // 필수, 놓치면 안 됨
  HIGH = 0.8,      // 중요, 주목 필요
  MEDIUM = 0.6,    // 보통, 참고용
  LOW = 0.4,       // 낮음, 무시 가능
}

각 티어 기준

티어

점수

기준

예시

CRITICAL

1.0

금전, 계약, 긴급

"계약금 500만원", "오늘까지 결정"

HIGH

0.8

프로젝트, 합의, 일정

"런칭일 확정", "팀 전체 결정"

MEDIUM

0.6

일반 업무, 미팅노트

"회의록", "진행 상황 공유"

LOW

0.4

광고, 뉴스레터

"할인 이벤트", "뉴스레터 구독"

점수 산정 로직

기본 공식

최종 점수 = base_score + Σ(factor_weights)

base_score: 0.4 (LOW)부터 시작

ImportanceFactor

interface ImportanceFactor {
  factor: string;    // 요소 이름
  weight: number;    // 가중치
  evidence?: string; // 근거 텍스트
}

주요 Factor 목록

금전 관련

Factor

Weight

트리거 키워드

contains_money

+0.3

만원, 달러, $, 입금, 결제, 계약금

large_amount

+0.2

100만원 이상, $1000 이상

예시:

"계약금 500만원 입금 완료"
contains_money (+0.3) + large_amount (+0.2)
0.4 + 0.3 + 0.2 = 0.9 HIGH

시간 관련

Factor

Weight

트리거 키워드

has_deadline

+0.2

까지, 마감, deadline, due

urgent_deadline

+0.3

오늘, 내일, 긴급, ASAP

has_date

+0.1

날짜 언급

예시:

"오늘까지 결정해주세요"
has_deadline (+0.2) + urgent_deadline (+0.3)
0.4 + 0.2 + 0.3 = 0.9 HIGH

참여자 관련

Factor

Weight

조건

multi_person

+0.1

수신자 3명 이상

executive_involved

+0.2

임원급 참여

external_party

+0.15

외부 조직 참여

액션 관련

Factor

Weight

트리거 키워드

contains_action

+0.15

해주세요, 부탁, 요청, please

decision_made

+0.2

결정, 확정, 승인, approved

meeting_scheduled

+0.1

미팅, 회의, meeting

콘텐츠 관련

Factor

Weight

조건

is_reply_chain

+0.05

답장 체인의 일부

has_attachment

+0.05

첨부파일 포함

long_content

+0.05

본문 500자 이상

감점 요소

Factor

Weight

조건

is_advertisement

-0.2

광고성 이메일

is_newsletter

-0.1

뉴스레터

is_automated

-0.1

자동 발송 이메일

산정 알고리즘

function calculateImportance(
  content: string,
  metadata: EmailMetadata
): { tier: ImportanceTier; factors: ImportanceFactor[] } {
  const factors: ImportanceFactor[] = [];
  let score = 0.4; // base

  // 1. 금전 체크
  const moneyMatch = content.match(/\d+만원|\$\d+|계약금|입금/);
  if (moneyMatch) {
    factors.push({
      factor: 'contains_money',
      weight: 0.3,
      evidence: moneyMatch[0],
    });
    score += 0.3;
  }

  // 2. 마감 체크
  const deadlineMatch = content.match(/까지|마감|deadline/i);
  if (deadlineMatch) {
    factors.push({
      factor: 'has_deadline',
      weight: 0.2,
      evidence: deadlineMatch[0],
    });
    score += 0.2;
  }

  // 3. 긴급 체크
  if (/오늘|내일|긴급|asap/i.test(content)) {
    factors.push({ factor: 'urgent_deadline', weight: 0.3 });
    score += 0.3;
  }

  // 4. 참여자 수
  if (metadata.recipientCount >= 3) {
    factors.push({ factor: 'multi_person', weight: 0.1 });
    score += 0.1;
  }

  // 5. 광고 감점
  if (isAdvertisement(content)) {
    factors.push({ factor: 'is_advertisement', weight: -0.2 });
    score -= 0.2;
  }

  // 점수 → 티어 변환
  const tier = scoreToTier(Math.min(1.0, Math.max(0.4, score)));

  return { tier, factors };
}

function scoreToTier(score: number): ImportanceTier {
  if (score >= 0.95) return ImportanceTier.CRITICAL;
  if (score >= 0.75) return ImportanceTier.HIGH;
  if (score >= 0.55) return ImportanceTier.MEDIUM;
  return ImportanceTier.LOW;
}

실제 예시

예시 1: 계약 이메일

"ABC회사와의 계약이 확정되었습니다.
계약금 500만원은 금요일까지 입금 부탁드립니다."

Factors:
- contains_money: +0.3 (500만원)
- large_amount: +0.2 (100만원 이상)
- has_deadline: +0.2 (금요일까지)
- decision_made: +0.2 (확정)
- external_party: +0.15 (ABC회사)

Score: 0.4 + 0.3 + 0.2 + 0.2 + 0.2 + 0.15 = 1.45 cap to 1.0
Tier: CRITICAL

예시 2: 일반 미팅

"내일 2시에 회의실 A에서 미팅합시다."

Factors:
- meeting_scheduled: +0.1
- has_date: +0.1

Score: 0.4 + 0.1 + 0.1 = 0.6
Tier: MEDIUM

예시 3: 뉴스레터

"이번 주 인기 상품 50% 할인!"

Factors:
- is_advertisement: -0.2

Score: 0.4 - 0.2 = 0.2 min to 0.4
Tier: LOW

ImportanceFactor 저장 이유

memory.importanceFactors = [
  { factor: 'contains_money', weight: 0.3, evidence: '500만원' },
  { factor: 'has_deadline', weight: 0.2, evidence: '금요일까지' },
];

투명성

사용자: "왜 이게 중요해?" 시스템: "금액(500만원)과 마감일(금요일)이 포함되어 있습니다"

디버깅

점수가 이상하면 factors를 확인하여 원인 파악

학습

어떤 factor가 실제로 유용한지 분석

다음 문서

  • → Conflict Resolution: 충돌 해결 규칙

  • → MemoryNode: importance 필드 사용