본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 10. 13:20

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 시스템입니다:

  1. Retrieval (검색) — PDF를 업로드하거나 텍스트를 붙여넣으면, 이를 청크(Chunk)로 나누고 로컬 벡터 스토어(Vector Store)에 임베딩(Embedding)합니다.
  2. Generation (생성) — 질문을 던지면, 검색된 컨텍스트(Context)와 출처 인용(Source Citations)을 바탕으로 스트리밍 답변을 제공합니다.
  3. 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초가 소요됩니다.

배운 점

  1. 평가는 선택이 아닌 필수입니다. 답변의 품질을 측정할 수 없다면, 당신은 시스템이 아니라 챗봇을 출시하고 있는 것입니다.
  2. 로컬 우선 (Local-first) 방식은 실용적입니다. 모든 것이 1,200달러짜리 노트북에서 실행됩니다. 클라우드 크레딧도, API 키도, 특정 벤더 종속성 (Vendor lock-in)도 필요 없습니다.
  3. 사용자 경험(UX)을 위해 스트리밍이 중요합니다. SSE 스트리밍을 사용하면 LLM이 생성하는 데 몇 초가 걸리더라도 UI가 반응형으로 느껴집니다.
  4. 외부 의존성을 모킹하세요. 실제 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가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0