LLM을 활용한 고급 RAG 시스템 구축: FastAPI와 Streamlit 기반 프로젝트
최근 머신 러닝 기술의 발전으로 LLM (Large Language Models) 기반 애플리케이션이 많은 주목을 받고 있습니다. 특히, Retrieval-Augmented Generation (RAG)은 제한된 정보로부터 정확하고 유의미한 답변을 생성할 수 있는 강력한 기술입니다. 이번 포스트에서는 FastAPI와 Streamlit을 활용하여 RAG 기반의 고급 시스템을 구축한 프로젝트의 기술적 스펙과 구현 사항을 공유하겠습니다.
🔸 시스템 아키텍처
백엔드 시스템 (FastAPI)
-
모듈화된 구조
app/
디렉토리 기반으로 설계하여 코드의 유지보수성과 확장성을 확보하였습니다.- 각 기능을 독립적으로 관리할 수 있는 모듈화된 구조.
-
서비스 레이어:
- LLM, Memory, RAG 서비스를 분리하여 각각의 역할을 명확히 정의.
- 서비스 간 의존도를 줄여 독립적인 테스트와 디버깅이 가능.
-
API 레이어:
- 채팅 엔드포인트와 라우터 설계.
- FastAPI로 구현된 RESTful API를 통해 백엔드 기능 제공.
-
유틸리티:
- 로깅: 디버깅 및 시스템 상태 파악을 위한 중앙화된 로깅.
- 성능 측정: 검색 시간 및 응답 생성 시간 등 주요 메트릭을 추적.
벡터 데이터베이스
FAISS (Facebook AI Similarity Search)
- 고성능 벡터 검색 라이브러리인 FAISS를 활용.
- 임베딩된 문서를 저장하고, 의미적 검색을 지원.
- 약 10,000개 문서 청크를 저장 가능하며, Top-K 문서 검색 최적화.
LLM 통합
-
DeepSeek-R1 API 연동:
- 외부 LLM API와의 통합을 통해 효율적인 생성형 AI 응답 제공.
- 최대 16K 토큰 컨텍스트 창을 지원하여 대규모 질의 처리 가능.
-
시스템 프롬프트 최적화:
- Retrieval-Augmented Generation(RAG) 응답 품질을 높이기 위한 프롬프트 최적화.
프론트엔드 (Streamlit)
-
Streamlit 기반 UI:
- 사용자 친화적인 채팅 인터페이스 설계.
- 실시간 RAG 기반 생성 결과와 성능 데이터 시각화 제공.
-
추가 UI 기능:
- Tree of Thoughts (ToT) 모드 전환:
- ToT 패턴을 활성화/비활성화할 수 있는 옵션 제공.
- 성능 메트릭 시각화:
- 검색 시간, 응답 생성 시간 등 주요 메트릭을 차트 형태로 표시.
- Tree of Thoughts (ToT) 모드 전환:
🔸 특별 구현 기능
1. Tree of Thoughts (ToT) 추론 패턴
ToT는 보다 체계적이고 깊이 있는 답변을 제공하기 위해 설계된 추론 패턴입니다.
-
단계별 프로세스:
- 아이디어 생성: 여러 접근법(3~5개)을 동시에 생성.
- 평가 단계: 각 접근법에 점수를 부여하여 평가.
- 최적화 단계: 가장 최적 접근법을 선택하여 최종 응답 생성.
-
결과:
일반 RAG보다 구조적이고 명확한 응답을 생성합니다. 특히, 복잡한 문제 해결 및 심층적인 답변 생성에서 우수한 성능을 발휘.
2. 고급 RAG 시스템
-
컨텍스트 검색 최적화:
- Top-K 문서 검색을 통해 가장 연관성 높은 정보를 선택.
-
관련성 점수 가중치 적용:
- 검색 과정에서 문서의 중요도와 관련성 점수를 부여해 품질을 향상.
-
결과 재순위화 로직:
- 검색 결과를 재조정하고 최적 응답을 보장하기 위한 커스텀 로직 구현.
3. 메모리 시스템
-
ConversationBufferMemory:
- 대화 이력을 관리하여 맥락을 유지.
- 사용자가 이전 대화에 언급한 내용을 자연스럽게 참조하는 기능.
-
토큰 한계 관리:
- 입력 크기가 컨텍스트 창을 초과하지 않도록 설계.
- 토큰 제한 관리 시스템으로 대규모 컨텍스트 처리 가능.
🔸 배포 환경
서버 환경:
- 서버는 DigitalOcean Droplet을 활용하여 직접 배포.
- 스펙:
- 4 CPU, 8GB RAM
- 소규모 프로젝트나 MVP를 위한 최적의 환경.
운영체제:
- Ubuntu 22.04 LTS:
- 안정성과 보안성이 뛰어난 장기 지원 버전(OS).
서비스 관리:
systemd
를 사용하여 서비스 자동 실행 및 재시작 처리.
포트 구성:
- 8000번 포트: FastAPI 백엔드 RESTful API.
- 8501번 포트: Streamlit 프론트엔드 대화형 UI.
모니터링:
- 로깅 및 성능 메트릭 수집으로 시스템 상태를 지속적으로 추적.
🔸 성과와 주요 특징
- 고급 RAG와 ToT 알고리즘 활용으로 일반 RAG 시스템보다 신뢰성과 응답 품질 향상.
- 모듈화된 구조로 유지보수와 확장성 제공.
- FAISS 벡터 데이터베이스로 고성능 의미적 검색 지원.
- Streamlit 프론트엔드를 통해 사용자 친화적인 UI 제공.
🔸 마무리
이 프로젝트는 최신 기술 스택과 고급 알고리즘을 활용하여 LLM 기반의 고급 RAG 시스템을 구축한 사례입니다. FastAPI와 Streamlit을 기반으로 백엔드와 프론트엔드가 조화를 이루며, 사용자가 보다 체계적이고 정확한 정보를 얻을 수 있도록 설계되었습니다. 앞으로도 이 같은 기술을 바탕으로 한 확장성과 품질을 높이는 프로젝트가 기대됩니다.
이 글이 프로젝트를 이해하거나 유사한 시스템을 설계하는 데 도움이 되셨길 바랍니다. 더 많은 정보와 구현 세부사항이 궁금하다면 댓글로 남겨주세요! 😊