M1 Mac에서 0달러로 구축한 프로덕션급 RAG 시스템
요약
M1 Mac 환경에서 비용 없이 구축한 프로덕션급 RAG 시스템 구축 사례를 소개합니다. 단순 답변 생성을 넘어 LLM-as-judge를 활용한 충실도 및 관련성 평가 파이프라인과 MLflow를 통한 실험 추적 기능을 포함합니다.
핵심 포인트
- M1 Mac 로컬 환경에서 0달러로 RAG 시스템 구축 가능
- LLM-as-judge를 통한 답변의 충실도 및 관련성 자동 평가
- MLflow를 활용한 청크 크기 및 모델별 실험 지표 추적
- FastAPI, ChromaDB, Ollama를 활용한 경량 아키텍처 구성
I Built a Production RAG System on My M1 Mac for $0
대부분의 RAG (Retrieval-Augmented Generation) 튜토리얼은 "질문에 답변한다"는 수준에서 멈춥니다. 하지만 질문에 답변하는 것은 기본 중의 기본입니다. 진짜 질문은 이것입니다: 답변이 실제로 정확한가?
저는 단순히 검색(Retrieval)하고 생성(Generation)하는 것에 그치지 않고, 자신의 답변이 소스 자료에 충실한지(Faithful) 그리고 질문과 관련이 있는지(Relevant)를 스스로 **평가(Evaluate)**하는 RAG 파이프라인을 구축했습니다. 이 모든 과정은 16GB RAM을 탑재한 M1 Mac에서 로컬로 실행됩니다. 클라우드 비용은 0원입니다.
내가 구축한 것
대부분의 튜토리얼이 건너뛰는 세 가지 레이어를 갖춘 완전한 RAG 시스템입니다:
- Retrieval (검색) — PDF를 업로드하거나 텍스트를 붙여넣으면, 이를 청크(Chunk)로 나누고 로컬 벡터 스토어(Vector Store)에 임베딩(Embedding)합니다.
- Generation (생성) — 질문을 던지면, 검색된 컨텍스트(Context)와 출처 인용(Source Citations)을 바탕으로 스트리밍 답변을 제공합니다.
- Evaluation (평가) — LLM-as-judge를 사용하여 모든 답변의 충실도와 관련성을 점수화하는 자동화된 테스트 스위트(Test Suite)를 실행하고, 실험 추적(Experiment Tracking)을 위해 모든 지표를 MLflow에 기록합니다.
평가가 중요한 이유
그럴듯하게 들리는 답변을 생성하는 RAG는 누구나 만들 수 있습니다. 어려운 부분은 그 답변이 소스 자료에 **근거(Grounded)**하고 있는지, 아니면 그저 자신감 넘치는 환각(Hallucination)인지 아는 것입니다.
저의 평가 파이프라인은 세 가지를 측정합니다:
- Faithfulness (충실도, 1-5): 답변이 실제로 검색된 청크(Chunks)에 의해 뒷받침되는가? 아니면 LLM이 지어내고 있는가?
- Relevance (관련성, 1-5): 답변이 주어진 질문에 대한 정답 참조(Ground Truth Reference)와 일치하는가?
- Retrieval Accuracy (검색 정확도, %): 참조 답변의 핵심 용어 중 몇 퍼센트가 실제로 검색된 청크에 나타나는가?
이 세 가지 지표는 모두 MLflow에 기록되므로, 실행 시마다 서로 다른 청크 크기(Chunk Size), 오버랩(Overlap) 값, 모델 선택 등을 비교할 수 있습니다.
아키텍처 (Architecture)
전체 스택은 로컬에서 실행됩니다:
- FastAPI 백엔드 (비동기 스트리밍 응답 지원)
- ChromaDB 벡터 스토어 (임베디드 방식, 별도 서버 불필요)
- all-MiniLM-L6-v2 (sentence-transformers) 임베딩 모델 — 80MB, CPU에서 매우 빠름
- qwen3:4b (Ollama) 생성 모델 — 2.5GB, API 키 불필요
- MLflow 실험 추적 (Experiment Tracking) — 파라미터, 메트릭 등 모든 데이터 기록
- Vanilla HTML/CSS/JS 프론트엔드 — 다크 테마, 채팅 UI, PDF 업로드, 평가(Eval) 컨트롤
왜 Ollama 임베딩을 사용하지 않았나요?
처음에는 nomic-embed-text를 사용하여 Ollama의 /api/embeddings 엔드포인트로 시작했습니다. 하지만 제 M1 Mac에서는 임베딩 호출 한 번당 30초 이상이 걸릴 정도로 고통스러울 만큼 느렸습니다. 그래서 동일한 all-MiniLM-L6-v2 모델을 로컬 프로세스 내에서 실행하는 sentence-transformers로 전환했습니다. 첫 호출 시 모델 로드에 약 2초가 소요되지만, 이후 임베딩은 각각 약 18ms가 걸립니다. 천지차이입니다.
코드 (The Code)
전체 프로젝트는 오픈 소스입니다. 주요 파일은 다음과 같습니다:
rag_engine.py— 청킹 (Chunking), 임베딩 (Embedding), 벡터 저장 (Vector Storage), 검색 (Retrieval)llm_client.py— 동기 및 스트리밍 생성을 지원하는 Ollama 클라이언트evaluator.py— 충실도 (Faithfulness) 및 관련성 (Relevance) 측정을 위한 LLM-as-judge 점수 산정tracker.py— MLflow 실험 추적 래퍼 (Wrapper)app.py— 모든 기능을 하나로 묶는 FastAPI 라우트seed.py— 샘플 데이터 시딩 (Seeding) 스크립트
테스트는 완전히 모킹 (Mocked) 되어 있어, Ollama나 모델 파일이 필요하지 않습니다. 전체 테스트 스위트가 실행되는 데 약 30초가 소요됩니다.
배운 점
- 평가는 선택이 아닌 필수입니다. 답변의 품질을 측정할 수 없다면, 당신은 시스템이 아니라 챗봇을 출시하고 있는 것입니다.
- 로컬 우선 (Local-first) 방식은 실용적입니다. 모든 것이 1,200달러짜리 노트북에서 실행됩니다. 클라우드 크레딧도, API 키도, 특정 벤더 종속성 (Vendor lock-in)도 필요 없습니다.
- 사용자 경험(UX)을 위해 스트리밍이 중요합니다. SSE 스트리밍을 사용하면 LLM이 생성하는 데 몇 초가 걸리더라도 UI가 반응형으로 느껴집니다.
- 외부 의존성을 모킹하세요. 실제 LLM을 호출하는 테스트는 느리고 불안정합니다. HTTP 계층을 모킹하고 로직을 테스트하세요.
직접 시도해보세요
저장소에는 샘플 데이터가 포함된 시드 스크립트가 있어, 클론(Clone) 후 5분 이내에 실행할 수 있습니다. Python 3.9 이상과 qwen3:4b가 설치된 Ollama만 있으면 됩니다.
git clone https://github.com/SaintChris/rag-eval-system.git
cd rag-eval-system/backend
python3 -m venv venv && source venv/bin/activate
...
대화형 API 문서(interactive API docs)를 확인하려면 http://localhost:8001/docs를 여세요.
다음 단계
이것은 제 포트폴리오 재구축 프로젝트 5개 중 첫 번째 프로젝트입니다. 다음 단계는 22,000개 이상의 요청, 52개의 테스트를 처리하면서 클라우드 비용을 0달러로 유지하며 6개의 에이전트(agent) AI 시스템을 어떻게 운영하는지 보여주는 Hermes MLOps 사례 연구입니다. 이 모든 과정은 동일한 M1 Mac에서 이루어집니다.
만약 여러분이 RAG 시스템을 구축하면서 평가(evaluating)를 하지 않고 있다면, 눈을 감고 비행하는 것과 같습니다. 평가 파이프라인(eval pipeline)을 먼저 구축하세요. 그 외의 모든 것은 그 뒤를 따릅니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기