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 writer | iceberg.bronze.intel_*_raw 에 JSON 원본 누적 — content_hash dedup 후(#2469, 관리형·셀프서비스 공통). 동일 내용 재수집분은 적재하지 않고 응답 bronze.skipped 로 건수를 알린다 → 실행·상태 확인 |
| Silver normalizer | intel_filings / intel_companies / intel_articles 등 캐노니컬 PG 테이블 |
| Dagster sensor | intel_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별)
| Collector | env var | 비고 |
|---|---|---|
dart | GEND_DART_API_KEY | DART Open API 키 (무료, opendart.fss.or.kr) |
sec_edgar | GEND_SEC_USER_AGENT | SEC 요구 형식: "이름 email@example.com" |
fred | GEND_FRED_API_KEY | FRED API 키 (research.stlouisfed.org/docs/api) |
ecos | GEND_ECOS_API_KEY | 한국은행 ECOS 키 (ecos.bok.or.kr) |
naver_news | GEND_NAVER_CLIENT_ID + GEND_NAVER_CLIENT_SECRET | Naver 검색 API (developers.naver.com) |
youtube | GEND_YOUTUBE_API_KEY | YouTube Data API v3 (console.cloud.google.com) |
polygon | GEND_POLYGON_API_KEY | Polygon.io 키 |
kipris | GEND_KIPRIS_API_KEY | KIPRIS 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.py 가 Briefing.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
참고
- 설계 문서: docs/DESIGN_INTEL_PLATFORM.md
- 운영자 가이드: Collector API Key 운영
- CLI:
gend intel --help