주제: 6-1 RAG 파이프라인 (Retrieval → Rerank → Generation)
문제 설정
LLM은 학습 데이터 이후의 정보를 알 수 없습니다. 또한 내부 파라미터만으로는 최신 정보나 기업 내부 데이터를 활용하기 어렵습니다.
이를 해결하기 위해 사용하는 구조가 RAG (Retrieval-Augmented Generation)입니다.
핵심 아이디어:
- 모델 내부 지식 + 외부 지식 결합
그래서 RAG를 이해할 때는 생성 모델보다 먼저 검색 시스템 관점이 필요하다. 질문과 관련 없는 문서를 가져오면 generation 단계가 아무리 좋아도 환각이 생기기 쉽다. 반대로 좋은 문서를 찾으면 답변 품질은 크게 좋아진다.
retrieval, rerank, generation을 구분하는 이유도 각 단계의 실패 원인이 다르기 때문이다. retrieval이 틀리면 근거 자체가 없고, rerank가 약하면 중요한 문서가 뒤로 밀리며, generation이 약하면 근거를 갖고도 설명을 못 만든다.
RAG 시스템은 보통 다음 3단계로 구성됩니다.
Query
↓
Retrieval
↓
Rerank
↓
Generation
시각 자료로 먼저 보기
1. Retrieval 단계
사용자 질문과 가장 관련 있는 문서를 검색합니다.
문서와 질문을 embedding 공간으로 변환합니다.
이 단계의 핵심은 질문과 문서를 같은 벡터 공간 위에 올려놓는 것이다. 그래야 의미가 비슷한 것들이 공간상에서도 가까워지고, nearest neighbor search로 빠르게 찾을 수 있다. 즉 retrieval은 단순 키워드 검색이 아니라 의미 기반 검색이다.
수식:
기호 의미
- f : embedding model
- q : query embedding
- d_i : document embedding
유사도 계산
보통 cosine similarity를 사용합니다.
왜 필요한가
수많은 문서 중 관련 문서 후보를 찾기 위함입니다.
주의점
retrieval은 정확도가 완벽하지 않습니다.
2. Rerank 단계
retrieval 결과 중 더 정확한 문서를 선택합니다.
일반적으로 cross-encoder 모델을 사용합니다.
score 계산:
기호 의미
- s_i : relevance score
왜 필요한가
embedding retrieval은 approximate search이기 때문에 noise가 존재합니다.
주의점
rerank는 계산 비용이 높습니다.
3. Generation 단계
최종 문서를 LLM에 입력하여 답을 생성합니다.
Prompt = Query + Retrieved Context
LLM 목표:
기호 의미
- context : retrieved documents
왜 필요한가
외부 지식을 기반으로 답을 생성합니다.
4. 전체 파이프라인
User Query
↓
Embedding
↓
Vector DB Search
↓
Top-k Documents
↓
Reranker
↓
Top-n Documents
↓
LLM Generation
5. Vector Search
retrieval 단계는 보통 vector database를 사용합니다.
대표 알고리즘:
- HNSW
- FAISS
- IVF
목표:
왜 중요한가
대규모 문서 검색을 빠르게 수행합니다.
6. Retrieval vs Rerank
| 단계 | 목표 | 모델 |
|---|---|---|
| Retrieval | 빠른 후보 검색 | embedding |
| Rerank | 정확한 정렬 | cross encoder |
7. RAG의 장점
- 최신 정보 활용 가능
- 기업 내부 데이터 활용
- hallucination 감소
8. RAG의 한계
- retrieval 오류 가능
- context window 제한
- latency 증가
코드-수식 연결
| 개념 | 코드 | 설명 |
|---|---|---|
| embedding | model.encode(query) |
query vector 생성 |
| vector search | faiss.search() |
유사 문서 검색 |
| rerank | cross_encoder.predict() |
문서 재정렬 |
| generation | llm.generate() |
답 생성 |
자주 하는 오해 5개
- RAG는 모델을 재학습한다고 생각한다
- retrieval만 있으면 정확한 답이 나온다고 생각한다
- vector search는 항상 정확하다고 생각한다
- RAG는 hallucination을 완전히 제거한다고 생각한다
- rerank 단계는 선택 사항이라고 생각한다
체크리스트 (스스로 설명 가능해야 하는 질문)
- RAG 시스템은 어떤 문제를 해결하는가?
- retrieval 단계에서 embedding은 어떻게 사용되는가?
- 왜 rerank 단계가 필요한가?
- LLM generation 단계에서 context는 어떤 역할을 하는가?
- vector search는 어떤 방식으로 동작하는가?