데이터 파이프라인¶
세무 법령·판례·상담 등 외부 데이터를 수집(Collect) → JSONL/JSON으로 저장 → Elasticsearch에 임베딩과 함께 적재(Index)하는 오프라인 데이터 파이프라인. 백엔드 RAG 검색이 의존하는 14개 ES 인덱스를 채우는 공급 라인이다. Python(packages/data-pipeline)에서 CLI로 실행되며, 별도의 worker/queue/Docker 인프라 없이 로컬 머신에서 직접 돈다.
클러스터 개요¶
[외부 데이터 소스] [수집 결과] [ES 인덱스]
law.go.kr ──┐ data/laws/*.json tax-laws
국세상담센터 ──┤ data/counsel/*.json tax-counsel
조세심판원 tt.go.kr ──┤ data/tribunal/*.jsonl tax-tribunal
대법원 scourt ──┼─→ Python Collector ───→ data/scourt/*.json ───→ tax-scourt
국세법령정보(taxlaw) ──┤ (semugpt-collect) data/written_inquiry/... tax-written-inquiry
한국회계기준원 ──┤ data/accounting/*.jsonl tax-accounting
세림세무법인 ──┘ data/taxoffice/*.json tax-taxoffice
... ... (총 14개)
│
▼
Python Indexer → ES bulk API
(semugpt-index) + OpenAI 임베딩 (3072 dim)
│
▼
Backend (Kotlin)
RAG 검색 (BM25 + kNN + RRF)
페이지 구성¶
| 페이지 | 다루는 범위 |
|---|---|
| 수집기 (Collectors) | 외부 데이터 소스 14곳 → JSONL/JSON 저장. BaseCollector 추상 클래스, Selenium vs requests 선택 기준, 재개(resume) 패턴 |
| 인덱서 (Indexers) | JSONL/JSON → Elasticsearch bulk 적재. create_es_client 공통 패턴, 매핑 정의, 임베딩 통합 |
| Elasticsearch | 14개 인덱스 매핑/분석기/벡터 필드. Nori 분석기, content_vector 3072 dims, ES 8.17 운영 환경 |
| 임베딩 | OpenAIEmbedder (text-embedding-3-large), SQLite 캐시, 백엔드 쿼리 임베딩과의 정합성 |
| CLI 레퍼런스 | semugpt-collect / semugpt-index / semugpt-process 명령 및 옵션 |
데이터 흐름 요약¶
- 수집 —
semugpt-collect {source}로 외부 사이트/API에서 JSONL 증분 저장 (재개 가능) - (옵션) 변환 —
--convert또는semugpt-process merge로 JSONL → 인덱서 호환 JSON - 인덱스 생성 —
semugpt-index create --index {source}로 ES 매핑 생성 (1회) - 벌크 인덱싱 —
semugpt-index bulk --index {source} --embed로 ES 적재 + 임베딩 생성 - 검증 —
curl /_cat/indices, 백엔드 검색 결과로 정상성 확인
관련 문서¶
- 리포트 생성 — 14개 ES 인덱스를 소비하는 RAG 검색 파이프라인
packages/data-pipeline/CLAUDE.md(리포 안 직접 참조) — 새 collector 추가 시 8단계 체크리스트 (백엔드 DTO/Repository까지 포함)packages/data-pipeline/README.md— 패키지 자체 사용자 가이드