본문 바로가기
Automation Tool/n8n Project

Sense Stock, D+28

by 그때 그때 끄적 2025. 9. 11.

📅 Sense Stock 개발 일지 (2025-09-11)

n8n, 사용자 질의 기반 경제/시장/주식 분석 자동화 파이프라인 구축 중 진행한 작업들을 정리합니다.

오늘은 실시간으로 변동하고 쌓이는 경제 데이터를 안정적으로 처리하고, 이를 바탕으로 콘텐츠를 생성하는 다중 에이전트(Multi-Agent) 시스템을 구체화하는 작업을 정리했습니다.

 

가장 큰 문제는 데이터의 '비정형성'이었다. 경제 지표 데이터는 발표 이후에도 값이 업데이트되거나, 뒤늦게 이전 데이터가 아래에 쌓이는 경우가 잦았다.

표신된 발표 내용들은 토요일에 발표한게 아니다

"실제" Column에 데이터(수치)가 저장되는거면 걸러낼 수 있는데, '연설' 같은 이벤트는 수치 데이터가 아예 없어 필터링 기준을 잡기도 애매했다.

 

그래서 n8n과 구글 앱스 스크립트(Google Apps Script)를 연동한 데이터 자동 정렬 파이프라인역할 분담형 다중 에이전트 구조를 적용해보기로 했다.

 

🧱 Workflow 구조

  • 데이터 정제 (Google Apps Script + n8n)
    • 기존: 날짜를 각 날짜의 첫 이벤트 행에만 기입
    • 변경: 모든 이벤트 행에 날짜 기입하도록 데이터 수집 방식 변경 (Weekly, Daily 전부)
    • 자동화: n8n 워크플로우 마지막 단계에서 HTTP Request 노드로 구글 앱스 스크립트의 웹 앱 URL을 호출한다. 스크립트는 시트 전체를 날짜와 시간 순으로 완벽하게 자동 정렬한다.
      더보기
      Google Apps Script(Google Sheet Sort)
      /**
       * 현재 시트를 날짜(A열)와 시간(B열)을 기준으로 오름차순 정렬합니다.
       * 이 함수를 n8n에서 호출하려면 아래 doGet 함수와 함께 배포해야 합니다.
       */
      function sortSheetByDateTime() {
        // --- ✨ 설정 부분 ---
        const sheetName = "Economic ThisWeek"; // 👈 정렬하고 싶은 실제 시트 이름으로 변경하세요.
        const headerRows = 1;       // 👈 헤더(제목 행)가 1줄일 경우 1로 설정하세요.
        const dateColumn = 1;       // 👈 날짜가 있는 열 번호 (A열 = 1, B열 = 2, ...)
        const timeColumn = 2;       // 👈 시간이 있는 열 번호 (A열 = 1, B열 = 2, ...)
        // --- 설정 끝 ---
      
        try {
          const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
          const sheet = spreadsheet.getSheetByName(sheetName);
          
          if (!sheet) {
            Logger.log(sheetName + " 시트를 찾을 수 없습니다.");
            return;
          }
      
          const lastRow = sheet.getLastRow();
          // 데이터가 헤더 외에 더 있는지 확인
          if (lastRow <= headerRows) {
            Logger.log("정렬할 데이터가 없습니다.");
            return;
          }
      
          // 정렬할 데이터 범위를 선택 (헤더 제외)
          const range = sheet.getRange(headerRows + 1, 1, lastRow - headerRows, sheet.getLastColumn());
      
          // 정렬 실행: 날짜(오름차순)로 먼저 정렬 후, 시간(오름차순)으로 정렬
          range.sort([
            { column: dateColumn, ascending: true },
            { column: timeColumn, ascending: true }
          ]);
          
          Logger.log("시트 정렬을 완료했습니다.");
          
        } catch (e) {
          Logger.log("스크립트 실행 중 오류 발생: " + e.message);
        }
      }
      
      /**
       * n8n의 HTTP Request 노드에서 호출할 수 있도록 웹 앱 트리거를 설정합니다.
       * 이 함수를 실행하면 sortSheetByDateTime 함수가 호출됩니다.
       */
      function doGet(e) {
        sortSheetByDateTime();
        return ContentService.createTextOutput("Sheet sorting process initiated successfully.");
      }

      <Google Apps Script 사용법>
      1. Script 작성후 우측 상단 배포 탭 클릭
      2. 배포 후 웹 앱 URL 복사 -> n8n, HTTP Request 노드 URL 입력값(Method=GET)
  • 콘텐츠 생성 (다중 에이전트 시스템)
    • Agent 0 (질문 생성)
      요일별 콘텐츠 테마에 맞는 질문 생성
    • Agent 1 (키워드 추출)
      Agent 0의 질문에서 기업, 섹터 등 핵심 키워드 추출
    • Agent 2 (데이터 선별)
      정렬된 경제 데이터(Economic ThisWeek)중요도 "★★", "★★★"인 것들, 그리고 Agent 1의 키워드와 가장 연관성 높은 이벤트만 선별 + Daily도 중요도 " ★" 제외하고 추출 예정
    • Agent 3 (콘텐츠 특화 생성, 진행 예정)
      Agent 1, 2의 결과물과 전체 데이터를 종합하여 각 플랫폼에 맞는 콘텐츠 초안 생성
      • 블로그용 퀀트 AI
        데이터 기반의 깊이 있는 장문 분석 글 생성
      • 유튜브용 콘텐츠 PD AI
        영상 시나리오, 자막, 더빙 스크립트 기획
      • 인스타그램용 핀플루언서 작가 AI
        숏폼용 캡션, 해시태그, 카드뉴스 텍스트 생성

🗂 데이터 또는 작업 흐름 정리

  1. n8n이 Daily/Weekly 경제 데이터를 스크래핑하여 구글 시트에 적재한다.
  2. n8n 워크플로우의 마지막 단계에서 배포된 Apps Script 웹 앱 URL로 GET 요청을 보낸다.
  3. Apps Script가 실행되며, 구글 시트의 모든 데이터를 날짜와 시간 기준으로 오름차순 정렬한다. 이제 데이터는 항상 최신 상태로 깔끔하게 정리된다.
  4. Agent 0, 자율 주제 선정 (Autonomous Topic Selection)
    https://cord-ai.tistory.com/258 (참조)
    Agent 0이 각 요일마다 선정한 테마에 맞는 5가지 질문을 생성 이후, 5가지 질문 중 가장 흥미로운 질문 하나를 선택한다.(Slack Block Kit)
    • 생성 질문 및 선택 질문 DB저장(Google Sheet)
  5. Agent 1, 자율 데이터 분석 (Autonomous Data Analysis)
    선택한 주제(예: 'NVIDIA의 실적')를 Agent 2에게 넘겨 관련 경제 지표를 자동으로 선별한다.
    1. 사용자가 예시) 'NVIDIA의 최근 실적이 AI 반도체 시장에 미치는 영향은?' 질문을 체크한다.
    2. Agent 1은 질문에서 유추한 기업, 섹터, 키워드 추출
    3. 워크플로우는 'NVIDIA', 'AI 반도체' ... 라는 핵심 정보를 추출하여 Agent 2에게 전달한다.
  6. Agent 2, 자율 데이터 필터링 (Autonomous Data Filtering)
    지금까지 취합한 데이터를 바탕으로, 이번 주 경제 지표 목록(Economic_ThisWeek) 중에서 NVIDIA와 반도체 섹터에 가장 큰 영향을 미칠 이벤트( 중요도(★★, ★★★) )들만 선별하고, 콘텐츠 생성 Agent 3로 결과를 넘긴다.
  7. Agent 3, 컨텐츠 특화 AI
    모든 데이터를 종합하여 블로그 글, 유튜브 스크립트, 인스타그램 피드를 동시에 생성한다.

🧠 진행 중 고민한 점들

  • 데이터 구조의 근본적인 문제
    처음에는 날짜가 첫 행에만 있는 문제를 AI가 똑똑하게 해결해주길 바랐다. 하지만 결국 데이터를 구조적으로 완벽하게 만드는 것이 더 효율적이고 안정적이라는 걸 깨달았다. 모든 행에 날짜를 기입하는 방식으로 바꾸니 훨씬 간단해졌다.
  • 여전히 무시무시한 토큰 비용
    필터링을 통해 중요도 낮은 데이터를 거르긴 했지만, 모든 행에 날짜를 기입하면서 전체 데이터의 양이 늘어났다. 경제 데이터는 텍스트가 많아 여전히 토큰 사용량이 부담스럽다.
  • 추가적인 토큰 절약 방안
    Economic Daily 데이터도 중요도 높은 것만 가져올까 고민했지만, 어차피 필터링 로직에서 처리되므로 코드 수정은 불필요하다고 판단했다. 데이터에서 '외화(USD)'처럼 LLM 분석에 불필요한 column을 아예 제거해서 전달하는 방식을 고려 중이다.

 

이제 데이터 파이프라인이 어느 정도 안정되었으니, 본격적으로 콘텐츠의 '질'을 높이는 데 집중할 수 있을 것 같다. 물론, 여전히 토큰 비용이라는 거대한 산이 남아있지만 말이다.

 

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

  • LLM에 데이터 전달 전처리 로직 강화: 현재 필터링 방식 외에, 데이터를 LLM에 전달하기 전 더욱 효과적으로 압축하거나 요약하는 전처리 단계를 추가하여 토큰 비용을 근본적으로 최적화하는 방법을 본격적으로 연구해봐야겠다.

'Automation Tool > n8n Project' 카테고리의 다른 글

Sense Stock, D+27 (2)  (0) 2025.09.09
Sense Stock, D+27 (1)  (0) 2025.09.09
Sense Stock, D+26  (4) 2025.09.01
Sense Stock, D+25  (3) 2025.08.24
Sense Stock, D+24  (5) 2025.08.14

댓글