개요

  • 목적: 수집된 공시·뉴스 데이터를 벡터 임베딩하여 시맨틱 검색 기반 RAG(Retrieval-Augmented Generation) 구현
  • 배경: 키워드 검색으로는 “금리 인상에 영향받는 공시”처럼 의미 기반 질의가 불가능. 벡터 검색으로 해결

전체 아키텍처

graph TB
    subgraph 수집 ["수집 (n8n Watcher)"]
        A["DART / EDGAR / Policy 등"]
    end
    subgraph 임베딩 ["임베딩 파이프라인"]
        B["원문 크롤링"]
        C["Token Splitter<br/>(4096 토큰)"]
        D["Ollama 임베딩<br/>(BGE-M3 / nomic)"]
    end
    subgraph 저장 ["벡터 스토어"]
        E["Qdrant"]
    end
    subgraph 검색 ["RAG 검색"]
        F["Market Briefings<br/>AI Agent"]
        G["Telegram AI<br/>Assistant"]
    end
    A --> B --> C --> D --> E
    E --> F
    E --> G

1. Qdrant 컬렉션 구성

컬렉션Watcher임베딩 모델차원언어
dart-disclosuresDARTBGE-M31024한국어
real-estate-krReal Estate KRBGE-M31024한국어
edgar-filingsEDGARnomic-embed-text768영어
us-congress-billsCongressnomic-embed-text768영어
tech-trendsTech Trendnomic-embed-text768영어
corporate-intelCorporate Intelnomic-embed-text768영어
policy-regulationPolicynomic-embed-text768영어
real-estate-usReal Estate USnomic-embed-text768영어

2. 임베딩 모델 선택

모델별 비교

항목nomic-embed-textBGE-M3
차원7681024
언어영어 특화다국어 (한/영/중/일)
적용 대상EDGAR, Congress 등 영어 데이터DART, 한국 부동산 등 한국어 데이터
구동 환경Ollama (셀프호스팅)Ollama (셀프호스팅)

BGE-M3 전환 배경

  • DART 공시, 한국 부동산 데이터에서 nomic-embed-text 사용 시 한국어 시맨틱 검색 품질 저하
  • BGE-M3로 전환 후 DART/부동산 컬렉션을 1024차원으로 재생성
  • 영어 전용 컬렉션(EDGAR, Congress 등)은 기존 nomic-embed-text 유지

3. 원문 데이터 임베딩 전략

기존 문제

  • AI 분석 결과(impact/score/summary)만 임베딩 → 원문(회사명, 공시 제목, URL 등)이 벡터 검색에 누락

해결: 원문 임베딩 병렬 저장

  • Filter & Dedupe 노드에서 분기하여 원문을 같은 Qdrant 컬렉션에 저장

DART 원문 임베딩 형식

[DART 공시 원문] {기업명} ({종목코드})
공시명: {report_nm}
공시일: {rcept_dt}
제출인: {flr_nm}
시장: {유가증권/코스닥}
링크: {url}

EDGAR 원문 임베딩 형식

[SEC EDGAR 원문] {form_type} - {company}
제목: {title}
일자: {filing_date}
Accession: {accession_no}
링크: {url}

Metadata 구분

필드용도
typeraw원문 데이터 식별
sourceDART / SEC EDGAR출처 구분

4. 본문 크롤링

EDGAR (SEC API 직접)

  • SEC Submissions API에서 primaryDocument 경로를 확인하고 HTML을 직접 fetch
  • JavaScript 렌더링 불필요 → Browserless 없이 처리 가능
Filter & Dedupe → Extract CIK → Fetch SEC Submissions
  → Find Primary Document → Fetch Filing Document → Qdrant

DART (Browserless 사용)

  • DART 사이트가 일반 HTTP 요청을 차단하므로 headless browser 필요
  • Browserless: 셀프호스팅 headless Chrome API (LXC 컨테이너에 Docker로 실행)
Filter & Dedupe → Crawl DART Page (Browserless /content API)
  → HTML → 텍스트 변환 (최대 8000자) → Qdrant

5. Qdrant Upsert 패턴

문제

  • 동일 거래의 취소/변경이 중복 저장됨 (부동산 데이터)

해결: Delete → Insert (Upsert)

Prepare Content → Qdrant Delete Old (HTTP 노드)
  → Qdrant Store (재삽입)
  • metadata.external_id 기준으로 기존 포인트 삭제 후 재삽입
  • Qdrant REST API를 직접 호출하여 조건부 삭제 수행

6. RAG 검색 활용

Market Briefings에서의 활용

AI ToolQdrant 컬렉션용도
SEC EDGAR Searchedgar-filings미국 공시 컨텍스트 검색
DART Korea Searchdart-disclosures한국 공시 컨텍스트 검색
US Congress Searchus-congress-bills법안 관련 컨텍스트 검색

Telegram AI Assistant에서의 활용

  • 사용자가 자연어로 질문 → Qdrant 시맨틱 검색 → AI 답변 생성
  • 예: “최근 반도체 관련 DART 공시 요약해줘”

각 활용 워크플로의 상세 구현은 n8n AI 마켓 브리핑 글에서 다룸.