LLM은 강력하지만, 혼자서는 해결하기 어려운 근본적인 한계가 있습니다.
학습 데이터에 없는 내용도 그럴듯하게 지어냅니다. 사실 확인 없이 자신감 있게 틀린 답을 생성하는 것이 LLM의 가장 큰 약점입니다.
학습 데이터의 컷오프 날짜 이후의 정보를 모릅니다. 어제 나온 뉴스, 최신 API 변경사항, 실시간 데이터에 접근할 수 없습니다.
회사 내부 문서, 의료/법률 전문 지식 등 비공개 데이터에 대해서는 답변할 수 없습니다. 파인튜닝은 비용과 시간이 큽니다.
답변의 근거를 제시하지 못합니다. "어디서 이 정보를 가져왔나요?"에 답할 수 없어서, 신뢰성 검증이 어렵습니다.
Retrieval-Augmented Generation — "검색으로 보강된 생성".
LLM이 답변을 만들기 전에 관련 문서를 검색해서 참고하는 방식입니다.
클로즈드북 시험
머릿속 기억에만 의존
오픈북 시험
참고 자료를 보면서 답변
텍스트를 숫자 벡터로 변환하는 것. "고양이"와 "cat"은 의미가 비슷하므로 벡터 공간에서 가까이 위치합니다. 이를 통해 키워드가 아닌 의미 기반 검색이 가능해집니다.
임베딩 벡터를 저장하고, 유사도 검색을 빠르게 수행하는 특수 DB. 질문의 벡터와 가장 가까운 문서 벡터를 찾아 반환합니다.
키워드 매칭이 아닌 의미의 유사성으로 검색. "연봉 인상 방법"으로 검색하면 "급여 협상 전략"도 찾을 수 있습니다. 코사인 유사도로 벡터 간 거리를 측정합니다.
RAG-Sequence와 RAG-Token 두 가지 변형을 제안. DPR(Dense Passage Retrieval)로 검색하고 BART로 생성. NeurIPS 2020에서 발표되어 RAG 연구의 시작점이 되었습니다.
RAG는 3세대에 걸쳐 발전해 왔습니다. 각 세대가 이전의 한계를 어떻게 극복하는지 살펴봅니다.
고정된 파이프라인. Query → Retrieve → Generate. 단순하지만 한계가 명확합니다.
Query → Retrieve → Generate
검색 전/중/후를 최적화. 쿼리 리라이팅, 하이브리드 검색, 리랭킹 등을 추가합니다.
Query 최적화 → Hybrid Retrieve → Rerank → Generate
모듈 단위 조합. 라우터, 평가기, 반복 검색 등을 태스크에 맞게 동적으로 구성합니다.
Router → [동적 모듈 조합] → 자체 평가 → 반복/완료
가장 기본적인 "Retrieve → Read" 파이프라인. RAG의 출발점이지만, 한계가 분명합니다.
검색 품질이 낮으면 응답도 함께 망가집니다. 관련 없는 문서가 검색되면 LLM은 그걸 기반으로 엉뚱한 답을 만듭니다.
고정 크기로 문서를 자르면 문맥이 잘리거나, 하나의 청크에 여러 주제가 섞여 노이즈가 됩니다.
검색된 문서가 질문과 관련 없어도 그대로 LLM에 전달합니다. 필터링이나 품질 평가가 없습니다.
중복 문서, 서로 모순되는 정보에 대한 처리 로직이 없어서 LLM이 혼란에 빠질 수 있습니다.
Naive RAG의 한계를 검색 전/중/후 각 단계에서 체계적으로 보완합니다.
사용자 질문을 검색에 유리한 형태로 변환합니다. 구어체 → 검색 쿼리, 복합 질문 → 단일 질문 분리 등.
Hypothetical Document Embeddings — LLM이 먼저 가상의 답변을 생성하고, 그 답변의 임베딩으로 검색합니다. 질문보다 답변이 문서와 더 유사하다는 통찰.
하나의 질문을 여러 관점에서 확장해서 검색 범위를 넓힙니다. Multi-Query, Sub-Question Decomposition 등의 기법이 있습니다.
고정 크기가 아닌 의미 단위로 문서를 분할합니다.
각 청크에 문서 수준의 맥락을 접두사로 추가한 뒤 임베딩합니다. "이 청크는 2024년 매출 보고서의 3분기 실적 섹션에서 발췌한 내용입니다" 같은 맥락 정보를 붙여서 검색 정확도를 크게 향상시킵니다.
문서에 날짜, 출처, 카테고리, 작성자 등 부가 정보를 부착합니다. 필터링과 결합하면 검색 정밀도가 크게 올라갑니다.
Dense(벡터) 검색과 Sparse(BM25 키워드) 검색을 결합합니다. 의미 유사성 + 키워드 정확성을 동시에 잡아 가장 안정적인 성능을 제공합니다.
도메인 특화 데이터로 임베딩 모델을 추가 학습합니다. 일반 모델 대비 12~30% 성능 향상이 보고됩니다. 의료, 법률, 금융 등 전문 도메인에서 효과가 큽니다.
요약 인덱스, 원문 인덱스, 메타데이터 인덱스 등을 계층화합니다. 요약으로 먼저 관련 문서를 좁히고, 원문에서 세부 정보를 가져오는 방식.
토큰별 임베딩을 저장하고 MaxSim 연산으로 유사도를 계산합니다. Bi-Encoder의 속도와 Cross-Encoder의 정확도 사이에서 좋은 균형을 잡습니다. ColPali/ColQwen은 이를 멀티모달로 확장.
검색 결과를 Cross-Encoder로 다시 평가해서 순위를 재조정합니다. 질문-문서 쌍을 함께 보기 때문에 더 정밀한 관련성 판단이 가능합니다.
MAP(Mean Average Precision) 52% 향상 보고 — Cohere Rerank, bge-reranker, FlashRank 등
검색된 문서에서 관련 있는 부분만 추출해서 컨텍스트 윈도우를 절약합니다. LongLLMLingua 등의 방식으로 핵심 문장만 남깁니다.
유사도 임계값, MMR(Maximal Marginal Relevance) 등으로 중복 문서를 제거하고 다양성을 확보합니다.
파이프라인을 고정된 순서가 아닌 모듈 단위로 분리해서 태스크에 맞게 조합하는 패러다임입니다.
질문 유형을 판단해서 검색이 필요한지, 어떤 소스를 쓸지 결정합니다. 단순 질문은 바로 LLM 생성으로.
검색 결과가 충분한지 평가합니다. 부족하면 재검색을 트리거하거나 다른 소스로 전환합니다.
LLM이 스스로 "지금 검색이 필요한 시점인가?"를 판단합니다. 불필요한 검색을 줄여 효율성을 높입니다.
벡터 DB, 웹 검색, SQL DB, API 등 여러 소스를 동적으로 선택합니다.
한 번이 아니라 여러 차례 검색-생성을 반복하며 답변을 정제합니다.
이전 대화나 검색 이력을 활용해서 맥락을 유지합니다.
LLM이 Reflection Token으로 검색 필요 여부, 문서 관련성, 응답 품질을 자체 판단합니다.
검색 결과를 Correct / Incorrect / Ambiguous로 분류 후, 각각 다른 보정 경로를 선택합니다.
문서 정제 후 생성
웹 검색으로 대체
문서 + 웹 검색 결합
지식 그래프를 구축해서 엔티티 간 관계 기반 검색을 수행합니다. 여러 문서에 흩어진 정보를 연결하는 "글로벌 질문"에 강점.
재귀적 트리 요약 — 문서 청크를 클러스터링하고 요약하는 과정을 반복해서 다단계 추상화 트리를 만듭니다.
AI Agent가 검색을 도구로 사용하면서 계획-실행-반성 루프를 돌리는 방식입니다.
복잡한 멀티스텝 질문에 효과적입니다.
검색 전문 에이전트, 요약 에이전트, 평가 에이전트 등 역할별로 분리된 에이전트들이 협력합니다. 모달리티별 전문가 에이전트(텍스트, 이미지, 테이블 등)를 둘 수도 있습니다.
벡터 검색 외에도 웹 검색, SQL 쿼리, 계산기, 코드 실행 등 다양한 도구를 상황에 맞게 선택해서 사용합니다.
모든 질문에 검색하지 않습니다. 질문 복잡도를 판단해서 단순 질문은 즉시 답변, 복잡한 질문만 멀티스텝 검색을 수행합니다.
작은 전문가 모델이 여러 개의 초안(draft)을 병렬로 생성하고, 큰 범용 모델이 이를 검증하는 방식. Draft-then-Verify 패턴으로 정확도와 지연시간 모두 개선합니다.
RAG 시스템의 품질을 어떻게 측정할까요? 검색과 생성을 분리해서 각각 평가합니다.
응답이 검색된 문서에 충실한가? 지어낸 내용 없이 문서 내용만으로 답변하는지 측정합니다.
충실도 = 문서로 뒷받침되는 주장 수 / 전체 주장 수
응답이 질문에 적절한가? 질문과 관련 없는 내용이 답변에 포함되지 않았는지 평가합니다.
관련도 = 응답에서 생성된 질문과 원래 질문의 유사도 평균
검색된 문서가 정밀한가? 관련 없는 문서가 너무 많이 포함되지 않았는지 확인합니다.
정밀도 = 관련 문서 수 / 검색된 전체 문서 수
필요한 문서를 빠짐없이 검색했는가? 정답에 필요한 정보가 모두 검색 결과에 포함되었는지 봅니다.
재현율 = 검색된 관련 문서 수 / 전체 관련 문서 수
가장 대표적인 오픈소스 평가 프레임워크. Faithfulness, Relevancy, Context Precision/Recall 등 핵심 메트릭을 자동으로 계산합니다.
오픈소스CI/CD 파이프라인에 통합 가능한 유닛 테스트 스타일 평가. pytest처럼 RAG 평가를 자동화합니다.
CI/CD 통합프로덕션 환경에서 실시간 모니터링. 피드백 함수로 지속적인 품질 추적이 가능합니다.
프로덕션 모니터링12개 도메인에 걸친 100K+ 예제 벤치마크. 산업별 RAG 성능 비교에 활용됩니다.
벤치마크RAG 시스템을 실무에 적용할 때의 권장 사항과 로드맵입니다.
기본 파이프라인 구축. 고정 크기 청킹 + 단순 벡터 검색 + LLM 생성. 빠르게 가치를 증명하는 것이 목표.
BM25 + Dense 하이브리드 검색 도입. Reranker 추가. 이것만으로도 상당한 품질 향상을 볼 수 있습니다.
Recursive/Semantic 청킹 적용. Contextual Retrieval로 청크에 맥락 추가. 메타데이터 태깅.
RAGAS 등으로 자동 평가 파이프라인 구축. 정량적 메트릭으로 개선 효과를 측정합니다.
멀티스텝 질문, 멀티소스 시나리오가 필요할 때. 라우터, 반복 검색, 에이전트 패턴 도입.
| 전략 | 방식 | 장점 | 단점 | 추천 상황 |
|---|---|---|---|---|
| Fixed-size | 고정 토큰 수로 분할 | 구현 간단, 예측 가능 | 문맥 단절 | 빠른 프로토타입 |
| Recursive | 구분자 계층으로 재귀 분할 | 안정적 (69% 승률) | 구분자 설정 필요 | 범용 (기본 추천) |
| Semantic | 의미 변화 지점에서 분할 | 높은 재현율 | 조각이 너무 작을 수 있음 | 다주제 문서 |
| Parent-Child | 작은 청크로 검색, 큰 청크 반환 | 정밀 검색 + 풍부한 컨텍스트 | 인덱스 복잡도 증가 | 긴 문서, 보고서 |
| Sentence Window | 문장 단위 + 주변 문장 | 문장 수준 정밀도 | 짧은 문서엔 비효율 | FAQ, 매뉴얼 |
청크 크기는 256~512 토큰이 가장 안정적. 너무 작으면 맥락 부족, 너무 크면 노이즈 증가.
LLM을 바꾸기 전에 검색 품질을 올리세요. 같은 모델에서 검색만 개선해도 50%+ 정확도 향상 가능.
평가 파이프라인을 먼저 만들고, 변경할 때마다 메트릭을 비교하세요. 감이 아닌 데이터로 결정.
한 번 만들고 끝이 아닙니다. KPI를 설정하고 지속적으로 개선하세요. 문서 업데이트, 모델 교체, 파이프라인 조정.
RAG 연구의 핵심 논문들을 시간순으로 정리했습니다.
DPR + BART 결합. RAG-Sequence, RAG-Token 두 변형 제안. RAG 연구의 시작점.
밀집 벡터 기반 문서 검색의 표준. 기존 TF-IDF/BM25를 뛰어넘는 시맨틱 검색 실현.
질문 대신 가상 답변을 생성해서 검색. Zero-shot에서도 Fine-tuned 모델 수준의 검색 성능 달성.
Reflection Token으로 검색 필요 여부, 문서 관련성, 응답 품질을 LLM이 자체 판단.
검색 결과를 Correct/Incorrect/Ambiguous로 분류 후 보정 경로 선택. 19~37% 정확도 향상.
재귀적 클러스터링 + 요약으로 다단계 추상화 트리 구축. QuALITY에서 +20% 향상.
지식 그래프 + 계층적 커뮤니티 요약. 여러 문서에 걸친 글로벌 질문에 강점.
청크에 문서 수준 맥락을 접두사로 추가. BM25와 결합 시 검색 실패율 67% 감소.
질문 복잡도에 따라 No Retrieval / Single-step / Multi-step을 동적으로 선택.
전체 문서를 먼저 임베딩 → 토큰 벡터에서 청크 추출. 추가 LLM 비용 없이 문맥 보존. jina-v3에서 API 지원.
RAG + Fine-tuning 결합. 방해 문서를 무시하도록 학습. 전문 도메인에서 순수 RAG보다 높은 성능.
비라벨 코퍼스에서 자체 QA 쌍 생성 + self-training. 라벨링 비용 없이 도메인 적응. 11개 데이터셋 검증.
AI 모델과 외부 도구/데이터를 연결하는 오픈 표준 프로토콜. Agentic RAG의 도구 통합을 표준화.
RAG → Context Engineering으로 패러다임 확장. RAG(정적 지식) + Memory(동적 이력) + MCP(도구 연결)를 통합하는 Knowledge Runtime 개념 등장.