본문으로 건너뛰기

Intel Platform

DART / SEC EDGAR / KRX / FRED / ECOS / Naver 뉴스 / RSS / YouTube / KIPRIS / Polygon 등 외부 데이터 소스를 일정에 따라 자동 수집해 Bronze → Silver Iceberg 테이블로 적재합니다. 분석가는 Trino SQL · CLI (gend intel) · MCP 도구로 같은 데이터에 접근합니다.

구성 요소

레이어역할
IntelSource메타 (collector_type / cron / 인증 / checkpoint). PostgreSQL intel_sources 테이블
IntelDataCollector (ABC)각 출처별 fetch 구현체. dart / sec_edgar / rss / pykrx / fred / ecos / naver_news / youtube / kipris / polygon
Bronze writericeberg.bronze.intel_*_raw 에 JSON 원본 누적 — content_hash dedup 후(#2469, 관리형·셀프서비스 공통). 동일 내용 재수집분은 적재하지 않고 응답 bronze.skipped 로 건수를 알린다 → 실행·상태 확인
Silver normalizerintel_filings / intel_companies / intel_articles 등 캐노니컬 PG 테이블
Dagster sensorintel_source_cron_sensor — 30초마다 cron 만료 source 발견 시 RunRequest

수집 흐름

새 수집원 등록 (CLI)

gend intel sources # 현재 등록 목록
gend intel run <source_uuid> # 즉시 1회 실행
gend intel filings --corp 삼성 # Silver 검색

신규 source 는 admin UI 에서 등록합니다 — 공용 수집기 (관리형)신규 등록 버튼(SQL·시드 스크립트 불필요). 단 UI 드롭다운은 collector 별 대표 domain 만 제공하므로 financials·companies_kr/us·patents_us 처럼 목록에 없는 domain 은 POST /api/v1/intel/sources 로 등록한 뒤 UI 의 ✏️ 수정에서 params_json 을 채웁니다. 키 발급·주입 절차는 Collector API Key 운영 참조.

필요한 환경변수 (collector별)

Collectorenv var비고
dartGEND_DART_API_KEYDART Open API 키 (무료, opendart.fss.or.kr)
sec_edgarGEND_SEC_USER_AGENTSEC 요구 형식: "이름 email@example.com"
fredGEND_FRED_API_KEYFRED API 키 (research.stlouisfed.org/docs/api)
ecosGEND_ECOS_API_KEY한국은행 ECOS 키 (ecos.bok.or.kr)
naver_newsGEND_NAVER_CLIENT_ID + GEND_NAVER_CLIENT_SECRETNaver 검색 API (developers.naver.com)
youtubeGEND_YOUTUBE_API_KEYYouTube Data API v3 (console.cloud.google.com)
polygonGEND_POLYGON_API_KEYPolygon.io 키
kiprisGEND_KIPRIS_API_KEYKIPRIS plus 키 (kipris.or.kr)
rss, pykrx(불필요)공개 스크래핑

키 부재 시 collector 인스턴스화 단계에서 ValueError — Dagster 가 fail-soft 로 다음 source 로 넘어가고 알람만 발생.

웹 스크래핑 회복성 (RSS / pykrx)

services/collectors/_http_resilience.py — 다음 패턴이 자동 적용됩니다:

  • User-Agent rotation: 데스크톱 브라우저 UA 4종 풀에서 요청마다 랜덤 선택 (봇 차단 회피)
  • Exponential backoff with jitter: 429/502/503/504 응답 시 1.5^attempt + jitter(0~30%) 초 대기, cap 30초
  • Retry-After 헤더 존중: 서버가 지시한 대기 시간 그대로 적용 (cap 30초 적용)
  • 재시도 횟수: 기본 4회 (3 retry). 4xx (404 등) 는 즉시 반환 (재시도 X)

기본 RSS collector 가 이미 이 helper 를 사용 — 사용자가 추가 설정할 필요 없음.

LLM Briefing 생성

services/intel/briefing_generator.pyBriefing.body_md 를 LLM 으로 채웁니다:

  • LLM 키 (GEND_OPENAI_API_KEY 또는 GEND_ANTHROPIC_API_KEY) 가 있으면 LLMProxyService._forward 호출
  • 키 없거나 호출 실패 시 fail-soft fallback 마크다운 (운영 중단 X — Briefing row 는 생성됨, body 만 보완 안내)

모니터링

메트릭의미
gend_intel_collector_runs_total{source, domain, status}run 횟수 (success/failed)
gend_intel_bronze_rows_total{source, domain}Bronze 누적 row 수
gend_workspace_id_null_attempt_total{model}Derived 모델 workspace_id NULL 시도 (Briefing/RiskReport)

Prometheus 알람 예: rate(gend_intel_collector_runs_total{status="failed"}[5m]) > 0.5

참고