로컬 RAG 파이프라인 구축기 — 임베딩 모델 선정부터 환각 제거까지
LLM은 모르는 것도 자신있게 대답합니다. 아메리카노 가격을 물어보면 1,500원이라고 답하고, 배달 여부를 물으면 “가능합니다”라고 환각을 생성합니다. RAG(Retrieval-Augmented Generation)는 이 문제를 해결합니다. 임베딩 모델로 문서를 벡터화하고, 벡터DB에서 관련 정보를 검색해 LLM에 주입하면 환각이 사실로 교정됩니다. 임베딩 모델 선정(BGE-M3 vs mE5-Large)부터 Qdrant 벡터 검색, 그리고 실제 환각 제거 효과까지 — 각 단계를 실측 데이터로 검증했습니다.
100%
BGE-M3 한국어 Recall
100%
Qdrant Top-3 정확도
1.9ms
평균 검색 시간
+2.9%
RAG 오버헤드
왜 RAG인가
LLM은 학습 데이터에 없는 정보를 요청받으면 “그럴듯한 거짓말”을 합니다. 특히 가격, 전화번호, 영업시간, 정책 같은 사실 정보에서 환각이 집중됩니다.
No RAG — LLM만 사용
- • “아메리카노 얼마예요?” → 1,500원 (실제 4,500원)
- • “배달 되나요?” → “배달 서비스를 제공하고 있어요” (실제 미운영)
- • “단체 예약 어떻게 해요?” → “최소 3인 이상” (실제 8인 테이블)
RAG 적용
- • “아메리카노 얼마예요?” → 4,500원 (문서 기반 정확)
- • “배달 되나요?” → “배달 미운영, 매장/테이크아웃만 가능”
- • “단체 예약 어떻게 해요?” → “8인 테이블, 2일 전 예약”
RAG 파이프라인 구조
문서 청킹
원본 문서를 의미 단위로 분할
임베딩
BGE-M3로 벡터 변환 (1024차원)
저장
Qdrant 벡터DB에 인덱싱
검색
질문 임베딩 → Top-3 유사 청크
생성
검색된 청크 + 질문 → LLM 응답
임베딩 모델 비교 — BGE-M3 vs mE5-Large
RAG의 품질은 임베딩 모델이 결정합니다. 검색이 틀리면 LLM이 아무리 뛰어나도 잘못된 정보를 기반으로 답변합니다. 두 다국어 임베딩 모델을 한국어 10개 질문으로 비교했습니다.
| 항목 | BGE-M3 | mE5-Large |
|---|---|---|
| 모델 | BAAI/bge-m3 | intfloat/multilingual-e5-large |
| 벡터 차원 | 1,024 | 1,024 |
| 모델 로드 시간 | 4.2초 | 3.3초 |
| 임베딩 시간 (9청크) | 0.18초 | 0.05초 |
| 평균 Recall (Top-3) | 100.0% | 86.7% |
| 질문 | BGE-M3 | mE5-Large | mE5 누락 |
|---|---|---|---|
| 아메리카노 가격이 얼마예요? | 100% | 100% | - |
| 카페 영업시간 알려주세요 | 100% | 100% | - |
| 주차할 수 있나요? | 100% | 0% | 주차, 2대, 공영주차장 |
| 디카페인 메뉴 있어요? | 100% | 100% | - |
| 케이크 종류 뭐가 있어요? | 100% | 100% | - |
| 와이파이 비밀번호가 뭐예요? | 100% | 66.7% | 와이파이 |
| 텀블러 할인 되나요? | 100% | 100% | - |
| 반려동물 데려갈 수 있나요? | 100% | 100% | - |
| 딸기 음료 있어요? | 100% | 100% | - |
| 노트북 사용 가능한가요? | 100% | 100% | - |
mE5-Large 실패 분석
- • “주차할 수 있나요?” — Recall 0%: 주차 관련 청크를 Top-3에 하나도 포함하지 못함. “주차”를 노트북/예약 관련 청크와 혼동
- • “와이파이 비밀번호” — Recall 66.7%: 비밀번호는 찾았으나 “와이파이” 키워드가 포함된 청크를 Top-3에 누락
BGE-M3의 강점
- • 한국어 구어체(“~할 수 있나요?”, “~뭐예요?”)에 대한 의미 매칭이 정확
- • Dense + Sparse + ColBERT 멀티 벡터 지원으로 다양한 검색 패턴 커버
- • 벡터 차원 동일(1024), 저장 비용 차이 없음
- • 속도 차이(0.13초)는 실사용에서 무시 가능
벡터DB 검색 정확도 — Qdrant
BGE-M3로 임베딩한 9개 청크를 Qdrant에 저장하고, 20개 질문으로 검색 정확도를 측정했습니다.
75%
Top-1 정확도 (15/20)
100%
Top-3 정확도 (20/20)
1.9ms
평균 검색 시간
0.006초
Qdrant 업서트
| # | 질문 | Top-1 출처 | Top-1 | 검색 시간 |
|---|---|---|---|---|
| 1 | 아메리카노 가격 | menu.md | O | 4.2ms |
| 2 | 카페 영업시간 | info.md | O | 1.9ms |
| 3 | 주차 가능 여부 | faq.md | X (Top-3 O) | 1.7ms |
| 4 | 디카페인 메뉴 종류 | menu.md | O | 1.7ms |
| 5 | 케이크 종류와 가격 | menu.md | O | 2.0ms |
| 6 | 와이파이 비밀번호 | faq.md | X (Top-3 O) | 2.1ms |
| 7 | 텀블러 할인 혜택 | faq.md | O | 1.7ms |
| 8 | 반려동물 동반 가능 | info.md | O | 1.7ms |
| 9 | 딸기크림라떼 가격 | events.md | X (Top-3 O) | 1.7ms |
| 10 | 노트북 사용 가능 | faq.md | O | 1.9ms |
| 11 | 단체 예약 방법 | faq.md | O | 1.9ms |
| 12 | 원두 구매 가능 | menu.md | X (Top-3 O) | 1.6ms |
| 13 | 카페 위치 | info.md | O | 1.6ms |
| 14 | 시즌 메뉴 | menu.md | O | 2.0ms |
| 15 | 스탬프 적립 | faq.md | O | 1.6ms |
| 16 | 알레르기 정보 | menu.md | O | 1.6ms |
| 17 | 2월 이벤트 | events.md | O | 2.0ms |
| 18 | 배달 여부 | faq.md | O | 1.6ms |
| 19 | 에이드 추천 | events.md | X (Top-3 O) | 1.6ms |
| 20 | 모닝커피 할인 | events.md | O | 1.6ms |
Top-1 미스 분석
Top-1에서 놓친 5개 질문은 모두 관련 정보가 여러 문서에 분산된 경우입니다. 예: “주차 가능 여부”는 info.md에 있지만, faq.md에도 주차 관련 FAQ가 있어 faq.md가 1순위로 검색됩니다. Top-3에서는 20개 전 문항 100% 정답을 포함하므로, RAG 파이프라인에서 Top-3 청크를 LLM에 전달하면 문제없습니다.
RAG + LLM 통합 — 오버헤드와 응답 시간
BGE-M3 + Qdrant + SGLang(Qwen3)을 연동한 RAG 파이프라인의 전체 응답 시간을 측정했습니다. No RAG(LLM만)와 RAG 적용 시를 20개 질문으로 비교합니다.
| 지표 | No RAG | RAG | 차이 |
|---|---|---|---|
| 평균 총 지연시간 | 1,932ms | 1,988ms | +55.7ms (+2.9%) |
| 평균 검색 시간 | - | 2.4ms | - |
| LLM 추론 대비 검색 비용 | - | 0.1% | - |
오버헤드 분해
2.4ms
벡터 검색 (임베딩 + Qdrant)
+53.3ms
컨텍스트 토큰 증가분 (LLM)
=55.7ms
총 RAG 오버헤드 (+2.9%)
검색 자체(2.4ms)보다 검색된 청크를 LLM에 주입하면서 늘어나는 컨텍스트 처리 시간(53.3ms)이 더 큽니다. 그래도 전체 2초 대비 2.9%에 불과합니다.
| 질문 | No RAG | RAG | 검색 |
|---|---|---|---|
| 아메리카노 얼마예요? | 1,448ms | 2,338ms | 4.1ms |
| 오늘 몇 시까지 해요? | 2,173ms | 2,328ms | 2.6ms |
| 주차 가능한가요? | 1,551ms | 1,916ms | 2.8ms |
| 와이파이 비번 알려주세요 | 1,312ms | 1,275ms | 2.8ms |
| 텀블러 할인 되나요? | 1,678ms | 1,475ms | 2.4ms |
| 반려동물 데려가도 돼요? | 1,820ms | 1,515ms | 3.3ms |
| 단체 예약 어떻게 해요? | 2,134ms | 2,065ms | 1.9ms |
| 배달 되나요? | 1,269ms | 1,467ms | 2.3ms |
주요 8개 질문 발췌. 일부 질문에서 RAG가 더 빠른 경우도 있음 (LLM 응답 길이 차이)
No RAG vs RAG — 환각 제거 사례
20개 질문 중 사실 정확성이 크게 개선된 핵심 사례입니다. No RAG에서 환각이 발생한 질문이 RAG 적용으로 어떻게 교정되는지 확인합니다.
Q: 아메리카노 얼마예요?
No RAG — 가격 환각
1,500원
RAG — 문서 기반 정확
4,500원
Q: 와이파이 비번 알려주세요
No RAG — 불필요한 거부
"직접 알려드릴 수 없어요" (거부)
RAG — 문서에서 정확히 추출
dalbit_cafe / dalbit2024
Q: 주차 가능한가요?
No RAG — 정보 부족
"주차장은 있어요" (모호)
RAG — 구체적 사실
매장 앞 2대, 공영주차장 도보 3분, 1시간 무료도장
Q: 반려동물 데려가도 돼요?
No RAG — 정보 부족
"가능해요, 카페에 문의" (모호)
RAG — 구체적 조건
소형견 7kg 이하 테라스석, 물그릇 제공
Q: 배달 되나요?
No RAG — 사실 오류
"배달 서비스를 제공하고 있어요" (허위)
RAG — 정확한 거절
배달 미운영, 매장/테이크아웃만 가능
Q: 단체 예약 어떻게 해요?
No RAG — 숫자 환각
"최소 3인 이상" (허위)
RAG — 문서 기반 정확
8인 테이블, 2일 전 예약
환각 패턴 분류
가격/숫자 환각
LLM이 학습 데이터에서 일반적인 가격을 추정. 아메리카노 1,500원, 최소 3인 등 “그럴듯한” 숫자를 생성
사실 반전
배달 미운영을 “가능”으로 답변. 없는 서비스를 있다고 하는 가장 위험한 환각
모호한 회피
“카페에 문의하세요”, “주차장은 있어요” 등 구체적 정보 없이 회피하는 패턴
결론 — 로컬에서 RAG를 쓸 때 알아야 할 것들
임베딩 모델이 RAG 품질의 80%
BGE-M3는 한국어 Recall 100%, mE5-Large는 86.7%. 13.3%p 차이가 '주차 정보를 아예 못 찾는' 결과로 이어집니다.
Top-3 검색이면 충분
Top-1 정확도 75%라도 Top-3에서 100%면 문제없습니다. LLM이 3개 청크에서 정답을 골라냅니다.
RAG 오버헤드는 무시 가능
검색 2.4ms + 컨텍스트 증가 53ms = 총 55.7ms. 전체 응답 시간의 2.9%에 불과합니다.
사실 정보에는 RAG가 필수
가격, 정책, 연락처 등 사실 데이터를 다루는 서비스라면 RAG 없이 LLM만 쓰는 건 위험합니다.
이 글은 AI 챗봇 시리즈의 1편입니다. RAG만으로는 수치 데이터(가격, 재고 등)의 정확도에 한계가 있습니다. 다음 글에서는 DB 검색을 결합한 하이브리드 아키텍처로 팩트 정확도를 5배 올리는 방법을 다룹니다. 기존 LLM 환각 테스트에서 모델별 환각 패턴을 확인하고, LoRA 파인튜닝으로 회사별 맞춤형 응답을 만드는 방법도 함께 참고하시기 바랍니다.
댓글
(4개)로그인하면 댓글을 작성할 수 있습니다.
임베딩 모델 비교에서 BGE-M3가 한국어 Recall 100%를 달성한 데이터가 인상적입니다. mE5-Large가 '주차' 질문을 완전히 놓치는 건 실무에서 치명적이겠네요.
RAG 오버헤드가 +2.4ms라는 건 사실상 공짜나 다름없네요. 검색 비용이 LLM 추론 대비 0.1%면 RAG를 안 쓸 이유가 없습니다.
아메리카노 1,500원→4,500원 환각 교정 사례가 가장 와닿습니다. 고객 서비스 챗봇에서 가격을 틀리면 바로 클레임인데, RAG로 해결되는 거군요.
관련 글
© 2026 TreeRU. All rights reserved.
본 콘텐츠의 저작권은 TreeRU에 있으며, 출처를 밝히지 않은 무단 전재 및 재배포를 금합니다. 인용 시 출처(treeru.com)를 반드시 명시해 주세요.