24/7 무인 운영 시스템 + 에이전트의 장기 기억 만들기
투자 자산군마다 작동 시간이 다릅니다. 한국장은 9시~15:30, 미국장은 한국시간 밤 10:30~새벽 5시, 암호화폐는 24시간. 각 시장에 다른 Schedule Trigger를 따로 두는 것이 올바른 설계입니다.
30 8 * * 1-545 15 * * 1-50 22 * * 1-50 */4 * * *GENERIC_TIMEZONE=Asia/Seoul 환경변수 필수. 타임존이 틀리면 장 열리기 전에 알림이 와서 의미가 없어집니다.
4개 루틴이 모두 동일한 3D 에이전트 로직을 호출합니다. 각 루틴에 전체 로직을 복사하면 유지보수 악몽. Execute Workflow 노드로 W4의 3D 에이전트를 모듈처럼 재사용합니다.
Schedule는 "시간" 기반이지만, Webhook은 "이벤트" 기반입니다. TradingView 알림, 거래소 이상 감지, 외부 서비스에서 n8n을 호출할 때 사용합니다.
TradingView에서 "AAPL이 200달러 돌파하면 알려줘"를 설정하면 TradingView가 n8n Webhook URL로 POST를 보냅니다. 그 다음은 여러분의 워크플로가 알아서 처리 — 3D 에이전트 호출 + Discord 알림 + Sheets 기록.
x-secret-key: MYKEY)가 있는 요청만 수락하도록 하세요.
자동화 시스템의 최대 적은 조용한 실패입니다. API 호출이 실패했는데 알지 못하면 며칠간 "의사결정 없는 상태"로 방치됩니다. Error Trigger가 이를 해결합니다.
모든 알림을 Discord 하나로만 보내면 중요한 신호가 묻힙니다. 채널별 특성에 맞게 용도를 분리합니다.
@BotFather 검색 → 대화 시작 → /newbot 명령https://api.telegram.org/bot{TOKEN}/getUpdates 접속 → chat.id 복사텍스트보다 구조화된 HTML이 가독성 압도적입니다. Code 노드에서 HTML 문자열을 생성한 뒤 Gmail 노드의 HTML Body로 전달.
// 일일 리포트 HTML 생성 (Code 노드) const verdicts = $input.all(); const buyCount = verdicts.filter(v => v.json.verdict === 'BUY').length; const sellCount = verdicts.filter(v => v.json.verdict === 'AVOID').length; let rows = ''; for (let i = 0; i < verdicts.length; i++) { const v = verdicts[i].json; const color = v.verdict === 'BUY' ? '#15803d' : v.verdict === 'AVOID' ? '#dc2626' : '#666'; rows += `<tr> <td>${v.ticker}</td> <td style="color:${color};font-weight:700">${v.verdict}</td> <td>${v.confidence}/5</td> <td>${v.summary}</td> </tr>`; } const html = ` <div style="font-family:sans-serif;max-width:600px"> <h2>📊 오늘의 3D 투자 브리핑</h2> <p>BUY ${buyCount}건 · AVOID ${sellCount}건</p> <table style="width:100%;border-collapse:collapse" border="1"> <tr style="background:#f3f3f3"> <th>종목</th><th>판단</th><th>신뢰도</th><th>요약</th> </tr> ${rows} </table> <p style="color:#999;font-size:11px">교육 목적 분석. 투자 판단은 본인 책임.</p> </div>`; return { html: html, buy_count: buyCount, sell_count: sellCount };
지금까지 에이전트는 현재 데이터만 봅니다. 하지만 "지난 FOMC에서 연준이 뭐라고 했는지", "이 증권사 리포트에 BBB등급 기업 매수 조건이 뭐였는지"를 기억하지 못합니다. 이를 해결하는 것이 RAG입니다.
두 옵션 모두 무료 티어로 본 과정 전체를 커버 가능합니다. 본인 선호대로 선택하세요.
https://supabase.com 접속 → GitHub 계정으로 가입invest-rag, DB 비밀번호 설정, Region: Northeast Asia (Seoul)-- Supabase SQL Editor에서 실행 -- 1. pgvector 확장 활성화 CREATE EXTENSION IF NOT EXISTS vector; -- 2. 문서 테이블 생성 (1536차원 = OpenAI 임베딩) CREATE TABLE documents ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), content text, metadata jsonb, embedding vector(1536) ); -- 3. 유사도 검색 함수 CREATE OR REPLACE FUNCTION match_documents ( query_embedding vector(1536), match_count int DEFAULT 5 ) RETURNS TABLE (id uuid, content text, metadata jsonb, similarity float) LANGUAGE plpgsql AS $$ BEGIN RETURN QUERY SELECT documents.id, documents.content, documents.metadata, 1 - (documents.embedding <=> query_embedding) AS similarity FROM documents ORDER BY documents.embedding <=> query_embedding LIMIT match_count; END; $$;
https://cloud.qdrant.io 접속 → Google 계정 가입 (결제정보 불필요)invest-rag, Region: Germany/Frankfurt 또는 가까운 곳, Plan: Free이번 주는 "최소 1건" 저장까지만 합니다. 본격적 PDF 수백 페이지 검색은 W6에서 완성합니다.
"임베딩"은 텍스트를 숫자 배열(벡터)로 변환하는 과정입니다. 비슷한 의미의 텍스트는 비슷한 벡터가 됩니다.
// 임베딩 예시 (실제는 1536차원) "연준이 금리를 동결했다" -> [0.12, -0.04, 0.89, 0.23, ...] "FOMC에서 기준금리 유지" -> [0.11, -0.05, 0.87, 0.24, ...] // 비슷한 벡터! "사과 주식이 올랐다" -> [-0.33, 0.71, -0.12, 0.45, ...] // 전혀 다른 벡터
text-embedding-3-small은 100만 토큰당 $0.02. FOMC 의사록 50페이지 = 약 2만 토큰 = $0.0004. 거의 공짜. 수업 전체 임베딩 비용 $1 이내.
저장이 끝났으면 간단한 검색 테스트로 RAG가 작동하는지 확인합니다.
CREATE TABLE documents 실행 안 한 경우. 4교시 SQL 블록을 순서대로 모두 실행. CREATE EXTENSION vector도 먼저 해야 함.https://{cluster-id}.cloud.qdrant.io (포트 없음). Credentials에서 재입력.| 자료 | 용도 |
|---|---|
n8n Schedule Trigger Docsdocs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.scheduletrigger | Cron 표현식, Timezone 설정 상세 |
n8n Error Trigger Docsdocs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.errortrigger | 장애 복구 워크플로 설계 공식 가이드 |
Supabase pgvectorsupabase.com/docs/guides/ai/vector-columns | Vector 컬럼, 유사도 검색 함수 SQL |
Qdrant Cloud Getting Startedqdrant.tech/documentation/cloud-getting-started | 클러스터 생성·API 키 발급 공식 |
n8n Vector Store Docsdocs.n8n.io/advanced-ai/examples/vector-store-data | Insert/Query operation 상세 |
OpenAI Embeddings Pricingopenai.com/api/pricing | text-embedding-3-small 단가 |
| TradingView Alert Webhook 공식 가이드 | Webhook으로 n8n 연동 (과제 B) |