Vantage: AI 큐레이션 플랫폼
Vantage는 기술 뉴스와 논문을 지속적으로 확인하기 어려운 문제에서 시작한 개인 프로젝트입니다. 정보를 많이 모으는 것만으로는 충분하지 않다고 판단했습니다. 수집한 내용을 정제하고, 서로 관련 있는 기사를 연결하며, 질문에 답할 때는 확인한 근거를 다시 찾을 수 있어야 했습니다.
해결하고 싶은 문제
- 매일 쏟아지는 기술 뉴스와 논문 중 읽을 가치가 있는 정보를 구분합니다.
- 같은 사건을 다루는 여러 기사를 하나의 흐름으로 이해할 수 있도록 스토리 단위로 묶습니다.
- 사용자가 질문하면 수집한 자료를 검색하고 출처에 근거해 답변하도록 합니다.
- 크롤링, 요약, 임베딩, 검색, 브리핑 생성이 서로 독립적으로 발전할 수 있게 구성합니다.
전체 구성
Backend는 Java 21과 Spring Boot를 사용합니다. 공개 API와 관리자 기능, 작업 요청, 인증 및 데이터 모델을 담당합니다.
AI 서비스는 Python과 FastAPI, LangGraph 기반입니다. 뉴스 요약과 분류, 임베딩, 스토리 클러스터링, RAG 챗봇, 브리핑 생성 등의 AI 작업을 수행합니다.
Crawler 서비스는 RSS와 논문 소스를 수집하고 Crawl4AI를 활용해 원문을 정제합니다. PDF 서비스는 MinerU로 논문을 파싱하고 검색할 수 있도록 청킹과 색인을 진행합니다.
데이터는 PostgreSQL, pgvector, ParadeDB 기반 BM25, Redis 등을 활용합니다. 운영은 OCI ARM 환경의 k3s를 중심으로 구성했고 Grafana, Prometheus, Loki 및 Langfuse로 상태와 AI 실행을 관찰합니다.
데이터는 어떻게 흘러갈까
- RSS와 논문 소스에서 새로운 후보를 수집합니다.
- 노이즈를 필터링하고 원문 또는 PDF를 파싱합니다.
- 요약과 태그, 임베딩을 생성하고 관련 기사를 연결합니다.
- 검색 인덱스에 반영한 뒤 피드와 트렌드에서 제공합니다.
- 별도의 에이전트가 일일 브리핑과 주간 리서치를 작성합니다.
- 사용자의 질문에는 검색한 자료를 근거로 RAG 챗봇이 답변합니다.
작업마다 필요한 실행 시간과 장애 양상이 다르기 때문에 모든 것을 하나의 동기 API 호출로 묶지 않았습니다. 브리핑과 리서치, 논문 처리 등 서비스 간 작업에는 RabbitMQ 명령과 이벤트를 사용하고, 일부 기사 처리 단계는 별도의 작업 상태와 코디네이터로 연결합니다.
구현하며 중요하게 본 원칙
- 근거 없는 답변보다 답변 보류: 검색 결과가 질문에 충분한지를 판단하는 단계를 답변 생성 전에 둡니다.
- 결합도보다 명확한 책임: 작업 요청과 결과 이벤트의 계약을 분리해 서비스 간 의존을 줄입니다.
- 평가할 수 있는 AI 기능: 합성 질문 데이터와 LLM-as-a-Judge를 활용해 검색과 답변 품질을 확인합니다.
- 운영 가능한 개인 서비스: 처리 이력과 오류, 지연을 추적할 수 있도록 로그, 메트릭 및 작업 상태를 기록합니다.
앞으로 기록할 내용
이 블로그에는 Vantage의 기능 소개뿐 아니라 설계 과정에서 겪은 선택과 시행착오를 남길 예정입니다. 메시지 큐 도입, RAG 평가, 문서 검색, k3s 운영, AI 개발 환경을 중심으로 정리하겠습니다.