RAG
외부 지식을 검색해 최신성, 출처 인용, 권한 필터를 운영 로직으로 통제한다.
문서가 자주 바뀌고 답변 근거를 사용자나 감사 로그에 남겨야 할 때분류: Layer 12 - AI 시스템 & LLM 애플리케이션 | 선수지식: L12-10 (LLM API), L12-20 (Prompt), L12-30 (임베딩·벡터)
RAG (Retrieval-Augmented Generation)는 외부 지식을 검색해 LLM context에 주입한 뒤 답변 생성하는 패턴이며, fine-tuning 없이 자주 갱신되는 지식·출처 인용·환각 감소를 동시에 해결한다.
L12-10 (LLM API) 단계에서 본 parametric LLM(지식이 모델 가중치에 박혀 있는 형태)에는 세 가지 구조적 한계가 있다. Lewis et al. (NeurIPS 2020)이 RAG를 제안한 동기가 정확히 이 셋이다.
RAG의 해결 메커니즘: 외부 KV store(벡터+BM25)에 진실을 두고, 쿼리마다 top-K를 검색해 prompt에 주입한 뒤 “documents 밖은 모른다”고 제약한다. 그 결과 (a) 문서 1개 교체로 즉시 갱신, (b) chunk ID를 답변에 인용해 provenance 확보, (c) 적절히 구성하면 hallucination을 RAG 없는 baseline 대비 최대 71%까지 감소 (premai blog, RAG eval 2026).
이 토픽이 사라지면 무엇이 깨지는가: 자주 갱신되는 사내 지식을 LLM에 태우는 모든 흐름이 끊긴다. 대안은 매주 fine-tune을 다시 돌리는 것뿐인데 비용 자릿수가 1~3배 다르다.
[색인 단계 — offline]1. 문서 수집 (PDF, web, DB, 코드 등)2. Chunking (L12-30 §3.3)3. Embedding (text-embedding-3, BGE-M3, voyage-3 등)4. Vector store에 색인 (HNSW 등)
[검색·생성 단계 — online]5. 사용자 query 받음6. Query embedding7. Vector store에서 top-K (보통 10~20) 검색8. Prompt에 검색 결과 주입9. LLM 호출 → 답변 생성flowchart TD
A["문서 수집"] --> B["Chunking"]
B --> C["Embedding"]
C --> D["Vector store 색인"]
E["사용자 query"] --> F["Query embedding"]
F --> G["Top-K retrieval"]
D --> G
G --> H["Prompt에 context 주입"]
H --> I["LLM generation"]
I --> J{"근거와 citation 충분?"}
J -->|yes| K["답변 반환"]
J -->|no| L["재검색 또는 모른다고 답변"] RAG는 검색과 생성 사이에 faithfulness gate를 두지 않으면, 인용 형식만 갖춘 환각으로 조용히 실패한다.
이게 가장 단순한 형태. production에서는 거의 항상 부족 — 다음 절들의 개선이 누적된다.
사용자 query를 그대로 검색하지 말고 변형해서 검색.
원본: "RAG 어떻게 해?"변형: "Retrieval-Augmented Generation 구현 방법, vector store 선택, chunking 전략"같은 의도로 N개 변형 → 각각 검색 → 합집합.
원본: "Python에서 비동기 처리"변형 1: "Python asyncio 사용법"변형 2: "Python async/await 예제"변형 3: "Python 동시성 코루틴"LLM에 가상 답변을 먼저 생성시키고, 그 답변을 임베딩해 검색.
1. "RAG 어떻게 해?" → LLM이 가상 답변 생성2. 가상 답변을 임베딩3. 그 vector로 검색query보다 답변이 문서와 의미적으로 더 가까워 검색 품질 ↑ (Gao et al. 2022).
복잡한 질문을 sub-question으로 분해.
원본: "RAG와 fine-tune의 비용 차이는?"분해: 1. RAG의 비용 모델 2. fine-tune의 비용 모델→ 각각 검색·답변 후 결합L12-30의 인프라 위에서.
검색 후 cross-encoder reranker로 top-10 정렬 (L12-30 §3.5). RAG 품질에서 가장 큰 ROI.
검색 결과를 prompt에 넣는 방식.
<documents> <doc id="1" source="/manual.pdf">{content_1}</doc> <doc id="2" source="/faq.md">{content_2}</doc></documents>
<question>{user_query}</question>
<instruction>위 documents에 근거해 답하라.- 출처는 [doc_1] 형식으로 인용- documents에 없는 정보는 추측하지 말고 "모릅니다"- 한국어로</instruction>연구 결과 (Liu et al. 2023, “Lost in the Middle”): 앞 또는 끝 정보가 가장 잘 활용됨. 중간 정보는 무시되기 쉬움.
운영 권장: 검색 결과는 prompt 끝쪽 또는 시스템 직후 앞쪽에. 가장 중요한 doc부터.
"asyncio는 Python 3.4부터 표준 라이브러리에 포함되었습니다. [doc_1]async/await 키워드는 Python 3.5부터 사용 가능합니다. [doc_2]"검색 부족하다고 판단되면:
LLM이 검색 필요 여부를 스스로 판단 → 검색 → 자기 평가 → 답변.
검색 결과의 신뢰도를 평가, 부족하면 web search로 보완.
문서를 entity·관계 그래프로 변환 → community detection → 글로벌 question에 강함.
"이 회사의 전체 전략은?" 같은 글로벌 질문에 single-document 검색은 부족→ entity 그래프로 community summary 생성 → 그것을 검색검색을 단발이 아닌 agent가 도구처럼 호출 (L12-60). 부족하면 다른 검색·tool 호출.
document hierarchy를 미리 만들어 효율적 검색.
RAG 아키텍처 이름은 많지만, 운영자가 봐야 할 축은 검색 품질을 어디에서 올리는가, 비용을 어디까지 감수하는가, 실패 시 어떻게 멈추는가다.
| 변형 | 핵심 구조 | 적합한 상황 | 운영 리스크 |
|---|---|---|---|
| Naive RAG | query embedding → top-K → prompt | PoC, 작은 FAQ, 명확한 단일 문서 질문 | query mismatch, reranker 부재, stale data |
| Advanced RAG | rewrite·hybrid·rerank·parent-child 추가 | production QA 대부분 | stage 증가로 latency·trace 복잡도 증가 |
| Modular RAG | retriever, reranker, generator를 독립 교체 | 팀·도메인별 검색 전략이 다른 플랫폼 | 인터페이스 계약 없으면 회귀 원인 추적 어려움 |
| Corrective / Self-RAG | 검색 결과를 평가하고 재검색·refusal 수행 | 검색 실패가 사용자 피해로 이어지는 도메인 | LLM judge 비용, loop 폭주, 불안정한 latency |
| GraphRAG | chunk 대신 entity·relation·community 검색 | ”전체 전략”, “조직 간 관계” 같은 글로벌 질문 | 색인 비용 큼, entity 추출 품질에 강하게 의존 |
| Agentic RAG | agent가 검색·DB·도구를 여러 번 호출 | multi-hop, 업무 자동화, 조건부 action | permission, tool call budget, 재현성 관리 |
운영 기본값은 Advanced RAG다. naive로 시작하더라도 최소한 query rewriting → hybrid → rerank → citation/faithfulness gate 순으로 보강해야 production baseline이 된다. GraphRAG와 Self-RAG는 “멋있어서”가 아니라 아래 트리거가 있을 때만 올린다.
LLM context가 1M+ 시대에 RAG가 여전히 필요한지는 “지식 갱신”, “출처 인용”, “호출당 비용”, “응답 형식 일관성”으로 나눠 판단한다.
외부 지식을 검색해 최신성, 출처 인용, 권한 필터를 운영 로직으로 통제한다.
문서가 자주 바뀌고 답변 근거를 사용자나 감사 로그에 남겨야 할 때한 번에 많은 자료를 prompt에 넣지만 prefill 비용과 lost-in-the-middle 위험이 커진다.
단발 분석이고 corpus가 context window 안에 들어갈 때지식을 매번 검색하기보다 모델 행동, 톤, 출력 형식을 가중치에 맞춘다.
지식 갱신은 느리지만 응답 형식과 도메인 행동을 일관되게 만들 때결론: 자주 갱신·출처 필요 → RAG. 정형 도메인 행동 → fine-tune. 한 번에 넣을 수 있고 단발 작업 → long-context.
→ 셋을 결합한 hybrid 패턴이 production 표준이며 실제 2025~2026 배포의 약 60%가 RAG + fine-tune 혼용 (pecollective). RAG로 신선도·출처를, fine-tune으로 응답 형식·페르소나를 담당시킨다.
퀴즈
힌트: 검색 실패와 생성 실패는 복구 방법이 다르다.
먼저 trace에서 검색 chunk와 답변 문장을 대조해 retrieval 실패인지 generation faithfulness 실패인지 분리한다. 검색 결과가 맞는데 답변이 새 내용을 지어내면 prompt, citation, refusal, faithfulness gate를 먼저 고친다.
코퍼스 갱신이 1년에 12회면 RAG의 갱신 우위가 사라지고, fine-tune의 호출당 단가 우위($0.0001~0.01)만 남는다는 점을 결정 표 위에 명시한다.
L11-80 §3.13의 Ragas 4-지표를 RAG 시점으로:
Ragas Faithfulness는 답변을 문장 단위로 분해한 뒤 검색 chunk와 대조하는데, 답변이 표·코드·짧은 어구 위주면 분해가 실패한다. FinanceBench(재무 답변 데이터셋) 평가에서 default Ragas Faithfulness는 샘플의 83.5%에서 점수를 산출하지 못함 (Data Science Collective, 2025). 답변 포맷이 표·숫자 위주인 도메인은 Ragas만 신뢰하지 말고 LLM-as-judge custom rubric 또는 cleanlab TLM 같은 독립 검출기를 병행한다.
1. Gold dataset (질문·정답·출처) 준비 — 100~500개2. RAG 변경 시 자동 평가3. 4-지표 dashboard4. 회귀 케이스는 사람 검수5. 사용자 피드백 (좋아요/싫어요) looplangsmith export ...)ragas evaluate --metric faithfulness --dataset trace.jsonl 실행prompt-version rollback(또는 동등) + Gold dataset에 부정 케이스 추가 + CI에 faithfulness < 0.8 fail 게이트 영구 추가| 기법 | 효과 발휘 범위 | 깨지는 조건 |
|---|---|---|
| Naive RAG | prototype, 명확한 작업 | production은 거의 항상 부족 — query transform 필요 |
| HyDE | query≠문서 표현 多 | query가 이미 문서와 유사 표현이면 비용↑·효과 X |
| Multi-Query (3~5) | recall 부족 | top-K 합집합으로 noise↑ → reranker 필수 |
| Decomposition | multi-hop·복합 질문 | 단순 질문엔 오버헤드 |
| Top-K=5~7 | lost-in-middle 회피 | K=10+ → 중간 정보 무시 (Liu 2023) |
| Hybrid (BM25+dense) | 일반 + 고유명사·법률·코드 | 순수 자연어 paraphrase는 dense만으로 충분 |
| Reranker (top-100→10) | recall@10 +10~30% | latency budget <50ms 환경엔 부적합 |
| Self-RAG | 검색 필요 여부 동적 판단 | overhead 多 → 단순 RAG로 충분한 경우 |
| Corrective RAG | 검색 실패 탐지·재검색 | judge 품질 낮으면 false positive로 refusal 증가 |
| GraphRAG | 글로벌 question (전체 전략) | 단일 문서 답변엔 비용 자릿수 증가 |
| Modular RAG | retriever 교체·조합 쉬움 | stage 계약·trace 없으면 장애 분석 어려움 |
| Long-context (1M) | 한 번에 모두 넣기 | 비용 1000× 이상 + lost-in-middle (RAG 우위) |
| 증상 | 정량 신호 | 원인 | 복구 |
|---|---|---|---|
| Permission leak | 다른 tenant 답변에 정보 누출 | metadata filter 누락 | tenant_id 필수 filter, audit log |
| Stale data | 검색 결과 옛 정보 (TTL >7일) | reindex 누락 | CDC + 임베딩 큐, soft delete + cleanup |
| Hallucination 빈발 | faithfulness <70% | 검색 부족 또는 prompt 약함 | ”근거 없으면 모른다” 강제, citation 필수 |
| Top-K 너무 큼 | lost-in-middle 정확도 ↓ | K>10 | K=5~7로 축소, reranker 필수 |
| Multi-language mismatch | 한국어 query 영어 문서 검색 X | dense 모델이 단일 언어 | 다국어 임베딩(BGE-M3, voyage-3-large) |
| Reranker 누락 | top-10 정확도 30%↓ | bi-encoder만 사용 | cross-encoder rerank 도입 |
| Query mismatch | recall@10 < 50% | 사용자 표현 ≠ 문서 표현 | HyDE·Query rewriting |
정량 비교는 위의 선택 카드에 운영 숫자를 붙여 확인한다. RAG는 검색+생성 호출당 대략 $0.001부터 시작하지만 검색 latency가 추가되고, 1M long-context는 $1~10 단위 prefill 비용과 lost-in-the-middle 위험이 붙는다. Fine-tune은 호출당 비용이 낮아질 수 있지만 재학습 비용과 출처 부재가 남는다.
RAG = “외부 KV store + 프로세서”. 다른 시스템 패턴.
| RAG 구성요소 | 일반 시스템 매핑 |
|---|---|
| Retrieval | DB SELECT, search query, cache lookup |
| Augmentation (context 주입) | template rendering, dynamic config injection |
| Generation (답변) | response synthesis, materialized view |
| Faithfulness 강제 | data validation, contract test |
| Citation | provenance tracking, audit trail |
| Multi-hop | DB join, dependency graph traversal |
| GraphRAG | knowledge graph DB, relation traversal |
| Self-RAG | adaptive query (cost-based optimizer) |
일반 공식: “검색 + 컨텍스트 주입 + 합성”의 3단계가 데이터·코드·문서·검색 시스템 전반에 동일하게 나타난다.
상황: 사내 정책 RAG 챗봇 운영 중. 사용자 부정 피드백 30%↑ 감지.진단: 1. Trace 분석: 검색 결과는 정확 (recall@10 0.85 유지) 2. Faithfulness 점수 측정 (Ragas): 0.6 → 0.4 (폭락) 3. 답변 분석: documents에 없는 정보 자주 답함 → Faithfulness 회귀
원인 추적: - 시스템 prompt에서 "documents에 없으면 모른다" 문구 누락 (직전 prompt 변경 시 사고)
복구: 1. 즉시 rollback (이전 prompt 버전) 2. Gold dataset에 사용자 부정 피드백 케이스 50개 추가 3. Faithfulness CI 게이트 추가 (Ragas 자동 평가)
대안 비선택: - LLM 변경 (회귀 원인 아니라 prompt) X - Top-K 변경 (검색은 정상) X§3.5 augmentation + §3.6 faithfulness + §3.10 silent failure + §3.12 정량 신호 모두 적용.
플랫폼 엔지니어가 RAG를 운영할 때 다음에 도움된다.
| 개념 A | 개념 B | 차이점 |
|---|---|---|
| Naive RAG | Advanced RAG | 단순 검색 vs query transform·rerank·self-RAG·multi-hop |
| Multi-Query | HyDE | query 변형 N개 vs 가상 답변 임베딩 |
| Query Rewriting | Decomposition | 키워드 보강 vs sub-question 분해 |
| Semantic search | Hybrid search | dense만 vs dense + BM25 |
| Bi-encoder | Cross-encoder rerank | 빠른 1차 vs 정확한 2차 |
| Faithfulness | Answer Relevance | 문서에 근거 vs 질문에 답 |
| Context Precision | Context Recall | 검색된 것 중 관련 비율 vs 정답에 필요한 것이 검색됨 |
| RAG | Long-context | 외부 검색 vs 모두 prompt에 |
| RAG | Fine-tune | 검색 기반 지식 vs 가중치에 학습 |
| GraphRAG | Vector RAG | entity·관계 그래프 vs 임베딩 vector |
최종 수정: 2026-05-21