그때 그때 끄적 2025. 6. 4. 20:26

📅 Sense Stock 개발 일지 (2025-06-04)

n8n 기반 뉴스 요약 자동화 시스템 Sense Stock 구축 중 진행한 작업들을 정리합니다.

오늘은 Slack 개인 비공개 채널에서 @Stock Bot 사용, Process 구조 개선, 프롬프트 구조화 및 고도화 등을 다뤘습니다.

 

🔧 사용 도구

도구 역할
🔷 n8n 전체 워크플로우 자동화 도구
🔷 Firecrawl.dev 사이트 內 기사 검색 + URL 수집 API (Firecrawl MCP Sever)
🔷 ChatGPT 키워드 정제 및 후속 분석
  • 오늘의 목표
    • Slack 모든 Channel(공개, 비공개)에서 @Stock Bot 호출 시 해당 채널에서 응답 가능하도록 설정
    • 기존 관리자 응답 방식에서 → @Stock Bot 응답 구조로 전환
    • Firecrawl Search 설정 점검 및 최신 뉴스 중심 검색 적용 (tbs 파라미터 활용)
    • 뉴스 요약 프롬프트 구조 고도화: 요약 → 전략 분석 → 전문가 분석까지 확장 고려
      • 요약 중심 분석 (Basic)
      • 전략 및 수혜 분석 (Intermediate)
      • 3단계 (Expert)
    • 사용자 응답 흐름 개선 (요청 접수 메시지 표시 등)
  • 진행 내용
    • Slack 비공개 Channel에서 @Stock 작동 확인
    • Firecrawl Extract Output Parsing Node 추가
    • Firecrawl Extract 프롬프트 개선
    • Firecrawl Search 옵션 개선: 최신 뉴스 중심 검색
    • 요약 프롬프트 구조: 단계별 정보 분석 적용
    • 사용자 요청 수신 후 응답 대기 메시지 설정

 

Step 1. Slack 비공개 채널에서 @Stock 작동 확인

  • 기존에는 개인 채널 및 비공개 채널에서 @Stock 호출 시 아무 반응 없음
  • 원인: Channel Tag를 Input으로 들어온 Channel이 아닌 고정된 Channel 값을 부여
  • 조치: Input으로 들어온 Channel 입력

Channel 탭에서 Input으로 들어온 Tag 입력

  • + 응답 구조 변경:
    • 💬  관리자 응답 구조 → @Stock Bot이 응답하도록 전환
      • Slack Credential Bot Acess Token 생성 → App Mention 이벤트 정상 인식됨
    • 💬 사용자 요청 수신 후 응답 대기 메시지 설정(Slack Node 추가)
      • 사용자가 @Stock을 호출하면 결과가 나가기 전 다음과 같은 메시지가 먼저 전송되도록 구성
      • 요청 > Get User(사용자 닉네임 가져오기) > 관련 내용 전송
        👋 `{{nickname}}`님, 요청을 잘 받았어요!
        
        현재 `작업을 처리 중`입니다... 🔄
        
        조금만 기다려주시면 결과를 정리해서 보내드릴게요.

Bot 응답 / 요청 수신 후 응답 대기 메세지
Slack Workflow

더보기

Slack 관련 메시지 노드 설명 (n8n 기준)

아이콘 기능 설명
🟦 Send a message 메시지 보내기 일반 텍스트 전송
🟦 Get a message permalink 고유 링크 추출 특정 메시지의 URL
🟦 Delete a message 메시지 삭제 타임스탬프 기반
🟦 Update a message 메시지 수정 기존 메시지 덮어쓰기
🟦 Send message and wait for response 응답 대기 메시지 전송 버튼 응답 등 사용자 입력 대기
🟦 Search for messages 메시지 검색 키워드 기반 Slack 채널 내 검색
🟦 Get a thread of messages 스레드 조회 댓글 형태로 등록된 메시지 모음
⚡ On new message posted to channel 트리거 특정 채널에 새 메시지 등록되면 실행

Step 2. Firecrawl Extract Output Parsing Node 추가

  • 기사 본문 추출 결과를 구조화된 형태로 파싱할 수 있도록 별도 노드 구성(= Articles Parsing Node)
  • 본문 외 메타 정보 제거로 GPT 응답 정확도 향상
  • + Firecrawl Extract Prompt 변경, 기사 본문내용 제외(= Token 많이듬)
    • 기사 날짜 / 기사 작성자 / 요약본

 

Step 3. Firecrawl Search 옵션 개선: 최신 뉴스 중심 검색

  • tbs 파라미터를 사용하여 최근 뉴스 기사만 추출

🔹 tbs 파라미터 옵션 정리

의미
qdr:h 지난 1시간
qdr:d 지난 1일
qdr:w 지난 1주
qdr:m 지난 1개월
qdr:y 지난 1년

 

Step 4. 📊 요약 프롬프트 구조: 단계별 정보 분석 적용

Final Extract Agent 프롬프트를 1단계, 2단계 + 3단계 구조(예정) 로 리디자인:

  1. 요약 중심 분석 (Basic)
    • 키워드, 관련 종목, 감성 점수 등 정보 추출 중심
    • 항목별 프롬프트 분리 구성
  2. 전략 및 수혜 분석 (Intermediate)
    • 단순 정보 요약을 넘어 GPT의 추론 능력을 활용한 전략적 해석
    • 현재는 준비 단계, 결과 저장만 진행 중
  3. 전문가 분석 (Expert) (예정)
    • 정책/기술/시장 배경까지 반영한 고도화된 분석용 프롬프트 설계 예정

🧱 Workflow 구조

  - 추가 Node Update 필요

Slack 사용자 요청 
↓ 	
Best Keyword 추출 (GPT) 
↓ 
Yahoo Finance 검색 → 기사 URL 리스트 생성 
↓ 
각 URL 순회하며 요약 (Split In Batches + OpenAI) 
↓ 
기사 요약 결과 병합 
↓ 
최종 통합 요약 & 전략 분석
↓ 
Slack Message 전송

📑최종 통합 요약

 

 

❓ 다음 단계에서 고민 중인 점들

    1. API별 사용량/비용부터 먼저 파악 (운영비 예측)
      • 현재 사용 중인 API:
        • OpenAI ChatGPT (GPT-4)
        • Firecrawl (Search & Extract) → 이 둘은 호출 수에 따라 비용이 지속적으로 발생한다는 공통점이 있음
    2. 러닝타임 측정 기능 구현
      • 현재 워크플로우는 요청 → 응답 흐름만 있을 뿐, 실제로 각 단계가 얼마나 걸리는지 확인할 수 없음.
      • 특히 GPT + Firecrawl은 작업당 몇십 초 이상(30초~) 걸릴 수 있어서, 다중 사용자가 붙을 경우 속도 병목이 생길 가능성이 있음. 
    3. 저장할 데이터 목록 정의 + 임시 저장 테스트 
      • 현재 결과값은 Slack으로만 전송되고 사라짐.
        → 추후 분석/통계/개선용으로 어떤 데이터를 적재할 것인지 판단 필요
      • 고민 포인트
        • 저장소는 무엇을 쓸까? (예: Supabase, Firebase, Google Sheets, Airtable 등)
        • 저장 주기는 어떻게 할까? (모든 요청? 요약만 성공했을 때?) 
더보기

저장 대상 후보

  • 사용자 요청 키워드
  • 검색된 기사 URL
  • GPT 요약 결과 (json 형태)
  • 요약 점수/감성/종목명 등 메타정보
  • 요청 채널 / 요청자 ID / 요청 시각
  • 요청 상태 저장 (처리 중인 요청은 무시하거나 안내 메시지 출력)

 

4. 멀티 유저 환경에서의 사용량 제한 / 안정성 설계

  • 혼자 쓸 때도 GPT 응답 + 크롤링 응답까지 10~20초 정도 걸리는 경우가 많음.
    • → 크롤링할 기사가 많을수록 시간은 더 오래걸림
    • → 이걸 다수 사용자가 동시에 쓰게 되면?