Han Sarang / WorkCase Study 01 / 01
01AI Engineering · RAG

Buddybot

RAG-powered University Academic Assistant

대학생이 자연어 질문만으로 학사 정보를 찾을 수 있도록, Dense 임베딩과 BM25를 결합한 하이브리드 검색 위에 LLM 응답을 생성하는 RAG 챗봇입니다.

Role
[역할 · 기여 범위]
Duration
[YYYY.MM — YYYY.MM]
Type
[개인 / 팀 n명 · 수업 / 사이드]
Links
GitHub [URL]Live Demo [URL]
PythonFastAPINext.jsChromaDBSentenceTransformersBM25DockerHugging Face SpacesVercel

Reading this page

확인된 사실 — 프로젝트 정보 그대로

작성 필요 — 본인이 채울 자리

01

Context & Problem

대학의 학사 정보는 학생에게 꼭 필요하지만, 원하는 답을 찾으려면 여러 문서와 페이지를 직접 뒤져야 하는 경우가 많습니다. Buddybot은 이 정보를 자연어 질문으로 조회할 수 있게 하는 것을 목표로 했습니다.

To write — 구체적 문제어떤 학사 정보가(예: 학칙, 수강·졸업 요건, 공지) 어디에 흩어져 있었고, 학생이 실제로 어떤 질문에서 막혔는지. 직접 관찰하거나 들은 사례가 있다면 1–2개.

02

Goals & Constraints

Goals

  • 자연어 질문으로 학사 정보 조회
  • 검색된 근거 문서를 바탕으로 한 응답 생성
  • [추가 목표 — 예: 출처 표시, 응답 속도]

Constraints

  • [데이터 범위 · 수집 방식]
  • [비용 · 무료 호스팅 제약]
  • [개발 기간 · 인원]

03

System Architecture

요청은 Next.js 클라이언트에서 FastAPI 백엔드로 전달되고, 백엔드는 Dense 검색과 BM25 검색을 함께 수행한 뒤 결과로 컨텍스트를 구성해 LLM에 응답을 요청합니다.

DeploymentDockerHugging Face SpacesVercel[어느 구성 요소가 어디에 배포되는지]
fig. 03 — Request flow. 실선 박스는 확인된 구성, 강조 칩은 작성 필요.

04

Technology Stack

FrontendNext.js채팅 클라이언트
BackendFastAPIAPI 서버 (Python)
EmbeddingSentenceTransformersDense 검색용 임베딩
Vector DBChromaDB임베딩 저장 · 유사도 검색
SparseBM25키워드 기반 검색
ContainerDocker실행 환경 패키징
HostingHugging Face Spaces배포
HostingVercel배포

05

Implementation

5.1 — Data ingestion문서 수집 경로, 전처리, 청킹 기준(길이·오버랩)과 그렇게 정한 이유.
5.2 — Retrieval APIFastAPI 엔드포인트 구성, 요청·응답 스키마, Dense / BM25 인덱스를 어떻게 로드·조회하는지.
5.3 — Context construction검색 결과를 어떤 순서·형식으로 프롬프트에 넣는지, 토큰 한도를 어떻게 다루는지.
5.4 — Frontend & deploymentNext.js 채팅 UI, Docker 이미지 구성, Hugging Face Spaces · Vercel 배포 흐름.

06

Engineering Decisions

각 결정을 같은 형식으로 정리합니다: 무엇을 골랐고, 무엇과 비교했고, 무엇을 포기했는가.

D-01

왜 Dense 단독이 아닌 Dense + BM25 하이브리드인가?

Decision
Dense(SentenceTransformers) + Sparse(BM25) 결합
Compared
[대안]
Why
[이 데이터에서 각 방식이 놓친 질문 유형]
Trade-off
[포기한 것]

D-02

왜 Next.js와 별도의 FastAPI 백엔드인가?

Decision
Next.js 클라이언트 + FastAPI 백엔드 분리
Compared
[대안]
Why
[분리한 이유 — 예: Python ML 생태계 활용]
Trade-off
[포기한 것]

D-03

벡터 저장소로 왜 ChromaDB인가?

Decision
ChromaDB
Compared
[대안]
Why
[선택 근거 — 규모, 설정 난이도 등]
Trade-off
[포기한 것]

D-04

배포를 왜 HF Spaces와 Vercel로 나눴는가?

Decision
Docker + Hugging Face Spaces / Vercel
Compared
[대안]
Why
[구성 요소별 배포 위치와 이유]
Trade-off
[포기한 것]

07

Challenges & Trade-offs

Challenge 1실제로 부딪힌 문제 (예: 특정 유형 질문에서 검색 실패)
Approach시도한 방법과 결과, 남은 한계
Challenge 2배포·성능·비용 측면의 문제
Approach시도한 방법과 결과, 남은 한계

08

Results & Lessons

Next.js · FastAPI · 하이브리드 검색 · LLM으로 이어지는 전체 파이프라인을 구성하고, Docker · Hugging Face Spaces · Vercel로 배포했습니다.

Results측정한 지표가 있다면 측정 방법과 함께 적습니다(예: 평가 질문 n개 기준). 측정하지 않았다면 수치를 적지 않습니다.
Lessons다시 만든다면 바꿀 것 1–2가지 — 구체적인 기술 판단으로.