Module 1: 점수화 엔진 설계 (v1.0)

스마트블록 기반 니치 후보를 4가지 지표 × 가중치로 평가하여 신인 블로거도 1등 가능한 세부 주제를 자동 발굴하는 점수화 엔진의 설계 문서.


1. 설계 목표

1.1 입력 / 출력 정의

[INPUT]
- 사용자 프로필: 전문 분야, 기존 블로그 주제, C-Rank 추정치
- 시드 키워드: "제주도", "초등 육아", "다이소" 등 1~5개
- 홈판 추세 데이터: Selenium 자동 수집 또는 수동 CSV 입력
- 옵션: 후보 수 (기본 150), 컷오프 (기본 70점)

[OUTPUT]
- 니치 후보 리스트 (점수순 정렬)
  - 니치 조합: "제주도 + 아이 + 카페"
  - 종합 점수: 0~100
  - 4개 하위 점수: 인기도, 적성, 수익화, 경쟁
  - 추천 제휴 상품 키워드 (수익화용)
  - 예상 월 트래픽 (10K / 5K / 1K)

1.2 핵심 원칙

원칙의미적용
단계적 정확도MVP는 LLM+수동, 안정화 후 실측 APIPhase 1: Selenium+수동 → Phase 3: API 통합
편향 보정단일 지표 압도 방지단일 항목 90점 초과 시 가중치 자동 조정
재현성같은 입력 = 같은 결과 (seed 고정)Claude API temperature=0, seed 옵션
설명 가능성왜 이 점수인지 reasoning 저장각 점수별 “근거 텍스트” 필드 보존

2. 점수 공식 (v1.0)

2.1 종합 점수

니치_점수(0~100) 
  = 홈판_인기도   × 0.30
  + C-Rank_적성   × 0.30
  + 수익화_가능   × 0.25
  + (100 − 경쟁_강도) × 0.15

선정 기준: 70점 이상

참고: 경쟁 강도는 “낮을수록 좋음”이므로 (100 − 경쟁_강도) 형태로 양의 가중치 적용.

2.2 가중치 설계 근거

항목가중치근거
홈판 인기도30%트래픽 폭발 잠재력 = 수익의 1차 동인
C-Rank 적성30%신인 블로거가 노출되려면 적성 일치 필수
수익화 가능25%트래픽이 있어도 제휴/광고 없으면 수익 0
경쟁 강도 (역)15%진입 장벽 — 단독 1등 가능 여부

합계 = 100% | 가중치는 운영 데이터 누적 후 Phase 4(2026-09)에서 튜닝.


3. 4가지 지표 정의 및 측정

3.1 홈판 인기도 (Home Feed Popularity)

정의: 해당 니치 키워드가 네이버 홈판(추천 알고리즘)에 노출될 잠재력.

측정 신호 (총 100점):

신호가중치측정 방법MVP 데이터 소스
홈판 노출 빈도35점네이버 홈판 직접 크롤링Selenium 또는 수동 CSV
검색량 추세 (30일)25점DataLab / Google TrendsPhase 1: Claude 추정
시의성 (계절·이벤트)20점현재 월/계절과의 적합도캘린더 룰 기반
키워드 트렌드 방향20점상승(+) / 보합(0) / 하락(-)Phase 1: Claude 추정

핵심: **홈판 노출 빈도(35점)**가 가장 중요 — 실제 네이버가 어떤 주제를 노출하는지가 직접 신호.

계산 예시:

인기도 = (
    홈판_노출_빈도_점수 * 0.35
    + 검색량_추세_점수 * 0.25
    + 시의성_점수 * 0.20
    + 트렌드_방향_점수 * 0.20
)

3.2 C-Rank 적성 (Creator Rank Affinity)

정의: 사용자의 기존 블로그 주제 / 전문 분야 와 후보 니치의 의미적 매칭도.

측정 신호 (총 100점):

신호가중치측정 방법
주제 의미 유사도50점사용자 프로필 vs 니치 (Claude 평가)
기존 발행 이력 매칭30점최근 30편 카테고리 분포
사용자 자기평가 적성20점사용자가 직접 입력한 “관심도 1~10”

Phase 1 (MVP) 단순화:

  • 사용자 프로필 텍스트 (자기소개) + 니치 후보를 Claude에 전달
  • “이 블로거가 이 주제에 적성이 있는지 0~100으로 평가” 요청
  • 평가 근거 reasoning을 함께 저장

예시:

사용자 프로필: "초등 자녀 1명을 둔 워킹맘. 교육·정리정돈·간편 요리 위주 발행."
 
니치 A: "초등 2학기 학용품 추천" → C-Rank 적성: 92점 (강한 매칭)
니치 B: "비트코인 단타 전략"     → C-Rank 적성: 18점 (불일치)
니치 C: "다이소 정리함 비교"     → C-Rank 적성: 85점 (영역 인접)

3.3 수익화 가능 (Monetization Potential)

정의: 해당 니치로 발행 시 광고 + 제휴 + 지식 창업 수익 잠재력.

측정 신호 (총 100점):

신호가중치측정 방법MVP 데이터 소스
제휴 상품 가용성40점네이버 쇼핑 API 상품 수Phase 1: Claude 추정
평균 제휴 수수료율30점카테고리별 수수료 (3~48%)Phase 1: 카테고리 룩업 테이블
광고 CPM 추정20점콘텐츠 카테고리 × 광고 단가Phase 1: 카테고리 룩업 테이블
지식 창업 확장성10점전자책/강의 수요 가능성Phase 1: Claude 평가

카테고리 룩업 테이블 (예시):

카테고리평균 수수료율예상 CPM비고
뷰티/패션8~15%8K수익률 최상
육아/유아5~10%6K안정적
인테리어/정리5~10%6K다이소 등 강함
식품/요리3~8%4K단가 낮음
IT/디지털2~5%5K수수료 낮음
교육/책5~10%4K지식 창업 강함

3.4 경쟁 강도 (Competition Intensity) — 낮을수록 좋음

정의: 해당 니치 키워드에서 이미 강한 경쟁자가 얼마나 있는지.

측정 신호 (총 100점, 낮을수록 좋음):

신호가중치측정 방법
스마트블록 결과 글 수40점검색 시 상위 노출 글 수
상위 블로거 C-Rank30점상위 10개 글 작성자 신뢰도
키워드 검색량20점(역설적) 너무 높으면 경쟁 ↑
신규 발행 빈도10점최근 30일 신규 글 수

계산 로직:

경쟁_강도 = (
    글_수_점수 * 0.40         # 0(없음) ~ 100(가득)
    + 경쟁자_C_Rank * 0.30    # 0(약함) ~ 100(강함)
    + 검색량_점수 * 0.20      # 100K↑(높음) ~ 1K↓(낮음)
    + 신규_발행_점수 * 0.10
)

# 최종 공식에서는 (100 - 경쟁_강도) 사용 → 낮을수록 가산

MVP 단순화: Claude에게 “이 니치의 경쟁 강도를 0~100으로 평가 (높을수록 경쟁 치열)” 요청.


4. 네이버 홈판 추세 수집 ⭐ (Module 1 핵심 입력)

중요: 홈판 인기도 점수의 35%를 차지하는 핵심 신호. MVP에서도 반드시 포함.

4.1 두 가지 수집 방식 (병행 운영)

방식자동화정확도안정성MVP 우선순위
A. Selenium 자동 수집✅ 완전 자동⭐⭐⭐⚠️ DOM 변경 시 깨짐1순위
B. 수동 CSV 입력❌ 수동⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐백업 (Selenium 실패 시)

4.2 방식 A: Selenium 자동 수집

대상 URL (2026-05-13 실측 후 확정):

https://www.naver.com/                   # ⭐ PC 홈, ContentHeaderView 컴포넌트

대상 탭 (5개) — 콘텐츠 추천 영역:

추천 / 패션뷰티 / 리빙푸드 / 지식 / 건강
(블로그 콘텐츠 관련성 낮은 카테크·웹툰·책방은 제외)

셀렉터: [class*='ContentHeaderView'][class*='tab_list']

  • 8개 탭(추천/카테크/웹툰/패션뷰티/리빙푸드/책방/지식/건강) 모두 포함된 두 번째 tab_list 자동 인식
  • 각 탭 [role='tab'] 클릭 → 2초 대기 → 카드(a[href]) 수집
  • 글로벌 URL dedup으로 페이지 헤더 뉴스 중복 제거

수집 데이터 (스키마, 실구현):

@dataclass
class HomeFeedItem:
    rank: int                # 노출 순위 1~30 (탭별)
    title: str
    tab: str                 # 어느 탭에서 수집 (추천/패션뷰티/...)
    domain: str              # URL 도메인 (blog.naver.com / in.naver.com / ...)
    category: str            # 도메인 또는 탭 기반 카테고리
    keywords: list[str]      # 제목에서 추출한 키워드 (top 8)
    blog_url: str | None
    thumbnail_url: str | None
    collected_at: datetime
    section: str             # "home" (기본)

실측 수집량 (2026-05-13): 5개 탭 × 20건 → 글로벌 dedup 후 74건 (15초)

도메인 분포 (블로그 점수화에 유의미):

  • in.naver.com (인플루언서): 27%
  • happybean.naver.com (펀딩, 트렌드 신호): 16%
  • m.naver.com (네이버 메인): 18%
  • blog.naver.com / m.blog.naver.com: 8%
  • cafe.naver.com: 5%
  • 노이즈(news 등): 7% 미만

수집 로직 (Selenium):

def collect_naver_home_feed() -> list[HomeFeedItem]:
    driver = webdriver.Chrome(options=stealth_options)
    driver.get("https://m.naver.com/")
 
    # 1. 홈피드 카드 50개 스크롤 로드
    for _ in range(5):
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(2)
 
    # 2. 카드 추출 (DOM 셀렉터)
    cards = driver.find_elements(By.CSS_SELECTOR, "div[data-section='home-feed'] article")
 
    items = []
    for idx, card in enumerate(cards, 1):
        items.append(HomeFeedItem(
            rank=idx,
            title=card.find_element(By.CSS_SELECTOR, "h3").text,
            blog_id=card.get_attribute("data-blog-id"),
            category=infer_category(card),
            keywords=extract_keywords(card.find_element(...).text),
            thumbnail_url=card.find_element(By.TAG_NAME, "img").get_attribute("src"),
            collected_at=datetime.now(),
            section="home"
        ))
 
    driver.quit()
    return items

안정성 보강:

  • 재시도: DOM 셀렉터 실패 시 3회 재시도 (5초 간격)
  • 백업 셀렉터: 주 셀렉터 + 대체 셀렉터 2개 (네이버 DOM 변경 대응)
  • 헤더 위장: User-Agent 모바일, 자연스러운 스크롤 (random sleep)
  • rate limit: 한 번에 50개만, 1일 1회 (08:10 자동 스케줄)
  • 실패 알림: Slack 또는 vault system/logs/module1-errors.log

위험:

  • ⚠️ 네이버 DOM 자주 변경 → 월 1회 셀렉터 점검 필요
  • ⚠️ 봇 차단 가능성 → 너무 자주 호출 금지 (1일 1회 권장)
  • ⚠️ 로그인 필요한 영역은 제외 (개인 추천 피드)

4.3 방식 B: 수동 CSV 입력 (백업)

용도: Selenium 실패 시 또는 정확한 데이터가 필요할 때.

CSV 포맷 (00-Inbox/blog/home-feed-YYYY-MM-DD.csv):

rank,title,category,keywords,blog_url
1,"같은 20평인데 우리집만 좁아 보이는 이유","인테리어","인테리어;공간배치;원룸","https://blog.naver.com/abc"
2,"제주도 아이랑 가기 좋은 카페 5곳","육아여행","제주도;카페;아이","https://blog.naver.com/def"
3,"5월 가정의달 다이소 신상 추천","쇼핑","다이소;가정의달;정리","https://blog.naver.com/ghi"
...

수동 입력 방법:

  1. 사용자가 네이버 홈판을 휴대폰으로 5분 스크롤
  2. 메모장 또는 Obsidian에 50개 제목 + 카테고리 기록
  3. CSV로 변환 (Claude에게 “이거 CSV로 변환해줘” 요청 가능)
  4. 00-Inbox/blog/ 폴더에 저장
  5. Module 1이 자동으로 픽업

4.4 수집된 홈판 데이터 → 점수 변환 로직

def calc_home_feed_score(niche: str, home_items: list[HomeFeedItem]) -> tuple[float, str]:
    """니치가 홈판에 얼마나 등장하는지 0~100 점수화"""
    
    # 1. 니치의 키워드 추출 ("제주도 + 아이 + 카페" → ["제주도", "아이", "카페"])
    niche_keywords = niche.split(" + ")
    
    # 2. 홈판 50개 글에서 키워드 매칭 수 카운트
    match_scores = []
    for item in home_items:
        overlap = len(set(niche_keywords) & set(item.keywords))
        if overlap >= 2:    # 2개 이상 겹침 = 강한 매칭
            match_scores.append(item.rank)   # 순위 기록
    
    # 3. 점수 계산: 매칭 개수 + 평균 순위
    if not match_scores:
        score = 30   # 매칭 없음 = 30점 (홈판 미노출 = 기회 또는 위험)
        reason = "현재 홈판에 직접 매칭 없음 (블루오션 또는 트렌드 외)"
    else:
        avg_rank = sum(match_scores) / len(match_scores)
        count_bonus = min(len(match_scores) * 10, 40)   # 매칭 수 보너스 (최대 40)
        rank_score = max(60 - avg_rank, 0)              # 상위 순위 보너스
        score = min(count_bonus + rank_score, 100)
        reason = f"홈판 {len(match_scores)}건 매칭, 평균 순위 {avg_rank:.1f}위"
    
    return score, reason

해석 가이드:

  • 70점↑: 현재 홈판에 강하게 노출되는 트렌드 — 즉시 진입 권장
  • 50~70점: 일부 매칭 — 품질 좋으면 노출 가능
  • 30~50점: 매칭 없음 — 블루오션 또는 트렌드 외
  • 30점: 미매칭 기본값 — 다른 신호로 판단 필요

4.5 수집 스케줄

일일 수집 (Selenium):
  시간: 매일 08:10
  대상: PC 5개 탭(추천/패션뷰티/리빙푸드/지식/건강) 카드 60~120건
  저장: SQLite home_feed 테이블 + system/data/home-feed-YYYY-MM-DD.jsonl
 
주간 분석 (Module 1 실행):
  시간: 매주 금요일 14:00
  입력: 최근 7일 홈판 데이터 ~500건
  분석: Claude 1회 통합 호출 → 니치 150개 생성 + 점수화 + 게이트 + 다양성
  출력: vault `20-Personal/logs/module1-{YYYY-WXX}.md`

5. MVP 알고리즘 (Phase 1)

5.1 LLM-as-a-Judge + 홈판 실측 하이브리드

┌────────────────────────────────────────────────┐
│ 1. 홈판 데이터 수집 (Selenium or CSV)          │
│    → 50개 글 제목·카테고리·키워드 추출         │
└────────────────────────────────────────────────┘
                    ↓
┌────────────────────────────────────────────────┐
│ 2. 시드 키워드 5개 입력 + Claude 호출          │
│    → 150개 세부 니치 조합 생성                 │
└────────────────────────────────────────────────┘
                    ↓
┌────────────────────────────────────────────────┐
│ 3. 4가지 평가 (병렬 처리)                      │
│   a. 홈판_인기도: 홈판 데이터 매칭 (실측 35% │
│                  + Claude 추정 65%)            │
│   b. C-Rank_적성: Claude 평가                  │
│   c. 수익화_가능: Claude + 룩업 테이블         │
│   d. 경쟁_강도:   Claude 평가                  │
└────────────────────────────────────────────────┘
                    ↓
┌────────────────────────────────────────────────┐
│ 4. 종합 점수 + 게이트 룰 + 다양성 보장        │
│    → 상위 N개 추천                             │
└────────────────────────────────────────────────┘
                    ↓
┌────────────────────────────────────────────────┐
│ 5. SQLite 저장 + Markdown 리포트 생성          │
│    → 20-Personal/logs/module1-W19.md           │
└────────────────────────────────────────────────┘

5.2 Claude Prompt 구조 (배치 처리)

System:
  너는 네이버 블로그 니치 평가 전문가다.
  사용자 프로필, 홈판 추세, 니치 후보를 받아 4가지 기준으로 평가한다.
  - 홈판_인기도 (0~100): 현재 홈판 매칭도 + 검색량·시의성·트렌드 종합
  - C_Rank_적성 (0~100): 사용자 전문성과 매칭도
  - 수익화_가능 (0~100): 제휴 상품·광고 CPM·지식 창업
  - 경쟁_강도 (0~100): 높을수록 경쟁 치열 (역지표)
 
  반드시 JSON 배열로 응답, 각 항목에 reasoning 1줄 포함.
 
User:
  사용자 프로필: <자기소개 200자>
  현재 월: 2026-05
  
  현재 네이버 홈판 추세 (50건):
  - [1위] "같은 20평인데 우리집만 좁아 보이는 이유" (인테리어)
  - [2위] "제주도 아이랑 가기 좋은 카페 5곳" (육아여행)
  - [3위] "5월 가정의달 다이소 신상 추천" (쇼핑)
  ...
  
  니치 후보 (150개):
  - "제주도 + 가족 + 유아"
  - "제주도 + 혼자 + 감성"
  ...
 
Output JSON:
  [{
    "niche": "제주도 + 가족 + 유아",
    "popularity": 78,
    "popularity_reason": "홈판 2위 직접 매칭, 5월 가정의달 시의성 ★",
    "affinity": 88,
    "affinity_reason": "워킹맘 프로필과 강한 매칭",
    "monetization": 65,
    "monetization_reason": "키즈 호텔/렌터카 제휴, 수수료 5~10%",
    "competition": 55,
    "competition_reason": "중형 블로거 다수, 신인 진입 가능"
  }, ...]

5.3 종합 점수 계산 (Python)

def calculate_score(item: dict) -> dict:
    """4개 하위 점수 → 종합 점수"""
    score = (
        item["popularity"]   * 0.30 +
        item["affinity"]     * 0.30 +
        item["monetization"] * 0.25 +
        (100 - item["competition"]) * 0.15
    )
    return {
        **item,
        "total_score": round(score, 1),
        "tier": "A" if score >= 80 else "B" if score >= 70 else "C"
    }

6. 편향 보정 메커니즘

6.1 단일 지표 압도 방지

문제: 수익화 100점인데 경쟁 강도 100점 → 종합 점수 76점 (선정됨) → 실제로는 진입 불가 영역

해결: 게이트 키퍼 룰

def apply_gates(item: dict) -> dict:
    # Gate 1: 경쟁 강도 90↑ 시 즉시 탈락
    if item["competition"] >= 90:
        item["tier"] = "REJECTED"
        item["reject_reason"] = "경쟁 과열"
 
    # Gate 2: C-Rank 적성 30↓ 시 탈락
    if item["affinity"] < 30:
        item["tier"] = "REJECTED"
        item["reject_reason"] = "적성 부족"
 
    # Gate 3: 모든 지표 50↓ 시 탈락
    sub_scores = [item["popularity"], item["affinity"],
                  item["monetization"], 100-item["competition"]]
    if all(s < 50 for s in sub_scores):
        item["tier"] = "REJECTED"
        item["reject_reason"] = "전 영역 약세"
 
    return item

6.2 다양성 보장 (카테고리 분산)

문제: 상위 30개가 모두 “다이소 정리” 계열이면 콘텐츠 단조로움 해결: 카테고리별 상한 (예: 한 카테고리 최대 10개)

def diversify(items: list, max_per_category: int = 10) -> list:
    from collections import Counter
    counter = Counter()
    result = []
    for item in sorted(items, key=lambda x: -x["total_score"]):
        cat = item["category"]
        if counter[cat] < max_per_category:
            result.append(item)
            counter[cat] += 1
    return result

7. 데이터 저장 (SQLite 스키마)

-- 7.1 니치 평가 결과
CREATE TABLE niches (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    niche TEXT NOT NULL,
    seed_keyword TEXT,
    category TEXT,
    -- 하위 점수
    popularity REAL,
    popularity_reason TEXT,
    affinity REAL,
    affinity_reason TEXT,
    monetization REAL,
    monetization_reason TEXT,
    competition REAL,
    competition_reason TEXT,
    -- 종합
    total_score REAL,
    tier TEXT,         -- A / B / C / REJECTED
    reject_reason TEXT,
    -- 메타
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    week_id TEXT,      -- 2026-W19 (주차 식별)
    used INTEGER DEFAULT 0  -- 1 = 이미 글 발행함
);
 
CREATE INDEX idx_score ON niches(total_score DESC);
CREATE INDEX idx_week ON niches(week_id);
 
-- 7.2 홈판 추세 데이터 (Selenium 수집)
CREATE TABLE home_feed (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    collected_at TIMESTAMP NOT NULL,
    section TEXT,           -- home / blog_top / datalab
    rank INTEGER,
    title TEXT,
    blog_id TEXT,
    category TEXT,
    keywords TEXT,          -- JSON array
    thumbnail_url TEXT,
    raw_html TEXT           -- 디버깅용 백업
);
 
CREATE INDEX idx_collected ON home_feed(collected_at DESC);
CREATE INDEX idx_section ON home_feed(section);

8. 출력 형식 (Vault Markdown 리포트)

# Module 1 주간 리포트 - 2026-W19 (2026-05-13)
 
## 요약
- 홈판 수집: 350건 (7일치)
- 후보 생성: 150개
- 선정 (70점↑): 38개
- A티어 (80점↑): 12개
- 추천 카테고리: 육아 / 인테리어 / 5월 가족
 
## 홈판 추세 TOP 5 (이번 주)
1. "같은 20평인데 우리집만 좁아 보이는 이유" - 인테리어
2. "제주도 아이랑 가기 좋은 카페 5곳" - 육아여행
3. "5월 가정의달 다이소 신상 추천" - 쇼핑
4. "초등 자녀 학용품 비교" - 교육
5. "워킹맘 일주일 식단 정리" - 요리
 
## A티어 추천 (12개)
 
### 1. [92점] 초등 2학기 학용품 추천 (5월 마무리 ~ 8월 신학기)
- 인기도: 88 (홈판 4위 직접 매칭 + 시의성 ★)
- 적성: 95 (워킹맘 강매칭)
- 수익화: 88 (다이소·문구점 제휴)
- 경쟁: 55 (중형 진입 가능)
- 추천 제휴: 다이소 / 모닝글로리 / 알파문구
 
### 2. [89점] 다이소 정리함 5월 신상 비교
...

9. 검증 계획

9.1 Dry-run 검증 (개발 중)

시나리오 1: 명백한 좋은 니치

  • 입력: 워킹맘 프로필 + “초등 육아” + 홈판 데이터(5월 가정의달)
  • 기대: “초등 2학기 학용품” 80점↑

시나리오 2: 명백히 나쁜 니치

  • 입력: 워킹맘 프로필 + “비트코인”
  • 기대: “비트코인 단타” 50점 미만, REJECTED

시나리오 3: 홈판 매칭 강함

  • 입력: 워킹맘 프로필 + “정리정돈” + 홈판 1위가 “20평 좁아보이는 이유”
  • 기대: “20평 가족공간 정리법” 인기도 90점↑

9.2 실측 검증 (Phase 4, 2026-09)

  • 추천된 A티어 니치로 30편 발행
  • 4주 후 CTR, 체류시간, 수익 측정
  • 점수 vs 실제 성과 상관관계 분석 (Pearson r ≥ 0.6 목표)
  • 가중치 자동 튜닝 (선형 회귀)

10. 구현 일정

Phase일정산출물상태
1 MVP2026-05-13 ~ 05-16core/Selenium/Claude/scorer/gate/report🟢 Day 3/6 완료
2 API 통합2026-06DataLab / Google Trends / Naver Shopping
3 스마트블록 크롤링2026-07경쟁 강도 실측 + 검색 결과 분석
4 튜닝2026-09가중치 회귀 + 게이트 룰 정교화

MVP 실측 결과 (2026-05-13)

단계측정값
홈판 수집 (5개 탭)74건 / 15초
Claude 1회 호출 (50 후보)$0.40 / 90초 / 8,369 출력 토큰
캐시 생성29,821 토큰 (Claude Code system prompt)
운영 비용 추정월 ~$4 (주간 1회 × 150 후보)

11. 핵심 결정 사항

  1. Selenium + 수동 CSV 병행 — Selenium 실패에 대비한 백업 경로 확보
  2. MVP는 LLM-as-a-Judge + 실측 홈판 — 1주일 내 가동, 정확도 균형
  3. 가중치는 30/30/25/15 고정 — 운영 데이터 4주 누적 후 조정
  4. 홈판 인기도 내부 가중치 35/25/20/20 — 실측 데이터(35%) 최우선
  5. 컷오프 70점 — 너무 높으면 후보 부족, 너무 낮으면 노이즈
  6. 3중 게이트 룰 — 단일 지표 압도 / 적성 부족 / 전 영역 약세 자동 탈락
  7. 카테고리 다양성 보장 — 한 카테고리 최대 10개
  8. 홈판 수집 1일 1회 — 봇 차단 위험 최소화

12. 위험 및 대응

위험영향확률대응
네이버 DOM 변경 → Selenium 깨짐Module 1 중단월 1회 셀렉터 점검 + 수동 CSV 백업
봇 차단 (IP·UA)수집 실패1일 1회 + UA 위장 + 수동 백업
Claude 평가 편향점수 신뢰도 ↓Phase 4에서 실측 보정 + 가중치 튜닝
카테고리 분류 오류다양성 보장 실패룩업 테이블 + 수동 보정

관련 문서


작성: 2026-05-13 최종 수정: 2026-05-13 (Day 1~6 완료, MVP 완성) 상태: 🟢 MVP 완성 — 자동 운영 시작 (launchd 등록) 다음 단계: 4주 운영 데이터 누적 후 가중치 튜닝 (Phase 4)