Key Takeaways
- RAG = 문서 업로드 + 검색 + 로컬 LLM 답변 생성. 훈련 불필요.
- 5단계: (1) 문서 로드, (2) 500~1000 토큰 단위로 청킹, (3) 임베딩 생성, (4) 벡터 DB에 저장, (5) 쿼리 시 검색.
- 최적의 임베딩 모델: nomic-embed-text (137M, 로컬 실행, 768차원 벡터).
- 최적의 벡터 DB: 100만 건 미만 문서에는 Chroma (간단, 내장형), 프로덕션 환경에는 Qdrant (분산형).
- 2026년 4월 현재, 로컬 RAG는 클라우드 API보다 빠르고 저렴합니다. 품질은 검색 정확도와 프롬프트 엔지니어링에 달려 있습니다.
RAG는 단계별로 어떻게 작동합니까?
- 1문서 수집: PDF, 텍스트 파일 또는 웹 페이지를 로드합니다.
- 2청킹: 문서를 500~1000 토큰 청크로 분할합니다 (문맥 단절 방지를 위해 20% 오버랩 적용).
- 3임베딩: 로컬 임베딩 모델을 사용하여 각 청크를 벡터 (768~1536 차원)로 변환합니다.
- 4저장: 벡터를 메타데이터 (문서명, 페이지, 타임스탬프)와 함께 벡터 데이터베이스 (Chroma, Qdrant, Milvus)에 저장합니다.
- 5쿼리 시: 사용자 질문을 임베딩으로 변환하고, 벡터 DB에서 가장 유사한 상위 K개 청크를 검색합니다 (k=5~10).
- 6컨텍스트 조합: 검색된 청크를 로컬 LLM을 위한 지시사항이 포함된 프롬프트로 결합합니다.
- 7생성: 로컬 LLM이 검색된 컨텍스트를 기반으로 답변을 생성합니다.
- 8귀속 표시: 답변이 어느 문서에서 나왔는지 반환합니다.
최적의 청킹 전략은 무엇입니까?
청킹 전략이 검색 품질을 결정합니다. 잘못된 청킹 = 관련 정보가 청크 사이에 분산되어 검색 실패.
의미론적 청킹 (권장): 의미를 보존하면서 문장이나 단락 단위로 분할합니다. 예: 각 단락 = 청크 1개.
고정 크기 청킹: 청크당 500 토큰, 20% 오버랩. 단순하지만 문장이 분할될 수 있습니다.
재귀적 청킹: 먼저 단락으로 분할하고, 너무 크면 문장으로 분할합니다. 계층 구조를 보존합니다.
2026년 4월 현재, 20% 오버랩이 적용된 500~1000 토큰 청크의 의미론적 청킹이 대부분의 사용 사례에 최적입니다.
# Python: semantic chunking example
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200, # 20% overlap
separators=["\n\n", "\n", ".", " "] # Split on paragraph, then sentence
)
chunks = splitter.split_documents(documents)
print(f"Created {len(chunks)} chunks")어떤 벡터 데이터베이스를 사용해야 합니까?
| Database | 유형 | 용량 | 설정 난이도 | 최적 사용 사례 |
|---|---|---|---|---|
| Chroma | — | — | — | — |
| Qdrant | — | — | — | — |
| Milvus | — | — | — | — |
| Weaviate | — | — | — | — |
| Pinecone (클라우드) | — | — | — | — |
어떤 임베딩 모델을 선택해야 합니까?
| 모델 | 벡터 차원 | 속도 | 품질 | 권장 사항 |
|---|---|---|---|---|
| — | — | — | — | — |
| — | — | — | — | — |
| — | — | — | — | — |
| — | — | — | — | — |
검색 품질을 어떻게 최적화합니까?
검색 품질이 RAG 성공을 결정합니다. 좋은 검색 = 좋은 답변. 나쁜 검색 = 환각 현상.
- Top K 선택: k=5~10개 청크를 검색합니다. K가 높을수록 더 많은 컨텍스트 (느림), K가 낮을수록 불필요한 정보 감소.
- 유사도 임계값: 최소 유사도 점수 (예: 0.75 이상)로 결과를 필터링합니다. 낮은 관련성의 청크를 방지합니다.
- 리랭킹: 리랭커 (cross-encoder)를 사용하여 검색된 청크를 관련성 기준으로 재정렬합니다. 소폭 정확도 향상.
- 하이브리드 검색: 의미론적 검색 (임베딩)과 BM25 키워드 검색을 결합합니다. 정확한 키워드가 포함된 문서를 포착합니다.
- 쿼리 확장: 동의어나 관련 용어로 사용자 쿼리를 확장합니다. 재현율을 향상시킵니다.
RAG 품질을 어떻게 평가합니까?
RAG 품질에는 두 가지 차원이 있습니다: (1) 검색 품질 (관련 청크를 가져왔는가?), (2) 생성 품질 (LLM이 잘 답변했는가?).
검색 평가: 정답 문서가 알려진 테스트 쿼리를 생성합니다. 정밀도 (검색된 항목 중 관련 항목의 비율은?)와 재현율 (모든 관련 문서를 가져왔는가?)을 측정합니다.
생성 평가: 검색된 청크로 LLM을 실행하고, 답변의 정확도와 완전성을 수동으로 점수화합니다 (0~5점 척도).
2026년 4월 현재, Ragas와 같은 자동화된 평가 도구가 검색 및 생성 지표를 자동으로 측정할 수 있습니다.
프로덕션 RAG 패턴
프로덕션 서비스를 위해 다음 패턴을 사용하십시오:
- 캐싱: 자주 조회되는 문서의 임베딩을 캐시하여 재계산을 방지합니다.
- 증분 인덱싱: 전체 재인덱싱 없이 새 문서를 추가합니다. Qdrant와 Milvus가 이를 지원합니다.
- 모니터링: 검색 지연 시간, 캐시 적중률, 답변 품질에 대한 사용자 피드백을 추적합니다.
- 폴백: 검색 실패 시 (관련 청크 없음), 환각 대신 "해당 정보를 보유하고 있지 않습니다"라고 응답합니다.
- 버전 관리: 감사 추적을 위해 문서 버전을 유지합니다. 각 답변에 사용된 버전을 저장합니다.
로컬 RAG 구현 시 흔한 실수들
- 문서 청킹 오류. 너무 작은 청크가 많으면 = 검색 노이즈. 너무 큰 청크가 적으면 = 정보 분산. 청크 크기를 실험적으로 테스트하십시오.
- 검색 평가 미실시. 검색이 작동하는지 테스트하지 않고 RAG를 구축하는 것은 엔진을 테스트하지 않고 자동차를 만드는 것과 같습니다. 항상 정밀도/재현율을 측정하십시오.
- 도메인 특화 문서에 일반 임베딩 사용. 법률, 의료 또는 기술 문서는 파인튜닝된 임베딩이 필요할 수 있습니다. 도메인 특화 모델을 고려하십시오.
- 업데이트 빈도 간과. 문서가 매주 변경된다면 벡터 DB가 오래됩니다. 재임베딩 및 업데이트 파이프라인을 구축하십시오.
- RAG가 파인튜닝을 대체할 것으로 기대. RAG는 컨텍스트 주입입니다. 파인튜닝은 모델 적응입니다. 최선의 결과를 위해 두 가지를 결합하십시오.
로컬 RAG에 관한 자주 묻는 질문
로컬 RAG는 몇 개의 문서를 처리할 수 있습니까?
Chroma는 일반 소비자용 하드웨어에서 10만~100만 건의 문서를 처리합니다. Qdrant는 분산 설정으로 수십억 건까지 확장됩니다. 100만 건을 초과하는 경우 Qdrant 또는 Milvus를 사용하십시오.
예상 지연 시간은 어느 정도입니까?
임베딩 쿼리 (CPU의 nomic-embed-text): 50~200ms. 검색 (디스크의 Chroma): 10~50ms. LLM 생성: 2~10초 (모델 크기에 따라 다름). 총합: 쿼리당 2~10초.
RAG는 실시간 문서 업데이트를 처리할 수 있습니까?
예. 벡터 DB에 새 문서를 동적으로 추가할 수 있습니다. 인덱싱 지연 시간은 문서당 100~500ms이므로 실시간 업데이트가 실용적입니다.
로컬 RAG는 클라우드 API보다 저렴합니까?
예. 토큰당 비용이 없고 외부 서비스에 대한 API 호출도 없습니다. 임베딩을 한 번 설정하면 이후 쿼리는 무료입니다.
클라우드 임베딩을 로컬 LLM과 함께 사용할 수 있습니까?
예. 인덱싱에는 OpenAI, Cohere 또는 다른 클라우드 임베딩을 사용하고, 생성에는 로컬 LLM을 사용할 수 있습니다. 하이브리드 방식입니다.
출처
- LlamaIndex Documentation -- docs.llamaindex.ai
- LangChain RAG Guide -- python.langchain.com/docs/use_cases/question_answering
- Chroma Documentation -- docs.trychroma.com
- Qdrant Vector Search Engine -- qdrant.tech
- RAG Paper (Lewis et al.) -- arxiv.org/abs/2005.11401
