본문 바로가기
AI 활용 & 구조화/자동화 기록

[11편] “이 뉴스, 쓸 가치 있나?” 자동 선별 로직 만들기 (Make.com + DeepSeek)

by momncode 2025. 12. 26.

뉴스 자동화의 성패는 ‘요약’이 아니라 선별에서 갈립니다.
Make.com에서 점수화(score) + 자동 제외 흐름을 만들면, “쓸 만한 것만” 남는 시스템이 됩니다.


✅ 이 편의 핵심 목적

모든 뉴스를 요약하지 않습니다.
대신, 블로그에 올릴 가치가 있는 것만 자동으로 남깁니다.

  • (1) 뉴스 수집 → (2) 1차 저비용 필터 → (3) DeepSeek 가치판단/점수화 → (4) 점수 낮으면 자동 제외 → (5) 통과한 것만 요약/게시 브랜치로 이동
    이 구조가 완성되면, 자동화가 “일을 늘리는 기계”에서 품질을 지키는 편집자로 바뀝니다.

🔎 뉴스 선별이 자동화의 마지막 난관인 이유

1) 자동화는 “양”을 폭발시킨다

RSS/뉴스레터/구글 알림을 붙이는 순간부터 콘텐츠는 매일 쌓입니다.
요약 자동화만 해두면 결국 결과물이 “정리된 뉴스 쓰레기장”이 되기 쉽습니다.

2) 블로그의 신뢰는 ‘선별’에서 결정된다

사람이 다시 오는 이유는 “많이 올려서”가 아니라,
**“여기엔 쓸 만한 것만 있다”**는 경험 때문입니다.

3) 선별은 주관이 들어가서 어려워 보이지만…

주관을 “룰 + 점수”로 바꾸면 자동화가 가능합니다.
핵심은 내가 중요하다고 보는 기준을 명문화하는 것입니다.


📌 ‘의미 없는 뉴스’ 기준 정의하기

여기서부터는 “내 블로그(캐나다 생활 + 돈/경제)” 전제의 예시로 잡겠습니다.
(다른 주제라도 뼈대는 그대로 가져가면 됩니다.)

A. 의미 없는 뉴스(자동 제외 후보) 대표 유형

아래 중 하나라도 강하면 점수가 크게 깎이도록 설계합니다.

  • 단발성·소모성: 하루 지나면 의미가 사라짐(“오늘만 세일”, “일시적 해프닝”)
  • 정보 밀도 낮음: 제목만 요란하고 실내용이 빈약(인용/재탕 기사)
  • 내 독자와 무관: 토론토/캐나다 생활 맥락이 전혀 없거나, 돈/경제 카테고리와 무관
  • 행동으로 연결 불가: 읽어도 할 수 있는 것이 없음(체크리스트/영향/대응이 없음)
  • 출처 신뢰 낮음: 익명 루머/선정적 클릭 유도
  • 중복: 같은 사건의 ‘후속 기사’인데 새 정보가 없음

B. “캐나다 라이트 vs 돈/경제” 관점 필터(빠른 룰)

  • 캐나다 라이트(생활 정보):
    • 내 생활에 영향(절차/비용/규정/교통/교육/의료/육아/이민/치안 등)이 있으면 가산점
    • “토론토/온타리오” 지역성 있으면 추가 가산점
  • 돈/경제:
    • 금리/인플레이션/주택/세금/고용/환율/가계지출/정책 변화처럼 구조적 영향이면 가산점
    • 단기 주가 등락·연예인 코인·소문은 감점

C. 이 기준을 “기계가 읽을 수 있게” 바꾸기

기계는 “감”을 못 읽습니다. 그래서 아래를 명확히 적어줘야 합니다.

  • 어떤 키워드를 만나면 감점? (예: “rumor”, “leak”, “exclusive”, “shocking” 등 클릭 유도)
  • 어떤 키워드를 만나면 가산점? (예: “policy”, “rate”, “Ontario”, “Toronto”, “regulation” 등)
  • “행동 가능성”을 어떻게 판단? (예: “What it means”, “How it affects”, “What to do”가 있으면 가산)

이걸 다음 단계에서 DeepSeek 프롬프트에 녹입니다.


🧠 DeepSeek에게 “쓸 가치 판단” 시키는 프롬프트

아래는 Make.com에서 그대로 붙여 쓰기 좋은 형태로 설계한 프롬프트 예시입니다.
핵심은 “모호한 감상”이 아니라 정해진 스키마(JSON) 로 출력시키는 것입니다.


1) 출력 JSON 스키마(고정)

DeepSeek는 반드시 아래 키로만 답하게 합니다.

 
{ "score": 0, "decision": "DROP", "category": "canada_light", "reasons": ["...","..."], "signals": { "local_relevance": 0, "actionability": 0, "novelty": 0, "credibility": 0, "economic_impact": 0, "evergreen": 0 }, "recommended_angle": "한 줄 방향성" }
  • score: 0~100
  • decision: PUBLISH / REVIEW / DROP
  • signals.*: 0~5 (점수 근거를 구조화)
  • recommended_angle: 나중에 12편(인사이트)로 연결되는 “글 방향” 씨앗

2) 시스템/유저 프롬프트(복붙용)

System (권장)

 
You are an editor scoring whether a news item is worth publishing on a blog for people living in Canada (Toronto focus). Return ONLY valid JSON that matches the given schema. Do not add any extra keys or text. Base your judgment strictly on the provided title + excerpt. Do not invent facts.
 

User (템플릿)

 
Evaluate this news item for publishing. [Blog Focus] - Audience: People living in Canada, Toronto/ON focus - Categories: (1) canada_light (practical life impact) (2) money_economy (macro/household impact) [Meaningless News = strong penalty] - Pure gossip/rumor/clickbait - Duplicate with no new information - No Canada relevance, no actionable takeaway - Low credibility source indicators [Scoring Guide] - local_relevance (0-5): Canada/Toronto relevance - actionability (0-5): reader can do something with it - novelty (0-5): new information beyond headline - credibility (0-5): reliable, non-sensational - economic_impact (0-5): affects household money / policy / rates / jobs - evergreen (0-5): still useful after 1-2 weeks [Decision Rules] - score >= 70 => PUBLISH - 50-69 => REVIEW - < 50 => DROP [Input] title: "{{TITLE}}" source: "{{SOURCE}}" published_at: "{{DATE}}" excerpt: "{{EXCERPT_OR_SNIPPET}}" Return ONLY JSON.

운영 팁(중요)

  • 기사 본문을 못 긁어오는 경우가 많습니다. 그럴 때는 우선 RSS description/snippet 기반으로 점수화하고, REVIEW에 걸린 것만 “본문 추출(HTTP)”을 추가로 하세요.
  • 이렇게 하면 비용과 실패율이 확 줄어듭니다.

🧮 중요도 점수(score) 컬럼 설계

이제 “판단 결과”를 쌓을 그릇(시트/DB)을 설계합니다.
가장 추천은 Google Sheets(가볍게) → 장기 운영 시 Data Store(더 안정적)입니다. 

A. 시트 컬럼(최소 구성)

  • id (해시 또는 UUID)
  • source
  • title
  • url
  • published_at
  • excerpt
  • category (canada_light / money_economy)
  • score (0~100)
  • decision (PUBLISH/REVIEW/DROP)
  • reasons (문장 2~4개)
  • signals_local / signals_action / … (0~5)
  • processed_at
  • scenario_run_id (나중에 추적용)

B. “고급 운영자” 컬럼(추천)

  • prefilter_passed (TRUE/FALSE)
  • model_version (DeepSeek 모델명/버전 문자열)
  • prompt_version (v1/v2 등)
  • cost_estimate (대략 토큰/호출수 추정치)
  • needs_manual_review (TRUE/FALSE)
  • drop_reason_tag (duplicate / no_canada / no_action / low_credibility 등)

이걸 해두면, 2주만 운영해도 “내가 뭘 버리고 뭘 살렸는지”가 데이터로 남아서 프롬프트가 급격히 좋아집니다.


🔁 점수 낮은 뉴스는 자동 제외하는 흐름

이 파트가 11편의 실전 핵심입니다. Make.com에서 Router + Filter를 사용해 “점수에 따른 분기”를 만듭니다. 


1) 전체 시나리오 구조(권장 청사진)

[A] 수집(Trigger)

  • RSS Watch / 이메일 / 웹훅 등으로 “새 뉴스” 들어옴

[B] 1차 프리필터(저비용)

  • (예) 제목/출처/키워드로 대충 거르기
  • (예) 너무 짧은 항목(본문 1줄) DROP
  • (예) “Canada/Toronto” 완전 무관이면 DROP

[C] DeepSeek 점수화(핵심)

  • HTTP로 DeepSeek 호출(또는 사용 중인 AI 모듈)
  • JSON으로 결과 받기

[D] JSON Parse

  • Make의 JSON Parse 모듈로 score/decision/... 필드 분해 

[E] Router로 분기(중요)

  • Route 1: score ≥ 70 → “요약/게시 브랜치”
  • Route 2: 50–69 → “리뷰 대기열(수동 확인)”
  • Route 3: < 50 → “자동 제외(로그만 남기고 종료)”

[F] 예외/오류 처리

  • DeepSeek 응답이 JSON 깨지면: 재시도 1회 → 그래도 실패면 REVIEW로 보내기
  • 에러 핸들러로 알림(이메일/슬랙) 

2) Make.com에서 실제로 어떻게 배치하나(모듈 레벨)

아래는 “브랜치 2 (Make.com 기반)” 스타일로, 구현 순서를 딱 잘라 적습니다.

Step 1. 트리거 모듈

  • RSS > Watch RSS feed items (또는 사용 중인 소스)

Step 2. 중복 방지(필수)

  • (쉬움) Google Sheets에서 url 검색 → 있으면 종료
  • (안정) Data Store에 url_hash 저장 후 존재 여부 체크

Step 3. 1차 프리필터(필터 1개만으로도 효과 큼)

필터 예시:

  • title/description 길이 < N → DROP
  • 특정 키워드 포함(예: “celebrity”, “gossip”) → DROP
  • “Canada/Toronto/Ontario” 관련 키워드 0개 AND 돈/경제 키워드 0개 → DROP

포인트: DeepSeek 호출 전에 싸구려 필터로 30~60%만 쳐내도 비용/속도 체감이 큽니다.

Step 4. DeepSeek 호출(HTTP)

  • HTTP > Make a request
  • Body에 위 프롬프트 템플릿 주입 (TITLE/EXCERPT 매핑)

Step 5. JSON Parse

  • JSON > Parse JSON으로 스키마 고정 
  • 여기서부터는 score/decision이 “필드”로 잡힙니다.

Step 6. Router 분기(점수 기반)

  • Flow control > Router 
    • Route A (PUBLISH): score >= 70
    • Route B (REVIEW): 50 <= score <= 69
    • Route C (DROP): score < 50
  • 각 Route 앞에 Filter를 붙이면 됩니다. 

Step 7. DROP 라우트 처리(중요)

DROP는 “그냥 버리면 끝”이 아니라, 로그를 남기고 끝내야 운영이 편해집니다.

  • Google Sheets “drop_log” 시트에 1줄 저장
    • title, score, reasons, drop_reason_tag, source, url, processed_at

나중에 프롬프트가 이상해졌을 때, 이 로그가 디버깅의 생명줄입니다.

Step 8. REVIEW 라우트 처리(운영자용)

  • Slack/이메일로 “리뷰 후보 5개만 묶어서” 알림
  • 또는 “REVIEW 대기열” 시트에 쌓아두기
  • (고급) 하루 1회 리뷰 대기열을 모아 “오늘 볼 것 TOP 5”만 다시 선별

Step 9. PUBLISH 라우트는 12편으로 자연 연결

  • 여기서부터 요약/해석/게시(12편)가 시작됩니다.
    즉, 11편은 편집 데스크, 12편은 칼럼니스트 역할입니다.

🧰 생활 팁: 선별 로직이 바로 좋아지는 “운영자 트릭 5개”

  1. 임계값을 처음부터 높이지 마세요
  • 시작은 PUBLISH >= 65로 넉넉히 → 1주 후 70~75로 올리기
  1. REVIEW를 “실패”가 아니라 “보험”으로 쓰세요
  • AI가 애매하면 사람에게 넘기는 구조가 오래 갑니다.
  1. 기사 본문 추출은 “REVIEW만” 하세요
  • 모든 기사 본문 스크래핑은 비용/실패율 폭탄이 됩니다.
  1. 프롬프트 버전 컬럼(prompt_version)을 꼭 남기세요
  • 프롬프트 수정 후 성능이 좋아졌는지 나빠졌는지 바로 보입니다.
  1. DROP 로그를 주 1회만 훑어도 기준이 선명해집니다
  • “내가 버리려는 게 뭔지”를 보면서 기준이 정교해집니다.

🧠다음글 예고 (12편)

선별(11편)까지 해두면, 이제 남는 건 “쓸 만한 뉴스”입니다.
그런데 요약만 붙이면 결국 다른 블로그와 비슷해집니다.
다음 편에서는 DeepSeek로 한 줄 해석(인사이트) 을 자동 생성해서 “독자에게 왜 중요한지”까지 전달하는 구조를 만듭니다.
투자 관점/생활 관점을 분기하고, 시트에 insight 컬럼을 저장해 글에서 강조하는 방식까지 연결합니다.