What is RAG? How Retrieval-Augmented Generation Works

개요

Retrieval-Augmented Generation (RAG)은 대규모 언어 모델(LLM)이 학습 시점 이후의 최신 데이터를 참조하여 정확하고 출처가 명확한 답변을 생성하도록 돕는 아키텍처 패턴입니다.

주요 내용

- RAG의 필요성: LLM은 학습된 데이터 내에서만 정보를 기억하며, 외부의 최신 데이터나 비정형 데이터에 접근하기 어렵습니다. 기존의 파인튜닝(fine-tuning) 방식은 비용이 많이 들고, 최신 정보 반영이 느리며, 출처를 명확히 하기 어렵다는 한계가 있습니다. RAG는 이러한 문제를 해결하기 위해 LLM의 파라미터에 지식을 저장하는 대신, 질의 시점에 관련 데이터를 검색하여 제공하는 방식을 사용합니다.
- RAG 아키텍처: RAG는 크게 세 단계로 구성됩니다.
1. Ingestion (데이터 수집 및 처리):
* Chunking: 원본 문서를 LLM이 검색하기 좋은 크기(일반적으로 수백 토큰)의 작은 단위(chunk)로 분할합니다. 컨텍스트 손실을 방지하기 위해 오버랩(overlap)을 적용합니다.
* Embedding: 각 chunk를 의미론적 표현을 담고 있는 벡터(vector)로 변환합니다. 의미가 유사한 chunk는 벡터 공간에서 가까이 위치하게 됩니다.
* Vector Database: 생성된 임베딩 벡터를 저장하고, 의미 기반의 유사도 검색을 효율적으로 수행할 수 있는 벡터 데이터베이스에 저장합니다.
2. Retrieval (관련 데이터 검색):
* 사용자 질문을 입력받아 동일한 임베딩 모델로 벡터화합니다.
* 벡터 데이터베이스에서 질문 벡터와 가장 유사한 상위 k개(top-k)의 chunk를 검색합니다. 이 과정은 검색(search) 문제로 간주되며, 검색 품질이 RAG 성능에 결정적인 영향을 미칩니다.
3. Generation (답변 생성):
* 검색된 chunk들을 시스템 지침 및 사용자 질문과 함께 LLM의 프롬프트(prompt)에 포함시킵니다.
* LLM은 제공된 chunk 내의 정보만을 기반으로 답변을 생성하도록 제약됩니다. 이로 인해 답변의 출처를 명확히 할 수 있으며(citation), 새로운 데이터가 추가되면 재처리(re-ingest)를 통해 최신 정보를 반영할 수 있습니다.
- 성능 측정 및 개선: RAG 시스템의 성능을 평가하기 위해 레이블이 지정된 평가 세트(labeled evaluation set)를 구축하고 검색 리콜(retrieval recall)을 측정하는 것이 중요합니다. 검색 리콜이 90% 이상으로 확보된 후에 프롬프트 튜닝을 진행하는 것이 효과적입니다.
- RAG의 실패 모드:
* Retrieval misses: 관련 chunk를 제대로 검색하지 못해 LLM이 잘못된 정보를 생성하는 경우.
* Chunk boundary cuts: 중요한 정보가 두 개의 chunk에 나뉘어 있어 단독으로 파악하기 어려운 경우.
* Prompt pollution: 관련 없는 chunk가 검색되어 LLM이 혼란을 겪는 경우.
* Latency stacking: 여러 단계의 처리 과정으로 인해 응답 속도가 느려지는 경우.
* Cost creep: 대규모 운영 시 벡터 검색 및 LLM 토큰 비용이 증가하는 경우.
* Stale vectors: 문서가 업데이트되었으나 벡터 데이터베이스가 최신 상태를 반영하지 못하는 경우.
- RAG를 사용하지 않는 경우:
* 전체 지식의 양이 적어 프롬프트에 직접 포함 가능한 경우.
* LLM의 글쓰기 스타일이나 톤을 조정하는 것이 목적일 때 (이 경우 파인튜닝이 적합).
* 데이터가 거의 실시간으로 변하는 경우 (이 경우 직접 데이터베이스를 호출하는 것이 효율적).
* 틀린 답변이 치명적인 결과를 초래할 경우 (이 경우 인간 검토(human-in-the-loop) 또는 강력한 안전 장치 필요).

시사점

RAG는 LLM이 최신 외부 데이터를 활용하여 hallucination을 줄이고 정확하며 출처가 명확한 답변을 제공하도록 하는 실용적인 AI 적용 패턴으로서, 기업들이 자체 데이터를 LLM에 효과적으로 통합하고 활용할 수 있도록 지원합니다.

원문 읽기 →
원문을 불러오는 중...

댓글

GitHub Discussions