뉴스 요약 받고, 개념도 챙기자! 경제 뉴스 자동 업데이트 w/ 텔레그램, RSS 피드

소개

RSS Feed Trigger로 뭘 받아볼까 고민하다, 처음에는 (1)최신 판례 업뎃될 때마다 (2)판결문에서 (2)사실관계와 주요쟁점을 요약하여 (3)알려주는 텔레그램 봇을 만들려고 했습니다. 국가가 API를 제공한다고 해서 받으려 했지만... 회원가입 단계에서 계속 오류나는 바람에 결국 못 받았습니다. 😞 사이트 URL을 rss.app에 넣어서 피드로 만들려고도 했습니다만, 판례는 커녕 '국회사이트 바로가기' 버튼만 나오는 바람에 이건 포기했습니다. (대체할 API를 추후 검색할 예정입니다).

그래서 그냥 아침마다 보는 매일경제에서 뉴스 업뎃 될 때마다 받는걸로 마음 먹었습니다.

따라서 이번 워크플로우로 실천하려 했던 것은 아래와 같습니다.
[1] 경제 관련 뉴스 RSS 피드 업데이트 때마다 내용 받기
[2] 뉴스 본문 너무 기니까, 요약본만 받기 (필요하면 본문도 읽어야하니 링크 첨부)
[3] 알면 좋을 개념까지 제안받기


진행 방법

우선 전체 워크플로우입니다.
사실 1주차 스터디장님이랑 멍멍님 사례 시연 따라가느라 벅찼기 때문에(...) 큰 건 없습니다.

기계 학습 시스템의 프로세스를 보여주는 다이어그램

  1. 다만 매일경제는 뉴스마다 CSS Selector가 조금씩 달랐습니다.

    프로세스 흐름도의 스크린 샷

    이틀전 워크플로우입니다. 1번째 줄 노란 스티커 노트 보이시죠? 처음에는 셀렉터를 하나만 정했는데 안 되더라구요.

    한국 뉴스 웹 사이트의 스크린 샷
    본문 추출이 안 됐는데 요약이 될리가...

    확인해보니, 두 셀렉터를 번갈아가면서 사용하더군요.
    - 제목은 .news_ttl 이나 .news_title_text .top_title
    - 본문은 .news_cnt_detail_wrap 혹은 .article_body

    따라서 .news_ttl 셀렉터로 추출을 시도하되, 실패하면 다른 셀렉터로 시도하라는 명령을 내려야했습니다. 그러면 HTML 대신 Code 노드를 사용해야 하는데, 어차피 텍스트 정제도 Code 노드를 활용하니 노드 1개에 추출과 정제 다 넣자! 마음 먹었습니다. 지피티(o3-mini-high)에게 물어보니 아래 코드를 던져줬습니다.

    from bs4 import BeautifulSoup
    
    def parse_html(html):
        soup = BeautifulSoup(html, 'html.parser')
    
        # 제목 추출: .news_ttl 혹은 .news_title_text .top_title
        title_elem = soup.select_one('.news_ttl')
        if title_elem:
            title_text = title_elem.get_text(strip=True)
        else:
            fallback_title = soup.select_one('.news_title_text .top_title')
            title_text = fallback_title.get_text(strip=True) if fallback_title else ''
    
        # 본문 추출: .news_cnt_detail_wrap 혹은 .article_body
        content_elem = soup.select_one('.news_cnt_detail_wrap')
        if content_elem:
            content_text = content_elem.get_text(strip=True)
        else:
            fallback_content = soup.select_one('.article_body')
            content_text = fallback_content.get_text(strip=True) if fallback_content else ''
    
        return {
            "title": title_text,
            "content": content_text
        }
    
    results = []
    # n8n의 Python Code Node에서는 입력 아이템이 'items' 변수에 있습니다.
    for item in items:
        html = item["json"].get("data", "")
        parsed = parse_html(html)
        results.append({"json": parsed})
    
    return results
한국어 텍스트가있는 웹 사이트의 스크린 샷

잘 나왔네요 🙂

  1. 요약본, '오늘의 지식' 추천 받기

    이렇게 받은 뉴스 본문을 갖고, 챗GPT한테 요약을 시켰습니다. 그리고 다른 챗GPT한테는 이 뉴스를 이해하는데에 도움이 될 지식을 뽑고, 이유까지 설명해달라고 했습니다. 개인적으로 뉴스만 읽는 것보다, 이 뉴스로 알아야할 개념을 짚고 넘어가면 확실히 기억에 오래 남아서 그랬습니다.

a. 뉴스 요약 - 프롬프트

당신은 20년차 전문 뉴스 분석가입니다. 동시에 경제, 경영, 정치 등 국내외 정서와 전반 산업에 대한 이해도가 깊습니다.
1. 이 뉴스의 독자는, 2008 금융 위기 발생 원인을 설명할 수 있을 정도의 실력을 갖고 있습니다.
2. 아래 제공된 본문의 핵심 정보(누가, 언제, 어디서, 무엇을, 왜, 어떻게)를 명확하고 간결하게 요약하세요. 문장 형태여야 하며, 최소 3줄, 최대 5줄로 요약해주세요.
3. 이모티콘으로 적절히 꾸며주세요.
---
[본문]: {{ $json['본문'] }}

b. '오늘의 지식' 추천 - 프롬프트

당신은 20년차 전문 뉴스 분석가입니다. 동시에 경제, 경영, 정치 등 국내외 정서와 전반 산업에 대한 이해도가 깊습니다.
1. 이 뉴스의 독자는 금융업에 종사한지 3년 된 사람입니다.
2. 당신은 방금 [본문]을 읽었습니다.
3. 독자가 찾아보면 좋을 지식과 이유를 1~2개 알려주세요. 용어, 경제지식, 정치, 특정 산업 지식 등 뭐든 좋습니다. 그러나 키워드 형태가 가장 좋습니다. 본문 내용을 쉽게 이해하는데에 도움이 되어야 합니다. 
4.'찾아보면 좋을 지식' 같은 수식어는 빼세요. 이모티콘 먼저 붙이고, 볼드 처리하지 말고, 지식별로 번호를 붙여주세요.
5. '딥시크 효과와 중국의 첨단 기술 분야 발전' 같이 애매하게 제시하지는 마세요. 차라리 '딥시크 효과'를 알아보라고 해주세요. 가령 '무역 의존도'에 대해 알아봐야 한다면, 차라리 현재 무역 의존도가 높거나/낮은 이유를 간단히 제시하고, 그걸 알아보라 해주세요.
6. [예시] 
: 1. 🌇 토지거래허가구역
토지거래허가구역은 부동산 시장의 과열을 방지하기 위해 일정 지역 내에서 부동산 거래 시 허가를 받아야 하는 제도입니다. 이런 제도가 어떻게 시장에 영향을 미치는지 파악하면 집값 상승 또는 하락에 대한 이해도가 높아질 것입니다.
  2. 📉 부동산 시장 동향 
최근 서울 강남 3구와 용산 지역을 포함한 특정 지역의 부동산 가격 급등 배경에 대해 알아보세요. 이러한 지역적 특성은 금융 규제 변화와 어떤 연관이 있을지 고민해 보세요.
7. 이모티콘으로 적절히 꾸며주세요.
---
[본문] {{ $('텍스트 정제').item.json['본문'] }}

사실 이 프롬프트에는 거짓말이 섞여있습니다(!) 전 콘텐츠 업계에 있었고, 실무 경력도 1년 겨우 넘었거든요. 하지만 역할 설정을 안 하면 너무 광범위해지고, 애매하게 '무역 의존도에 대해 알아보세요' 식으로만 말하는 것을 봤습니다.

그래서 역할을 정해주고, 예시를 들어주는 것이 좋다는 OT 당시 CTO님 강의를 곱씹고는 임의로 프롬프트를 적었습니다. 특히 챗GPT한테 모르는 개념을 물어볼 때, '초등학생 수준으로 설명해줘', '아무것도 모르는 대학생에게 설명한다고 생각해' 라고 말하던 과거도 떠올라 아예 독자의 수준을 저렇게 못박았습니다.

한국어 페이지의 스크린 샷

  1. 데이터 합치기

    개인적으로 어려웠던 부분입니다. 챗GPT로 데이터를 2개 받았으니 1개의 표로 합쳐야 하는데, 아래 사진처럼 Empty로 떴기 때문인데요.

    전화에 한국어 앱의 스크린 샷

    이 역시 챗지피티한테 물어보니 'Combine By'를 All Possible Combinations로 바꾸라고 해서 바꿨습니다.

    전화에 중국어 앱의 스크린 샷

    챗지피티 만세.

  2. 텔레그램에 보낼 메시지 정하기

    외부 텍스트 라인은 한국어를 밀어냅니다

    뉴스 전문 대신 요약본을 받기로 하고,
    그 아래에 '오늘의 지식'을 추가하면 좋겠다는 생각이 들었습니다.
    본문 전체를 읽고 싶을 수 있으니, 링크도 추가하기로 했구요.

    전체 코드는 아래와 같습니다. 다만 프롬프트를 삭제해버려서 첨부는 못 했습니다. 기억하기로는 '뉴스 요약본부터 읽고, 오늘의 지식을 제시받고 싶어. 맨 아래에는 링크가 있었으면 좋겠어.' ... 이런 식으로 프롬프트를 넣었습니다.

    // items에는 [ { json: { 뉴스요약, 오늘의 지식, 링크 } }, ... ] 형태로 3개 아이템이 있다고 가정
    const outputTextLines = [];
    
    // items 순회하여 각 아이템을 적절히 문자열로 변환
    items.forEach((item, index) => {
      const news = item.json['뉴스요약'] || '';
      const knowledge = item.json['오늘의 지식'] || '';
      const link = item.json['링크'] || '';
      
      // 보기 좋게 구분선, 제목 등 삽입
      outputTextLines.push(
        `뉴스요약\n ${news}\n\n` +
        `오늘의 지식\n ${knowledge}\n\n` +
        `링크\n: ${link}\n\n\n` +
      );
    });
    
    // 모든 아이템을 하나로 합치고, 두 줄 공백으로 구분
    const combinedText = outputTextLines.join('\n\n');
    
    // n8n이 기대하는 "하나의 아이템" 형태로 반환
    return [{
      json: {
        combinedText: combinedText
      }
    }];

  3. 마지막으로 텔레그램 봇으로 전송합니다.

    한국 문자 메시지의 스크린 샷

    잘 전송되었습니다 👍


결과와 배운 점

[개선 희망]
위 내용을 해보니, 위에서 추천받은 '오늘의 지식'을 검색해달라고 요청하는 것까지 한 번에 텔레그램에서 해결해보고 싶더라구요 🙂

[+] (필요 시) 검색 요청, 검색 결과도 메시지로 받기
- '추가 검색을 해보시겠어요?' 질문에 사용자가 '예' 라고 채팅 보내면
- n8n에서 간단하게 검색 [검색AI는 Perplexity, Genspark 사용]
- 검색 결과 전송
[+] 이 모든 것을 텔레그램 봇으로 해결하기

[추가 기획]
검색 요청하는 것까지 텔레그램에서 해보고 싶구요! 그 이후에는 처음에 기획했던 바대로, API를 받아서 새로운 RSS 피드로 진행해보고자 합니다. Gmail 라벨링 자동화도 해보고 싶은데 ㅎㅎ 마음처럼 될지 모르겠네요. 우선 개선하게 된다면 별도로 게시글 올려보겠습니다.

[배운 점]
n8n으로 워크플로우를 구축한다는 것 자체가 신기한 경험이었고, 그 자체가 배움이었습니다. 아이폰 단축어로 발만 담궜다가, AI로 해보니까 신세계네요! 처음 API 만드는 것도 몰라서 헤맸습니다만 한 번 하고 나니, 다른 워크플로우도 해볼 수 있을 것 같아 기대가 많이 됩니다. 다음에는 AI Agent도 도전! 😄


도움 받은 글 (옵션)

-

5
8개의 답글

👉 이 게시글도 읽어보세요