Post

AInfo: 공공 데이터 자동 수집 및 ChromaDB 벡터 저장 파이프라인

AInfo 프로젝트에서 구현한 API 기반 공공 데이터 수집, PDF 분석, 벡터 저장 및 자동화 파이프라인을 소개합니다.

AInfo: 공공 데이터 자동 수집 및 ChromaDB 벡터 저장 파이프라인

정책 추천을 위한 데이터 파이프라인

AInfo 프로젝트는 정부24, 고용24, 청년정책 API, K-Startup PDF 등 다양한 출처의 데이터를 수집하고 이를 벡터화하여 ChromaDB에 저장합니다. 이 데이터는 향후 AI 챗봇의 추천과 검색에 활용됩니다. 이 글에서는 API와 PDF를 대상으로 한 데이터 수집, 전처리, 임베딩, 벡터 저장 및 주기적 자동화를 위한 Celery 활용 흐름을 정리합니다.

전체 흐름 요약

graph LR
A[공공 API or PDF] --> B[데이터 파싱 및 전처리]
B --> C[LangChain Document 변환]
C --> D[메타데이터 정리 및 Embedding 생성]
D --> E[ChromaDB 컬렉션에 저장]
  • dataload/common.py: 공통 유틸리티 (Chroma, 임베딩, 로깅 등)
  • dataload/load_*.py: 출처별 데이터 파서 및 저장 로직 (PDF, 정부24, 고용24, 청년정책 등)
  • dataload/load_data.py: 모든 로더를 CLI로 통합 실행 가능하도록 구성
  • dataload/tasks.py: Celery를 통한 주기적 자동화 지원
  • config/celery.py: 주간 단위 스케줄링 설정 (수요일 새벽 자동 실행)

공통 유틸리티 (common.py)

  • get_embeddings(): OpenAI Embedding 인스턴스 반환
  • get_chroma_collection(): 컬렉션 이름으로 Chroma 객체 반환
  • clear_collection(): 기존 컬렉션 문서 삭제
  • sanitize_metadata(): None, dict 등을 문자열로 정제
  • save_documents_with_progress(): 배치 저장 + 진행률 표시
  • run_loader(): 에러 핸들링 포함 로더 실행 함수

PDF 정책 데이터 파서

  • 정책 책자 내 목차 분석 → 제목 및 시작 페이지 추출
  • 실제 내용과 매칭되는 페이지 오프셋 자동 계산
  • langchain.Document 형태로 변환하여 저장
  • 정책명/페이지/본문 정보를 메타데이터에 포함

공공 API 데이터 파서

각 출처마다 다음과 같은 특성을 갖습니다:

출처주요 필드저장 컬렉션기타
정부24서비스ID, 서비스명, 분야, 지원대상 등gov24_service_list, gov24_service_detail목록 + 상세 2개 저장
고용24프로그램명, 운영기관, 일정 등employment_programsXML 기반 파싱
청년정책정책명, 신청기한, URL 등youth_policy_listJSON 기반

모든 데이터는 langchain.Document로 변환되며, 메타데이터는 sanitize_metadata()를 통해 정리됩니다.

Celery를 통한 자동화

  • accounts/tasks.py: 메일 발송용 비동기 처리
  • dataload/tasks.py: 데이터 로딩 Celery 태스크 정의
  • config/celery.py: 다음과 같은 스케줄 등록
1
2
3
4
5
app.conf.beat_schedule = {
    "load-employment-data-every-wednesday-1am": {...},
    "load-youth_policy-data-every-wednesday-1.5am": {...},
    "load-gov24-data-every-wednesday-2am": {...},
}

수요일 새벽마다 자동으로 최신 데이터를 수집하여 ChromaDB에 반영합니다.

마무리

이 파이프라인을 통해 AInfo는 수시로 갱신되는 정부 공공 데이터를 자동으로 수집하고, 향후 AI 챗봇의 검색 기반 추천에 활용할 수 있는 구조를 갖췄습니다.

This post is licensed under CC BY 4.0 by the author.