HOW IT WORKS

NGEPT Sensing Dashboard

뉴스 수집부터 인사이트 노출까지, 전체 파이프라인을 처음부터 끝까지 단계별로 설명합니다.

160+

RSS 채널

Global / China / Japan

120

일일 후보

→ 정밀 70개

14

Taxonomy

Insight 카테고리

3

Gemini 모델

2.5/2.0/1.5 폴백

2

푸시 시간대

오전 8시 · 오후 2시

📌 한눈에 보는 전체 흐름

① 매일 새벽 RSS 수집 — 160여 개 매체와 긱 커뮤니티에서 최신 글을 가져옵니다.
② 1차 후보 압축 — 전략 키워드·매체당 쿼터로 120개 후보를 추립니다.
③ 커뮤니티 화제 추출 (병렬) — 400개 게시글에서 15개 핫키워드를 1회 호출로 마이닝합니다.
④ 2단계 AI 채점 — gemini-2.5-flash-lite로 경량 채점(120개) → 상위 70개를 gemini-2.5-flash로 정밀 분석.
⑤ Composite Score 합성 — Tier 1·중복 보도·커뮤니티 buzz 가산점을 더해 최종 점수를 매깁니다.
⑥ 중복 보도 dup_count 집계 — 65% 유사도 이상의 기사를 묶어 보도 빈도를 카운트합니다.
⑦ Firestore 저장 + 오늘의 인사이트 자동 생성 — 상위 15개로 IT 기획자 관점 인사이트 3개를 만듭니다.
⑧ PWA 푸시 알림 — 오전 8시·오후 2시 KST에 자동 발송됩니다.
⑨ 프론트엔드 인터랙션 — Daily 센싱 / News Landscape / 주제 리서치 / Weekly Likes / My·Shared Board.

1

데이터 수집 — RSS Crawler

매일 새벽 자동 실행 · 뉴스와 커뮤니티를 분리 수집

channels.json 에 정의된 3개 카테고리(Global Innovation / China & East Asia / Japan & Robotics)의 160여 개 RSS 피드를 ThreadPoolExecutor(max_workers=30) 으로 병렬 호출합니다.

📰 뉴스 피드 — 최근 2일치 글만 수집 · The VergeTechCrunch WiredBloomberg NikkeiCNBC
💬 커뮤니티 피드 — 최근 4일치 포스트 · RedditHacker News V2EXClien DCInside
🖼️ 메타데이터 자동 추출 — 각 entry에서 썸네일을 5단계 fallback (media_contentmedia_thumbnailenclosure → links → HTML img tag) 로 탐색하고, 추적용 1×1 픽셀·analytics 도메인은 자동 제외합니다.

⚠️ 수집 실패한 채널은 로그로 남기되 파이프라인 전체는 멈추지 않습니다. 네트워크 타임아웃은 10s 로 고정.

2

1차 후보 압축 — Pre-filtering

전략 키워드 기반 사전 점수 · 매체 다양성 보장

전략 키워드 매칭으로 pre_score 부여
aiapple metagoogle wearablering glassrobot uxrelease launch
각 키워드 hit당 +3점.
매체별 다양성 쿼터 — 같은 매체에서만 점수가 몰리는 것을 막기 위해 출처별 상위 35개로 1차 컷.
최종 후보 120개 — pre_score · date_obj 내림차순으로 정렬해 채점 대상 풀로 확정합니다.

3

커뮤니티 화제 키워드 추출

병렬 파이프라인 · 단일 Gemini 호출로 비용 최소화

커뮤니티는 개별 분석 대신 제목 400개를 한 번에 gemini-2.5-flash 에 던져 "지금 가장 논쟁/화제가 되는 고유명사 15개"만 뽑아냅니다.

🚨 일반 명사 차단 리스트AppleGoogle AITech PlatformUpdate 같은 흔한 단어는 결과에서 자동 제거.
✅ 타겟 예시Galaxy RingVision Pro SideloadingCopilot+ Rabbit R1Devin
🛟 폴백 로직 — Gemini 호출이 실패하면 자체 정규식 분석기로 대문자 고유명사를 Counter.most_common(15) 추출.
💾 저장 — Firestore community_buzz/{today} 컬렉션에 버즈 키워드 + buzz_score 상위 30개 포스트(한국어 번역 포함)를 저장합니다.

4

2단계 AI 채점 파이프라인

경량 → 정밀, 토큰 비용을 70% 절감하는 핵심 단계

1단계 · 경량 채점
· 모델: gemini-2.5-flash-lite
· 대상: 후보 120개 전수
· 출력: {"score": 0~100}
· 병렬: max_workers=30, 0.05~0.5초 지터
· 목적: 토큰을 거의 안 쓰면서 상위 70개만 추리기
2단계 · 정밀 분석
· 모델: gemini-2.5-flash (503 발생 시 2.0-flash 폴백)
· 대상: 1단계 상위 70개
· 병렬: max_workers=8 (Rate Limit 보호)
· System Instruction: DEFAULT_FILTER_PROMPT + 전략 태그 풀 + 14개 카테고리 목록
· 모든 텍스트는 한국어로 자연스럽게 생성

📤 2단계 결과로 받는 필드

score (0~100) insight_category insight_title (KO) core_summary (KO) keywords (≤5) strategic_tags (공식 풀 ≤2) search_tags (≤10) metadata_json detailed_analysis embedding (gemini-embedding-001)

🗂️ Insight Category 14종

Product — A1.신규 HW · A2.HW 업그레이드 · A3.신규 SW · A4.SW 업데이트 · A5.신규 UX 패러다임
Tech — B1.AI 모델 혁신 · B2.핵심 부품/센싱 · B3.신기술 최초 상용화
Business — C1.M&A·투자 · C2.전략적 제휴 · C3.핵심 인재 영입
Market — D1.유출·루머 · D2.규제·윤리 · D3.시장 점유율

5

Composite Score 합성

AI 기본 점수 + 가산점 3종 = 최종 점수

최종 점수 = AI 기본 점수 + Tier 1 가산 + 중복 보도 가산 + 커뮤니티 buzz 가산
🏆 Tier 1 매체 가산 — TechCrunch · Bloomberg · Verge · Wired · Nikkei · WSJ · Reuters 등
점수 80점 이상일 때 +5 (사이드바에서 0~15 조정 가능)
🔗 중복 보도 가산 — 유사도 65% 이상 기사 누적 건당 +3 (최대 3건까지)
💬 커뮤니티 buzz 가산 — Phase 3에서 뽑힌 hot keyword와 기사 keywords가 겹칠 때 겹친 수 × +5

· 50점 미만은 최종 풀에서 자동 탈락 · 가중치는 사이드바 🛠️ 고급 설정에서 실시간 조정 가능

6

중복 보도 dup_count 집계

여러 매체가 동시 보도한 기사를 하나로 묶기

difflib.SequenceMatcher 로 기존 풀과의 제목 유사도를 측정하고, 링크가 동일하거나 유사도 ≥ 0.65 일 때 하나로 합치며 dup_count 를 누적합니다.

· 합쳐진 기사는 분석 화면에서 "🔗 중복/연관 기사" 섹션에 함께 노출
· dup_count가 클수록 그 사건이 업계 전반에서 동시다발로 다뤄진다는 신호
· Composite Score 가산도 이 값을 기준으로 계산

7

Firestore 저장 + 오늘의 인사이트 생성

데이터 저장 직후 IT 기획자 관점 인사이트를 자동 생성

📚 Firestore 컬렉션 구조

morning_sensing/{YYYY-MM-DD} · 그날 분석된 전체 기사
morning_sensing/latest · 최신 120개 (대시보드 첫 로딩용)
community_buzz/{YYYY-MM-DD} · 핫 키워드 + 상위 30개 포스트(한국어 번역)
daily_insights/{YYYY-MM-DD} · 인사이트 3개 + 근거 팩트

🧠 오늘의 인사이트 생성 로직

· 상위 15개 기사 제목/요약을 프롬프트로 묶어 Gemini에 1회 호출
· 출력: [{"insight":"...", "facts":["…","…","…"]}, …] 형태 3개
· 각 인사이트는 60어절 이내 · 회사명/제품명/수치 등 실제 근거 1~2개 인용
· 503 오버로드 시 2.5-flash → 2.0-flash → 1.5-flash 폴백 (최대 5회 재시도)

8

PWA 푸시 알림 발송

Railway Cron이 하루 두 번 자동 푸시

· 스크립트: send_push.py
· 발송 시간: 오전 8시 KST (UTC 23:00) · 오후 2시 KST (UTC 05:00)
· 데이터 소스: morning_sensing/latest 의 Top 1 기사 + 오늘의 인사이트 1개
· 구독자 목록: Firestore push_subscriptions · Web Push API (VAPID)
· 클릭 시 PWA를 열고 해당 기사로 딥링크

9

프론트엔드 · 사용자 인터랙션

Reflex로 만든 통합 SPA · 6가지 뷰 모드

🌅 데일리 모닝 센싱 — 오늘 또는 과거 날짜의 큐레이션 결과를 봅니다.
· Must Know — Composite ≥ 임계값(기본 85점) 3~6개 자동 선정
· Top Picks — Global / Japan / China 비율을 사이드바에서 조정 (기본 50% : 20% : 30%)
🗺️ News Landscape — 6개 대분류 × 복수 중분류 카드 그리드.
· 각 카테고리당 평균 점수 / strategic_tags / 기사 수 표시
· 카드/뱃지 클릭 시 우측 패널에서 통합 AI 브리핑 생성
· 분석 기간: 오늘 / 최근 1주 / 2주 / 1달
❤️ Weekly Likes — 사용자가 ❤️를 누른 기사를 주차별로 모아 표시.
· 이번 주 + 직전 4주까지 무한 스크롤
· 모든 사용자의 좋아요 카운트를 합산해 노출 (인기 기사 시그널)
⚡ 주제 리서치 — 키워드를 직접 입력하거나 strategic_tags / 커뮤니티 키워드에서 클릭 추가.
① 최근 14일 morning_sensing에서 매칭 기사 ≤30개 자동 수집
② Gemini가 5섹션 심층 보고서(시장 / 기술 / 사용자 / 비즈니스 / 기획 아이디어) 생성
Google Search Grounding ON — 수집 기사 외 실시간 웹 검색으로 보강, 출처 URL은 사이드바에 별도 표시
📂 My Board / 🤝 Shared Board — 주제 리서치 결과나 개별 기사 카드를 저장.
· My Board: 본인 전용 컬렉션
· Shared Board: 팀 단위 공유. 즐겨찾기 → 매거진(슬라이드 PDF) 으로 발행 가능
🔗 수동 기사 분석 — 사이드바에서 임의 URL 입력 시 본문을 크롤링해 즉석에서 Gemini 채점·요약·심층 분석 후 Firestore에 저장.

10

운영 · 인프라 스택

한 명이 유지보수할 수 있도록 단순하게 설계

🐍 Backend — Python 3.11 · Reflex (Full-stack) · batch.py 모닝 파이프라인 · send_push.py 푸시 발송 · regen_insight.py 인사이트 재생성
🔥 Data — Firebase Firestore (morning_sensing / community_buzz / daily_insights / saved_articles / shared_board / push_subscriptions / weekly_likes)
🤖 AI — Google Gemini API · 모델 폴백 체인 2.5-flash → 2.0-flash → 1.5-flash · 임베딩 gemini-embedding-001 (768dim, REST 직접 호출)
🚂 Deploy — Railway · Nixpacks 빌드 · Cron Job 2개 (모닝 배치 / 푸시 알림) · PWA 매니페스트 + Service Worker
👤 사용자 모드 — User / Admin 2단 분리. Admin 모드는 가중치 슬라이더, 원문 번역 탭, 큐레이션 로직 탭, My Board 카드 저장이 추가 노출됩니다.

궁금한 단계가 있으면 사이드바 ⓘ 시스템 작동 원리 도움말을 열면 동일한 흐름을 짧게 다시 볼 수 있습니다.