AI 에이전트 구축Building AI Agents
Chapter 05 · Retrieval-Augmented Generation

RAG — 검색 증강 생성으로 환각을 막다

LLM의 지식은 학습 시점에 결정화된다. 그리고 모델은 그럴듯한 거짓을 지어낸다. RAG는 모델에게 바깥의 기억을 빌려준다.

RAG 인덱싱 · 검색 · 생성 청킹 · 임베딩 벡터 데이터베이스

Section 01왜 RAG인가

LLM에는 의학 같은 민감한 분야에 배포하기 어려운 두 가지 한계가 있다 — 구식 지식과 환각이다.

첫째, LLM의 지식은 학습 시점에 결정화된다. 의료처럼 빠르게 발전하는 분야에서는 이 지식이 금세 낡는다. 둘째, LLM은 환각(hallucination)한다 — 사실상·개념상 오류가 든 답변을 생성한다.

직관 — 왜 환각하는가 LLM은 개념 설명에는 강하지만 특정 정보 유지에는 약하다. 학습 중 개념 지식은 비슷한 정보의 반복으로 강화되지만, 날짜·숫자값·드문 정보는 그렇지 못하다. 또한 데이터셋에는 충돌하는 올바른·잘못된 정보가 섞여 있다. 모델이 응답할 때 분포에서 샘플링하므로 환각이 생긴다. 온도를 높이면 더 심해진다.

해결책으로 프롬프트에 맥락을 직접 넣거나 미세조정을 할 수 있다. 하지만 전자는 사용자가 매번 맥락을 찾아야 하고, 후자는 비싸며 새 문서가 올 때마다 반복해야 한다. 2020년 Meta가 대안을 제안했다 — RAG(Retrieval-Augmented Generation).

Concept 검색 증강 생성 (RAG)

외부 소스(데이터베이스)에서 맥락을 검색해 LLM의 생성을 증강하는 프레임워크. 이 데이터베이스는 도메인별일 수 있고 지속적으로 업데이트된다.

LLM의 사전 학습 지식을 매개변수적 메모리(parametric memory), RAG로 얻은 지식을 비매개변수적 메모리(non-parametric memory)라 부른다. RAG는 LLM의 강력한 문맥 내 학습 능력을 활용한다.

가장 단순한 검색기는 1장에서 본 BoW나 TF-IDF다. BM25는 TF-IDF의 변형으로, 문서 길이 정규화를 제어하는 b와 TF 포화도를 제어하는 k 두 매개변수를 더한다(권장값 b=0.75, k=1.2~2). 하지만 BM25는 용어 빈도 기반이라 의미를 포착하지 못하고, 어휘 불일치 문제 — 쿼리와 문서의 용어가 겹치지 않는 경우 — 에 시달린다. 해결책은 트랜스포머로 만든 의미를 담은 밀집 벡터다.

Section 02RAG 파이프라인

가장 기본적인 형태의 RAG는 세 부분으로 이루어진다.

Motion · RAG 파이프라인 STEP 01 / 6
space 재생 · → 다음 · R 리셋
Concept RAG의 세 단계

① 인덱싱(Indexing) — 원본 데이터(PDF·HTML·Markdown·XML)를 수집해 텍스트로 변환하고, 임베딩 모델의 컨텍스트 길이보다 작은 청크로 나눈다. 청크를 임베딩(벡터로 변환)하고 식별자를 붙여 벡터 데이터베이스에 저장한다.

② 검색(Retrieval) — 쿼리가 오면 같은 인코더로 쿼리 벡터를 만들고, 데이터베이스 벡터들과의 유사성 점수를 계산해 상위 K개 청크를 고른다.

③ 생성(Generation) — 찾은 청크와 쿼리를 일관된 프롬프트로 합쳐 LLM에 넣고 답변을 생성한다.

RAG — 자기회귀 생성식의 확장
p(x1…xn) = Πi p(xi | Pr ; R ; q ; x<i)
Pr 프롬프트 · R 검색된 맥락 · q 사용자 질문 · x<i 이전 토큰들. 2장의 자기회귀식에 R(검색 맥락)이 추가된 형태다.

맥락 임베딩 — 단일 인코더와 이중 인코더

밀집 벡터는 트랜스포머로 문서의 표현을 추출해 만든다. 단일 인코더[CLS]-쿼리-[SEP]-문서 형식으로 둘을 함께 넣어 모든 토큰이 상호작용하게 한다 — 정확하지만 전체 코퍼스를 쿼리와 함께 통과시켜야 해 비싸다.

이중 인코더(bi-encoder)는 쿼리용·문서용 두 인코더로 따로 표현을 추출한다. 코퍼스의 모든 문서 임베딩을 미리 데이터베이스에 저장해두고, 쿼리가 오면 코사인 유사성만 계산한다. 훨씬 빠르지만, 쿼리·문서 용어 간 상호작용이 없어 덜 정확하다.

함정 — 악성 차원 문맥 임베딩에는 이방성(anisotropy)이 있다. 무작위 단어를 골라도 코사인 유사성이 예상보다 높게 나온다. 몇 개의 악성 차원(rogue dimensions)이 비정상적으로 큰 분산을 차지하기 때문이다. 이 차원들은 절대 위치·구두점과 상관되어 정보가 없다. z-점수 정규화 같은 변환이 이 문제를 줄인다.

Section 03청킹 전략

텍스트를 어떻게 청크로 나누느냐는 검색·생성 품질에 결정적이다.

핵심 — 청크 크기의 딜레마 너무 작은 청크는 맥락을 잃는다. 너무 청크는 관련 없는 정보를 끌어와 검색·생성 품질을 모두 해치고, 추론 비용을 늘리며, 과도한 맥락은 환각을 유발한다. 또한 청크 크기는 임베더의 컨텍스트 길이를 넘어선 안 된다 — 넘으면 정보가 잘린다(truncation).
청킹 전략 분류
전략방식특징
문자/토큰 청킹고정 길이(100~256 토큰)로 분할가장 저렴·단순, 맥락 파괴 위험
슬라이딩 윈도우청크 간 겹침을 유지경계 맥락 보존, 더 비쌈
맥락 인식 청킹정규표현식·문장·문단 기준 분할구조 존중, 경계 결정이 어려움
재귀적 청킹맥락 인식 후 토큰 한도까지 결합의미 일관성 유지
계층적 클러스터링섹션·하위섹션·문단 계층 존중구조 명확한 문서(논문·보고서)에 유용
의미론적 청킹임베딩 유사성으로 그룹화(K-평균 등)최적 결과 가능, 계산 비용 큼

보편적으로 최고인 청크는 없다. 다만 지침은 있다 — 청킹을 문서 구조에 맞추고, 성능·리소스 제약에 따라 최적화하며, 임베딩 모델과 생성 LLM의 컨텍스트 한도를 존중하고, 예상 사용자 쿼리 패턴에 맞춘다. 사용자가 단편적 사실을 물으면 작은 청크가, 담론적이면 큰 청크가 낫다.

Section 04임베딩과 벡터 DB

임베더의 선택은 시스템 성능에 강하게 영향을 준다. 잘못된 임베더는 형편없는 검색으로, 쿼리와 무관한 맥락으로 이어져 역설적으로 환각 위험을 높인다.

밀집 인코더는 보통 BERT 기반 백본을 쓰며, 대조 학습(contrastive learning)으로 검색에 적응시킨다. 함축·모순 라벨이 달린 MultiNLI 같은 데이터셋에서 — 함축 문장은 양성 예시, 모순은 음성 예시 — 원본 문장 임베딩을 양성에 가깝게, 음성에서 멀게 학습한다(코사인 유사성 손실, 복수 부정 순위 손실).

Concept 임베딩 압축 — 양자화와 마트료시카

이진 양자화 — 차원당 1비트로 줄여 메모리·스토리지를 최대 32배 절감한다. 정교한 버전은 최대 96% 유사성을 유지한다. 더 온건한 타협은 float32 → int8(256 레벨)이다.

마트료시카 표현 학습 — 가장 중요한 정보를 초기 차원에 강제로 저장하고 덜 중요한 정보를 나중 차원에 둔다. 작은 임베딩이 큰 임베딩의 부분집합이 되어, 성능을 유지하면서 벡터를 잘라낼 수 있다.

벡터 데이터베이스

벡터 데이터베이스는 고차원 벡터의 효율적 저장·인덱싱·검색에 특화된 데이터베이스다. 선택 기준은 오픈/비공개 소스, 언어 지원, 성숙도, 성능(삽입 속도·쿼리 속도), 구성 요소 통합, 비용이다.

  • 벡터 라이브러리(FAISS) — 인덱스가 변경 불가능(immutable). CRUD가 필요 없는 정적 시스템에 적합.
  • 벡터 지원 SQL DB — 기존 엔터프라이즈 DB 통합에 좋지만 확장성·성능이 낮다.
  • 벡터 전용 DB — 보통 최고. ANN(Approximate Nearest Neighbors) 변형 알고리즘을 쓴다. HNSW는 정확한 Flat 인덱싱보다 정확도를 약간 희생하지만 훨씬 빠르다.

Section 05검색 결과 평가

RAG 시스템이 얼마나 좋은지 측정해야 한다. 정보 검색의 고전적 지표는 정밀도와 재현율이다.

Precision & Recall
Precision = Rq / Dq     Recall = Rq / R
Rq 검색된 관련 문서 수 · Dq 시스템이 반환한 전체 문서 수 · R 코퍼스의 모든 관련 문서 수.

이 두 지표는 순위의 좋음을 반영하지 못한다. 순위를 고려하는 지표가 필요하다 — MAP(평균 정밀도)는 관련 항목이 검색되는 지점마다 정밀도를 계산해 평균하고, MRR(평균 역수 순위)은 첫 관련 항목 순위의 역수를 평균한다.

Motion · 순위별 정밀도·재현율 STEP 01 / 5
space 재생 · → 다음 · R 리셋

LLM을 심판으로

최근에는 LLM을 RAG 파이프라인의 심판으로 쓴다. 진실(ground truth)이 든 데이터셋을 두고 LLM이 평가한다.

  • 신뢰성(Faithfulness) — 생성된 답변의 주장이 맥락에서 추론될 수 있는 비율(0~1).
  • 맥락 재현율 — 진실 대비 검색된 맥락의 양.
  • 맥락 정밀도 — 검색된 맥락 중 진실과 관련된 항목.
  • 맥락 관련성 — 쿼리에 대한 맥락의 관련성.
핵심 RAG는 LLM에게 외부 기억을 빌려준다. 인덱싱·검색·생성 세 단계로, 구식 지식과 환각을 함께 다룬다. 청킹·임베딩·벡터 DB 선택이 성능을 좌우하고, 정밀도·재현율·MAP·MRR과 LLM 심판으로 평가한다. 하지만 나이브 RAG에는 여전히 약점이 많다 — 다음 장의 고급 RAG가 그 약점들을 하나씩 공략한다.