Section 01왜 RAG인가
LLM에는 의학 같은 민감한 분야에 배포하기 어려운 두 가지 한계가 있다 — 구식 지식과 환각이다.
첫째, LLM의 지식은 학습 시점에 결정화된다. 의료처럼 빠르게 발전하는 분야에서는 이 지식이 금세 낡는다. 둘째, LLM은 환각(hallucination)한다 — 사실상·개념상 오류가 든 답변을 생성한다.
해결책으로 프롬프트에 맥락을 직접 넣거나 미세조정을 할 수 있다. 하지만 전자는 사용자가 매번 맥락을 찾아야 하고, 후자는 비싸며 새 문서가 올 때마다 반복해야 한다. 2020년 Meta가 대안을 제안했다 — RAG(Retrieval-Augmented Generation).
외부 소스(데이터베이스)에서 맥락을 검색해 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는 세 부분으로 이루어진다.
① 인덱싱(Indexing) — 원본 데이터(PDF·HTML·Markdown·XML)를 수집해 텍스트로 변환하고, 임베딩 모델의 컨텍스트 길이보다 작은 청크로 나눈다. 청크를 임베딩(벡터로 변환)하고 식별자를 붙여 벡터 데이터베이스에 저장한다.
② 검색(Retrieval) — 쿼리가 오면 같은 인코더로 쿼리 벡터를 만들고, 데이터베이스 벡터들과의 유사성 점수를 계산해 상위 K개 청크를 고른다.
③ 생성(Generation) — 찾은 청크와 쿼리를 일관된 프롬프트로 합쳐 LLM에 넣고 답변을 생성한다.
맥락 임베딩 — 단일 인코더와 이중 인코더
밀집 벡터는 트랜스포머로 문서의 표현을 추출해 만든다. 단일 인코더는 [CLS]-쿼리-[SEP]-문서 형식으로 둘을 함께 넣어 모든 토큰이 상호작용하게 한다 — 정확하지만 전체 코퍼스를 쿼리와 함께 통과시켜야 해 비싸다.
이중 인코더(bi-encoder)는 쿼리용·문서용 두 인코더로 따로 표현을 추출한다. 코퍼스의 모든 문서 임베딩을 미리 데이터베이스에 저장해두고, 쿼리가 오면 코사인 유사성만 계산한다. 훨씬 빠르지만, 쿼리·문서 용어 간 상호작용이 없어 덜 정확하다.
Section 03청킹 전략
텍스트를 어떻게 청크로 나누느냐는 검색·생성 품질에 결정적이다.
| 전략 | 방식 | 특징 |
|---|---|---|
| 문자/토큰 청킹 | 고정 길이(100~256 토큰)로 분할 | 가장 저렴·단순, 맥락 파괴 위험 |
| 슬라이딩 윈도우 | 청크 간 겹침을 유지 | 경계 맥락 보존, 더 비쌈 |
| 맥락 인식 청킹 | 정규표현식·문장·문단 기준 분할 | 구조 존중, 경계 결정이 어려움 |
| 재귀적 청킹 | 맥락 인식 후 토큰 한도까지 결합 | 의미 일관성 유지 |
| 계층적 클러스터링 | 섹션·하위섹션·문단 계층 존중 | 구조 명확한 문서(논문·보고서)에 유용 |
| 의미론적 청킹 | 임베딩 유사성으로 그룹화(K-평균 등) | 최적 결과 가능, 계산 비용 큼 |
보편적으로 최고인 청크는 없다. 다만 지침은 있다 — 청킹을 문서 구조에 맞추고, 성능·리소스 제약에 따라 최적화하며, 임베딩 모델과 생성 LLM의 컨텍스트 한도를 존중하고, 예상 사용자 쿼리 패턴에 맞춘다. 사용자가 단편적 사실을 물으면 작은 청크가, 담론적이면 큰 청크가 낫다.
Section 04임베딩과 벡터 DB
임베더의 선택은 시스템 성능에 강하게 영향을 준다. 잘못된 임베더는 형편없는 검색으로, 쿼리와 무관한 맥락으로 이어져 역설적으로 환각 위험을 높인다.
밀집 인코더는 보통 BERT 기반 백본을 쓰며, 대조 학습(contrastive learning)으로 검색에 적응시킨다. 함축·모순 라벨이 달린 MultiNLI 같은 데이터셋에서 — 함축 문장은 양성 예시, 모순은 음성 예시 — 원본 문장 임베딩을 양성에 가깝게, 음성에서 멀게 학습한다(코사인 유사성 손실, 복수 부정 순위 손실).
이진 양자화 — 차원당 1비트로 줄여 메모리·스토리지를 최대 32배 절감한다. 정교한 버전은 최대 96% 유사성을 유지한다. 더 온건한 타협은 float32 → int8(256 레벨)이다.
마트료시카 표현 학습 — 가장 중요한 정보를 초기 차원에 강제로 저장하고 덜 중요한 정보를 나중 차원에 둔다. 작은 임베딩이 큰 임베딩의 부분집합이 되어, 성능을 유지하면서 벡터를 잘라낼 수 있다.
벡터 데이터베이스
벡터 데이터베이스는 고차원 벡터의 효율적 저장·인덱싱·검색에 특화된 데이터베이스다. 선택 기준은 오픈/비공개 소스, 언어 지원, 성숙도, 성능(삽입 속도·쿼리 속도), 구성 요소 통합, 비용이다.
- 벡터 라이브러리(FAISS) — 인덱스가 변경 불가능(immutable). CRUD가 필요 없는 정적 시스템에 적합.
- 벡터 지원 SQL DB — 기존 엔터프라이즈 DB 통합에 좋지만 확장성·성능이 낮다.
- 벡터 전용 DB — 보통 최고. ANN(Approximate Nearest Neighbors) 변형 알고리즘을 쓴다. HNSW는 정확한 Flat 인덱싱보다 정확도를 약간 희생하지만 훨씬 빠르다.
Section 05검색 결과 평가
RAG 시스템이 얼마나 좋은지 측정해야 한다. 정보 검색의 고전적 지표는 정밀도와 재현율이다.
이 두 지표는 순위의 좋음을 반영하지 못한다. 순위를 고려하는 지표가 필요하다 — MAP(평균 정밀도)는 관련 항목이 검색되는 지점마다 정밀도를 계산해 평균하고, MRR(평균 역수 순위)은 첫 관련 항목 순위의 역수를 평균한다.
LLM을 심판으로
최근에는 LLM을 RAG 파이프라인의 심판으로 쓴다. 진실(ground truth)이 든 데이터셋을 두고 LLM이 평가한다.
- 신뢰성(Faithfulness) — 생성된 답변의 주장이 맥락에서 추론될 수 있는 비율(0~1).
- 맥락 재현율 — 진실 대비 검색된 맥락의 양.
- 맥락 정밀도 — 검색된 맥락 중 진실과 관련된 항목.
- 맥락 관련성 — 쿼리에 대한 맥락의 관련성.