A.DIFF : n8n과 Upstage Solar로 만든 개인화 뉴스레터 자동화 파이프라인

현서·2026년 3월 31일
post-thumbnail

Upstage AI Ambassador 프로젝트로 진행한 A.DIFF 뉴스레터 자동화 파이프라인 설계/구현 기록


목차

  1. 문제 정의: 정보는 많은데, 실행 가능한 신호는 적다
  2. 해결 전략: 멀티소스 수집 + LLM 필터링 + 개인화 발송
  3. 워크플로우 아키텍처 (n8n)
  4. 핵심 구현 포인트
  5. 실행 결과(샘플 런 기준)
  6. 트러블슈팅 & 개선 포인트
  7. 마무리

1. 문제 정의: 정보는 많은데, 실행 가능한 신호는 적다

AI/스타트업 관련 정보는 매일 쏟아집니다.
문제는 정보의 양 자체가 아니라, 지금 내가 봐야 할 신호를 골라내는 비용입니다.

매주 쏟아지는 정보는 대체로 세 갈래로 나뉩니다.

  • 논문/모델 릴리스(기술 신호)
  • Product Hunt/스타트업 미디어(시장 신호)
  • 글로벌 빅테크 블로그(전략 신호)

문제는 이 정보들이 한곳에 정리되어 들어오지 않는다는 점입니다.
직접 여러 소스를 오가며 확인하고, 중복을 제거하고, 우선순위를 다시 매겨야 합니다.
특히 “이번 주에 실제로 봐야 할 것”만 남기는 과정이 생각보다 오래 걸립니다.

그래서 이번 프로젝트의 목표를 이렇게 잡았습니다.

“월요일 아침에, AI x 스타트업 관점으로 정제된 개인화 뉴스레터를 자동 발행하자.”


2. 해결 전략: 멀티소스 수집 + LLM 필터링 + 개인화 발송

파이프라인은 크게 3단계로 구성했습니다.
설계 기준은 단순했습니다. 수집은 넓게, 선별은 좁게, 출력은 개인화되게 가져가는 것입니다.

  1. 수집/정규화 Layer
    arXiv, Hugging Face Daily Papers, GitHub Trending, OpenAI/Anthropic/DeepMind, Product Hunt, 스타트업레시피, THE VC, GeekNews, 플래텀 등 여러 소스에서 주간 데이터를 수집했습니다.
    각 소스는 RSS, HTML, JSON, API 등 응답 형식이 제각각이기 때문에, 파서 단계에서 이를 공통 필드 구조로 변환했습니다.
    이 정규화 과정을 거쳐 후속 노드는 source와 무관하게 동일한 로직으로 데이터를 다룰 수 있도록 했습니다.

  2. 신호 선별 Layer
    수집된 아이템은 그대로 노출하지 않고, Solar Mini를 사용해 AI x 스타트업 관점의 관련성을 1~10점으로 점수화했습니다.
    여기서는 단순히 “AI 키워드가 있는가”보다, 기술 변화가 제품·시장·사업화 맥락과 연결되는지를 더 중요하게 봤습니다.
    점수 6 이상만 통과시키는 방식으로 노이즈를 줄이고, 최종 입력 집합의 밀도를 높였습니다.

  3. 개인화 생성/전송 Layer
    Google Sheets에 저장된 구독자 프로필을 기준으로 Solar Pro가 뉴스레터 본문을 JSON 형태로 생성하고, 코드 노드에서 이를 HTML 이메일로 변환해 발송했습니다.
    이 단계에서 직군, 관심사, 콘텐츠 깊이 선호를 반영해 같은 신호라도 강조 포인트가 달라지도록 제어했습니다.


3. 워크플로우 아키텍처 (n8n)

3.1 전체 수집/병합 구조

  • Schedule Trigger를 기준으로 각 소스 수집 노드를 병렬 실행
  • 파서 노드에서 source별 구조를 공통 필드로 맞춤
  • 글로벌 AI 신호 Layer(6 inputs) + 스타트업 Layer(5 inputs)로 1차 병합
  • Layer Merge에서 최종 append

3.2 필터링 구간

  • source_cleanup: 제목/요약 정리 + 중복 URL 제거 + 필수 필드 검증
  • Solar Mini Filter: 관련성 스코어링(JSON 응답 강제)
  • Score Filter: score >= 6만 통과

3.3 문서 파싱 구간

  • If 노드에서 source in (arxiv, huggingface)인 경우만 문서 파싱 분기
  • Upstage Document Parse로 PDF 본문 추출
  • 파싱 결과를 Final_Merge로 기존 신호와 다시 결합

3.4 개인화 발송 구간

  • Get row(s) in sheet로 구독자 정보 조회
  • 뉴스레터 생성(Solar Pro)에서 프로필 기반 본문 생성
  • 코드 노드에서 HTML 템플릿 변환 후 Send an Email로 발송!

4. 핵심 구현 포인트

4.1 주간 시간 윈도우를 KST 기준으로 고정

수집 범위가 흔들리면 뉴스레터 품질이 바로 흔들립니다.
그래서 파서별로 KST 기준 주간 윈도우(월~어제)를 명시적으로 계산해 적용했습니다.

  • hf_date_window: 날짜 배열 생성 후 daily_papers?date=... 호출
  • arxiv_query_window: 카테고리 + submittedDate 범위를 query string으로 조합
  • Product Hunt/GeekNews/스타트업레시피/플래텀도 동일하게 시간 필터링
// Score Filter
.filter(x => x && x.score >= 6)

“애매하게 관련 있는 콘텐츠”를 줄이기 위해 6점을 컷오프로 뒀습니다.

4.2 source별 파싱 결과를 공통 스키마로 정규화

source_cleanup에서 최종적으로 다음 필드를 강제했습니다.

  • source
  • source_type (논문/뉴스/커뮤니티/AI툴 ...)
  • signal_strength (research/market/reaction/buzz ...)
  • title, url, summary

그리고 URL 기준 중복 제거를 한 번 더 넣어 같은 이슈가 여러 소스에서 반복 노출되는 문제를 줄였습니다.

4.3 LLM 필터는 “JSON 강제 + 엄격 프롬프트”

Solar Mini 필터 프롬프트는 점수 기준을 명시했습니다.

  • 9~10: AI 기술 + 스타트업 비즈니스 교집합
  • 7~8: 둘 중 하나와 강한 관련
  • 1~4: 무관

응답 포맷은 json_object로 강제해서 후속 파이프라인 파싱 실패를 줄였습니다.

4.4 논문 소스만 Document Parse 분기 처리

모든 아이템을 파싱하면 비용/지연이 커집니다.
그래서 If(source == arxiv || huggingface)로 분기하고, Limit(5)로 상한을 둬서 핵심 논문만 본문 파싱했습니다.

if (item.source === 'arxiv') {
  pdfUrl = pdfUrl
    .replace('http://arxiv.org/abs/', 'https://arxiv.org/pdf/')
    .replace('https://arxiv.org/abs/', 'https://arxiv.org/pdf/')
    .replace(/v\\d+$/, '') + '.pdf';
}

파싱 결과는 parsed_content(3000자)로 축약해 후속 생성 단계 컨텍스트로 사용했습니다.

4.5 개인화 뉴스레터는 “프로필 기반 구성 규칙”으로 제어

Solar Pro 노드에서 구독자 프로필(직군/관심사/선호 깊이)을 입력으로 넣고,

  • TECH RADAR
  • KOREA ANGLE
  • FROM GLOBAL TO LOCAL
  • FOR YOU

섹션별 개수/형식을 JSON 스키마로 고정했습니다.
그 후 코드 노드에서 JSON을 HTML로 렌더링해 이메일 본문으로 발송합니다.


5. 실행 결과

5.1 실제 뉴스레터 페이지별 구성

Page 1. 오프닝 + 핵심 신호 + Tech Radar 초반

  • 상단 브랜드/타이틀: A.DIFF, 발행 주간(3.24 - 3.30)
  • SIGNAL OF THE WEEK: 이번 주 최상위 한 줄 신호
  • TECH RADAR 시작: 우선순위가 높은 기술 이슈 카드 2개 배치

이 페이지는 “이번 주에 무엇이 중요했는지”를 먼저 인지시키는 용도입니다.
독자가 메일을 열자마자 제목과 핵심 시그널을 확인하고, 바로 실행 가능한 기술 이슈로 진입하게 설계했습니다.

Page 2. Tech Radar 후반 + Korea Angle + Global→Local 브릿지

  • TECH RADAR 마지막 카드(예: vLLM Compose)
  • KOREA ANGLE: 국내 적용/시장 관점 이슈 2개
  • FROM GLOBAL TO LOCAL 첫 번째 카드

이 페이지는 글로벌 기술 흐름을 국내 맥락으로 연결하는 구간입니다.
단순 뉴스 나열이 아니라 “기술 변화 → 한국 시장에서의 의미”로 해석하는 레이어를 담당합니다.

Page 3. Global→Local 마무리 + 개인 추천 + 클로징

  • FROM GLOBAL TO LOCAL 두 번째 카드
  • FOR YOU: 구독자 관점 추천 2개 + Open Link CTA
  • Footer: Powered by Upstage Solar Pro × n8n

마지막 페이지는 개인화 영역입니다.
앞선 공통 신호를 본 뒤, 구독자 실행 관점에서 바로 클릭 가능한 추천 아이템으로 마무리됩니다.

5.2 페이지 구조 요약

뉴스레터 레이아웃은 아래 순서로 고정됩니다.

  1. 헤드라인 요약(SIGNAL OF THE WEEK)
  2. 기술 변화 스캔(TECH RADAR)
  3. 국내 해석(KOREA ANGLE)
  4. 글로벌→로컬 적용(FROM GLOBAL TO LOCAL)
  5. 개인 추천(FOR YOU)

즉, “요약 → 해석 → 적용 → 액션” 흐름으로 읽히도록 구성되어 있습니다.


6. 트러블슈팅 & 개선 포인트

6.1 서로 다른 피드 구조 문제

RSS/HTML/Atom/JSON이 섞여 있어 source별 파서를 따로 두고, 마지막에 공통 스키마로 수렴시켰습니다.

6.2 제목 노이즈/중복 이슈

블로그 카테고리 prefix나 날짜 문자열이 제목에 섞여 들어오는 문제가 있어 cleanTitle 규칙으로 후처리했습니다.

6.3 LLM 출력 안정성

생성 모델이 코드블록이나 설명 텍스트를 섞는 경우가 있어:

  • 출력 포맷 JSON 강제
  • 파싱 실패 시 fallback 객체 생성
  • debug preview 필드 저장

으로 운영 안정성을 확보했습니다.

6.4 다음 개선

  1. arXiv/HF 논문 파싱을 현재 5건에서 동적 상한으로 조정
  2. source별 가중치(예: 신뢰도, 최신성) 기반 랭킹 추가
  3. 구독자 클릭 로그를 반영한 개인화 피드백 루프 구축

7. 마무리

이번 파이프라인의 핵심은 “많이 모으는 것”이 아니라,
실제로 월요일 아침에 읽을 만한 신호만 남기는 것이었습니다.

n8n으로 수집/오케스트레이션을 만들고,
Upstage Solar로 필터링/생성을 맡기고,
Document Parse로 논문 맥락을 보강하니,
뉴스레터 품질과 운영 효율을 동시에 가져갈 수 있었습니다.

이 글이 비슷한 자동화 워크플로우를 설계하는 분들께 작은 레퍼런스가 되면 좋겠습니다.

뉴스레터 신청 안내

현재 이 워크플로우는 실제 발송으로 운영 중입니다.
아래 폼을 등록하면 A.DIFF 뉴스레터를 실제로 받아볼 수 있습니다.


profile
LLM부터 풀스택까지, 만들면서 기록합니다

0개의 댓글