본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 08. 12:32

네 개의 시장이 0을 기록할 때: n8n과 GPT-4를 활용한 자동화된 시장-기사 파이프라인 구축

요약

n8n과 GPT-4를 활용하여 특정 시장 이벤트 발생 시 자동으로 기사를 생성하는 이벤트 기반 LLM 워크플로우 구축 방법을 소개합니다. 결정론적인 JavaScript 코드로 이벤트를 감지하고 LLM은 콘텐츠 생성에만 집중하게 하는 효율적인 아키텍처를 제안합니다.

핵심 포인트

  • 이벤트 감지는 LLM이 아닌 결정론적 코드로 수행해야 함
  • n8n을 활용한 단계별 오케스트레이션 설계
  • 불필요한 API 비용 방지를 위한 워크플로우 단락(short-circuit) 기법
  • 구조화된 JSON 출력을 통한 데이터 검증 가능성 확보

테이프가 평평해진 날

2026년 6월 8일, 지구상에서 가장 변동성이 큰 네 개의 시장이 정확히 같은 수치인 0으로 마감되었습니다. S&P 500은 738달러, Nasdaq은 705달러, Bitcoin은 63,272달러, 금은 396달러 — 모두 변동률 0.00%로 평평했습니다. 완벽하게 상관관계가 있는 '무(無)'의 상태였습니다.

개발자로서 저의 첫 반응은 "이것이 폭풍 전의 고요인가?"가 아니었습니다. 그것은 바로 "이것은 자동화된 콘텐츠 파이프라인을 위한 완벽한 트리거 이벤트(trigger event)다"였습니다. 평평한 테이프는 드물고, 뉴스 가치가 있으며, 결정적으로 단 하나의 불리언(boolean) 값으로 감지할 수 있습니다. 이는 현재 우리 중 많은 이들이 구축하도록 요구받고 있는 이벤트 기반 LLM 워크플로우(event-driven LLM workflow)의 이상적인 테스트 케이스가 됩니다.

이 포스트에서는 오케스트레이션(orchestration)을 위한 n8n과 생성을 위한 GPT-4를 사용하여 시장 데이터 이벤트를 발행된 초안 기사로 전환하는 데 사용하는 아키텍처(architecture)를 살펴봅니다. 시장 관점은 예시일 뿐이며, 핵심은 그 패턴에 있습니다.

아키텍처

파이프라인은 n8n의 각 노드(또는 작은 클러스터)로 구성된 4단계로 이루어집니다:

스케줄/웹훅(Schedule/Webhook) → 시세 가져오기(Fetch quotes) → 이벤트 감지(Detect event) → 초안 생성(Generate draft) → 발행(Publish)

핵심 설계 결정 사항: 감지 로직은 프롬프트(prompt)가 아닌 코드에 존재해야 합니다. LLM은 임계값 확인(threshold-checking)에 신뢰할 수 없습니다. GPT-4가 시장이 "충분히 평평한지"를 결정하게 해서는 안 됩니다. 결정론적인 JavaScript가 그 역할을 수행해야 하며, LLM은 오직 자신이 잘하는 일, 즉 산문(prose) 작성에만 집중해야 합니다.

1단계 & 2단계: 가져오기 및 감지

스케줄링된 트리거가 시세 API를 호출하면, Function 노드가 작성할 가치가 있는 일이 발생했는지 여부를 결정합니다. 다음은 감지 로직입니다. 임계값(threshold)이 편집적 판단을 인코딩하기 때문에, 이 부분은 여러분이 직접 소유해야 한다고 주장하는 부분입니다:

// n8n Function 노드: 세션 분류
const quotes = $input.all().map(i => i.json);
const FLAT_BPS = 5; // 5 베이시스 포인트(basis points) 이내 = "변동 없음"

const flat = quotes.filter(q => 
Math.abs(q.changePercent) * 100 <= FLAT_BPS
);

// 상관관계가 없는 여러 자산이 동시에 평평할 때만 뉴스 가치가 있음
const isStory = flat.length >= 3;

return isStory
? [{ json: { trigger: 'multi_flat', assets: flat } }]
: []; // 빈 배열 = 파이프라인 중단, 잘못된 기사 생성 방지

빈 배열을 반환하면 워크플로우(workflow)의 나머지 부분이 단락(short-circuit)됩니다. 즉, 이벤트도 발생하지 않고, API 비용도 발생하지 않으며, 쓰레기 같은 초안도 생성되지 않습니다. 이러한 가드(guard) 장치가 있기에 매 시장 마감 시 크론(cron) 작업으로 안전하게 실행할 수 있는 것입니다.

3단계: 구조화된 출력(structured output)을 통한 생성

LLM 호출은 대부분의 파이프라인이 실패하는 지점입니다. 단순히 마크다운(markdown) 덩어리를 달라고 요청하고 요행을 바라지 마세요. 다운스트림 노드(downstream nodes)가 게시 전 검증할 수 있도록 **구조화된 JSON (structured JSON)**을 요청해야 합니다.

const res = await fetch('https://api.openai.com/v1/chat/completions', {
method: 'POST',
headers: {
'Authorization': `Bearer ${$env.OPENAI_API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
model: 'gpt-4',
response_format: { type: 'json_object' },
messages: [
{ role: 'system', content: 'You are a markets writer. Return JSON with keys: title, body_markdown, tags (max 3).' },
{ role: 'user', content: `Write ~800 words on why these assets all closed flat: ${JSON.stringify($json.assets)}` }
]
})
});

여기서 response_format: { type: 'json_object' }는 숨은 영웅입니다. 이는 "모델의 자유 형식 답변을 파싱하며 기도하기"를 하나의 계약(contract)으로 바꿔줍니다. 이를 다음 노드의 스키마 체크(schema check)와 결합하여, 형식이 잘못된 것은 게시하는 대신 거부하도록 만드세요.

4단계: 게시 (사람의 검토 단계를 거침)

마지막 노드는 Dev.to API로 POST 요청을 보내지만, 실제 게시물이 아닌 **초안 (draft)**을 생성합니다.

await fetch('https://dev.to/api/articles', {
method: 'POST',
headers: { 'api-key': $env.DEVTO_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({
article: { ...$json, published: false } // 배포 전 사람이 검토함
})
});

시장 정체(flat-market) 예시가 실제로 가르쳐 주는 것

시장 스토리는 상관관계(correlation)에 대한 깔끔한 교훈을 주며, 이는 파이프라인 설계에 직접적으로 적용됩니다:

  • Flat ≠ idle (횡보 ≠ 유휴 상태). 균형(Equilibrium)이란 촉매제(여기서는 6월 중순의 Fed 회의)를 앞두고 매수자와 매도자가 대치하고 있는 상태를 의미합니다. 여러분의 파이프라인은 "아무 일도 일어나지 않음"을 오류가 아닌, 하나의 실제적이고 명시적인 상태(state)로 취급해야 합니다.
  • 상관관계(Correlation)가 곧 신호입니다. 자산 하나가 횡보하는 것은 노이즈(noise)이지만, 네 개가 동시에 횡보하는 것은 하나의 스토리입니다. 훌륭한 이벤트 탐지(event detection)는 개별 지표가 아닌 결합된(joint) 상태를 살펴봅니다.
  • 확률적 핵심 주위의 결정론적 게이트(Deterministic gates). 코드는 _쓸 것인지 말 것인지(whether)_를 결정하고, LLM은 _무엇을 쓸 것인지(what)_를 결정합니다. 이 둘을 절대 혼동하지 마세요.

실무적 시사점 (Practical takeaways)

  1. 임계값(thresholds)은 코드에 유지하세요. LLM은 산문(prose)을 작성하지, 불리언 로직(boolean logic)을 작성하지 않습니다.
  2. 조기에 중단하세요. 탐지 노드(detection node)에서 빈 값을 반환(empty return)하면 토큰을 절약하고 스팸을 방지할 수 있습니다.
  3. 구조화된 출력(structured output)을 요구하세요. json_object 모드와 스키마 검증(schema validation)은 언제나 정규 표현식 스크래핑(regex-scraping)보다 뛰어납니다.
  4. 항상 발행 단계에 게이트를 두세요. 자동 생성하고, 사람이 승인하세요. published: false라는 한 줄의 코드가 환각(hallucination)을 배포하는 상황으로부터 여러분을 구해줄 것입니다.

횡보하는 차트는 시장에 숨을 죽이라고 말하고 있었습니다. 개발자에게 이는 그저 잘 설계된 트리거(trigger)일 뿐이며, 최고의 AI 파이프라인은 대부분 하나의 영리한 모델 호출(model call)을 감싸고 있는 지루하고 결정론적인 배관(plumbing) 작업이라는 사실을 상기시켜 줍니다.

이 포스트의 완성된 AI 자동화 템플릿을 원하시나요? NSST AI toolkit 받기

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0