1. 서론
검색 증강 생성(RAG, Retrieval-Augmented Generation)은 대규모 언어모델에 외부 지식 검색을 결합해 사실성, 최신성, 신뢰성을 강화하는 방법이다. 기본 구조는 검색기(Retriever)와 생성기(Generator)로 나뉘며, 검색된 문서를 생성기의 입력으로 활용한다. 최근 1~2년간 연구에서는 이 구조를 어떻게 설계·통합하느냐에 따라 다양한 혁신이 등장했다.
2. 주요 모델별 구조
2.1 Atlas – 검색 통합 사전학습
Atlas는 검색기를 사전학습 단계부터 모델에 통합한 구조가 특징이다. 검색된 문서를 개별적으로 인코딩한 뒤, 디코더에서 교차 어텐션으로 융합하는 Fusion-in-Decoder(FiD) 방식을 사용한다. 이를 통해 소수 샘플 학습 환경에서도 대규모 파라미터 모델을 능가하는 성능을 보였다. 또한 지식베이스 업데이트만으로 최신 지식을 반영할 수 있다는 점에서 지식 업데이트 용이성이 크다.
2.2 RePlug – 블랙박스 LLM 보강
RePlug는 기존 거대 언어모델을 수정하지 않고 외부 검색 모듈을 프롬프트 전처리 형태로 붙이는 방식이다. 모델 구조를 바꾸지 않고도 검색 증강이 가능하다는 점에서 실용적이다. 특히 검색기를 언어모델의 출력 확률을 기준으로 최적화해, 모델이 더 정확한 답변을 낼 수 있도록 조율한다. 이는 LLM API 환경에서 특히 유효하다.
2.3 ColBERTv2 – 토큰 단위 검색과 효율성
ColBERTv2는 질의·문서 토큰 간의 세밀한 매칭을 기반으로 한 다중 벡터 검색기 구조다. 단어 단위 유사도 계산으로 검색 품질을 크게 높였으나, 초기 버전은 메모리 부담이 컸다. v2에서는 벡터 압축과 노이즈 제거 학습을 통해 인덱스 크기를 줄이고 정확도를 높여, RAG의 검색 성능과 효율성을 동시에 개선했다.
2.4 HyDE – 가상 문서 기반 검색
HyDE는 LLM이 질의에 대한 가상 문서를 먼저 생성하고, 이를 임베딩해 실제 문서를 검색하는 방식이다. 이렇게 생성된 가상의 문서가 질의 의미를 풍부하게 담고 있어 검색 성능이 높아진다. 별도의 지도 데이터 없이도 강력한 성능을 보이며, 새로운 도메인에서도 유연하게 적용 가능하다.
2.5 FiD – 다중 문서 융합의 표준
Fusion-in-Decoder(FiD)는 여러 문서를 개별 인코딩 후 디코더에서 융합하는 구조다. 디코더가 모든 문서를 토큰 수준에서 동시에 참고할 수 있어 효과적인 정보 통합이 가능하다. 이후 등장한 다양한 RAG 모델들은 대부분 FiD를 기반으로 확장되었으며, 현재는 사실상 생성부의 표준 구조로 자리잡았다.
이번 글에서는 최신 RAG 연구 중 실용성과 구조적 혁신을 보여준 두 가지 접근을 살펴보겠다:
- RePlug: 블랙박스 LLM을 수정하지 않고 검색 기능을 덧붙이는 방식
- ColBERTv2: 토큰 단위 매칭을 활용해 검색 정확도를 극대화한 다중 벡터 검색기
3. RePlug – 블랙박스 LLM 보강
3.1 아이디어
RePlug의 핵심은 “LLM을 건드리지 않고 검색기를 외부에서 붙인다”이다.
즉, GPT-3, Claude 같은 API 기반 모델에도 적용할 수 있다는 점에서 실용적이다.
- 검색기(Retriever)가 문서를 찾아옴
- 이 문서를 프롬프트 앞부분에 단순히 붙여 LLM에 전달
- LLM이 문맥을 바탕으로 답변 생성
3.2 구조 그림
[사용자 질문] → [검색기] → (관련 문서 n개)
↓
[검색 문서 + 질문 → 프롬프트 구성]
↓
[LLM 출력]
3.3 코드 예시 (Hugging Face 기반)
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
import faiss, torch
# 예시: 검색기와 생성기 준비
tokenizer = AutoTokenizer.from_pretrained("facebook/bart-base")
model = AutoModelForSeq2SeqLM.from_pretrained("facebook/bart-base")
# 단순 검색 결과 (예: FAISS에서 top-k)
retrieved_docs = [
"문서1: RePlug은 LLM을 수정하지 않고 검색을 붙이는 방법이다.",
"문서2: LM-Supervised Retrieval을 통해 검색기를 최적화한다."
]
query = "RePlug은 어떻게 LLM을 강화하나요?"
prompt = "다음 문서를 참고해 답하라:\n" + "\n".join(retrieved_docs) + "\n\n질문: " + query
inputs = tokenizer(prompt, return_tensors="pt")
outputs = model.generate(**inputs, max_length=128)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
4. ColBERTv2 – 토큰 단위 검색
4.1 아이디어
전통적인 dense retriever(DPR)는 문서 하나를 하나의 벡터로 표현
반면 ColBERT는 문서를 토큰 단위로 여러 벡터로 표현하고, 질문-문서 토큰 간 상호작용을 통해 점수를 계산
- 더 세밀한 매칭 가능 (부분 일치, 구문 단위 매칭 등)
- 검색 품질이 DPR보다 높음
ColBERTv2는 여기에 효율화 기법을 더한다:
- 벡터 압축 → 인덱스 크기 6~10배 축소
- 노이즈 제거 학습 → 더 정확한 랭킹
4.2 구조 그림
×
[문서] (토큰 임베딩 d1, d2, d3, …)
→ 각 q_i 와 d_j 간 유사도 계산
→ 최대값 집계(MaxSim) 후 평균
→ 최종 문서 점수 산출
4.3 코드 예시 (PyTorch 스타일)
import torch
import torch.nn.functional as F
# q: [num_query_tokens, dim]
# d: [num_doc_tokens, dim]
def colbert_score(q, d):
# 모든 q_i × d_j 유사도 행렬 (cosine similarity)
sim = torch.matmul(F.normalize(q, dim=-1), F.normalize(d, dim=-1).T)
# 각 질의 토큰 q_i에 대해 가장 높은 매칭 점수 선택
max_sim, _ = sim.max(dim=1)
# 평균값을 문서 점수로 사용
return max_sim.mean().item()
# 예시
q = torch.randn(5, 128) # 질의 토큰 5개
d = torch.randn(20, 128) # 문서 토큰 20개
print("ColBERT 점수:", colbert_score(q, d))
- RePlug는 “서비스 환경에서 바로 쓸 수 있는 실용형 RAG”
- ColBERTv2는 “검색 모듈 자체를 정교화한 고성능형 RAG”
5. 새로운 연구 방향
- 멀티홉·계층적 검색: 복잡한 질문을 단계적으로 쪼개어 검색하는 구조. LLM이 스스로 검색 계획을 세우는 에이전트적 접근으로 발전 중이다.
- 사전학습 단계 검색 통합: 언어모델을 훈련할 때부터 검색 단계를 포함시켜, 파라미터 수를 줄이면서도 대규모 모델에 필적하는 성능을 달성.
- Differentiable Retrieval: 검색을 미분 가능한 형태로 바꾸어, 모델이 문서를 직접 선택·생성하도록 시도.
- 하이브리드 검색: 텍스트 외에도 지식 그래프, 데이터베이스 질의(SQL) 등 다양한 지식원을 함께 활용하는 방향으로 확장.
'공부하는 습관을 들이자' 카테고리의 다른 글
| VLM이란 무엇인가....? (0) | 2025.09.28 |
|---|---|
| LLM 평가·벤치마크 : PoC에서 무엇을 기준? (0) | 2025.09.14 |
| #공부일지 1_1. Introduction to Machine Learning in Production (Coursera) (0) | 2022.11.16 |
| XGBoost vs Randomforest (0) | 2022.06.29 |
| [Dacon study] 2. 타이타닉 생존자 예측 (0) | 2022.02.19 |