Retrieval-Augmented Generation (RAG) 이해하기
Source: Dev.to
RAG란 무엇인가?
RAG는 외부 지식 베이스와 연결하여 LLM을 강화하는 기술입니다. 사전 학습된 데이터에만 의존하는 대신, 모델은 먼저 검색을 통해 특정 데이터셋(예: 내부 문서, 데이터베이스, 웹사이트)에서 관련 정보를 찾아낸 뒤 생성을 통해 보다 정확하고 상황에 맞는 응답을 제공합니다.
마치 LLM을 위한 오픈북 시험과 같습니다. 모델이 모든 것을 외울 필요는 없고, 답변하기 전에 올바른 정보를 찾아볼 수만 있으면 됩니다.
왜 필요할까?
RAG의 주요 동기는 독립형 LLM이 갖는 고유한 한계를 극복하기 위함입니다:
- 지식 컷오프: LLM은 학습 이후에 발생한 사건이나 데이터에 대해 알지 못합니다. RAG는 최신 정보를 직접 연결해 줍니다.
- 환각(Hallucination): 답을 모를 때 LLM이 그럴듯하지만 잘못된 내용을 만들어낼 수 있습니다. RAG는 사실 데이터에 기반을 두어 환각을 크게 줄여줍니다.
- 구체성 부족: 일반 목적 LLM은 특정 분야(예: 내부 정책이나 기술 매뉴얼)에 대한 깊은 지식이 부족할 수 있습니다. RAG를 사용하면 도메인‑특화 전문 지식을 주입할 수 있습니다.
- 검증 가능성: RAG를 이용하면 답변을 생성할 때 사용된 출처를 인용할 수 있어 사용자가 정보를 검증할 수 있습니다.
RAG는 어떻게 작동할까?
RAG 프로세스는 두 가지 주요 단계로 나눌 수 있습니다.
단계 1: 인덱싱 (설정 단계)
- 문서 로드: PDF, Markdown 파일, 데이터베이스 레코드 등을 가져옵니다.
- 청킹(Chunking): 각 문서를 작고 관리하기 쉬운 텍스트 청크로 나눕니다.
- 임베딩: 각 청크를 임베딩 모델을 사용해 수치 벡터로 변환합니다.
- 저장: 청크와 해당 임베딩을 벡터 스토어에 저장해 빠른 유사도 검색이 가능하도록 최적화합니다.
이 오프라인 인덱싱은 원본 문서가 변경될 때만 수행됩니다.
단계 2: 검색 및 생성 (실시간 단계)
- 사용자 질의: 사용자가 질문을 제출합니다(예: “원격 근무 정책은 무엇인가요?”).
- 질의 임베딩: 동일한 임베딩 모델을 사용해 질문을 벡터로 변환합니다.
- 검색: 벡터 스토어가 가장 유사한 텍스트 청크들을 반환합니다.
- 증강: 원본 질문과 검색된 청크를 결합해 풍부한 프롬프트를 만듭니다.
- 생성: 증강된 프롬프트를 LLM에 전달해 최종 답변을 생성합니다.
개념적인 파이썬 예시
# Pre‑configured components:
# - vector_store: database of indexed document chunks
# - embedding_model: model that converts text to vectors
# - llm: large language model for generation
def answer_question_with_rag(query: str) -> str:
"""
Answers a user's query using the RAG process.
"""
# 1. Embed the user's query
query_embedding = embedding_model.embed(query)
# 2. Retrieve relevant context from the vector store
relevant_chunks = vector_store.find_similar(query_embedding, top_k=3)
# 3. Augment the prompt
context = "\n".join(relevant_chunks)
augmented_prompt = f"""
Based on the following context, please answer the user's query.
If the context does not contain the answer, say so.
Context:
{context}
Query:
{query}
"""
# 4. Generate the final answer
final_answer = llm.generate(augmented_prompt)
return final_answer
# Example usage
user_query = "What is our policy on remote work?"
response = answer_question_with_rag(user_query)
print(response)
RAG를 언제 사용해야 할까
- 고객 지원 챗봇: 제품 매뉴얼, FAQ, 과거 지원 티켓 등을 활용해 질문에 답변합니다.
- 내부 지식 베이스: 직원들이 회사 정책, 기술 문서, 프로젝트 이력 등을 조회할 수 있게 합니다.
- 맞춤형 콘텐츠 추천: 사용자의 질의와 아이템 카탈로그를 결합해 기사나 제품을 추천합니다.
- 교육 도구: “책에 물어보기” 혹은 “강의에 물어보기”와 같은 애플리케이션을 구축해 학생들이 교재를 직접 질의할 수 있게 합니다.
RAG를 사용하면 안 되는 경우
- 고도로 창의적이거나 개방형 작업: 시, 소설, 브레인스토밍 등은 특정 문서가 필요하지 않습니다.
- 일반 상식 질문: “프랑스의 수도는 어디인가요?”와 같은 질문은 LLM 내부 지식만으로 충분히 답할 수 있습니다.
- 극히 낮은 지연 시간 요구: 검색 단계가 지연을 추가하므로, 밀리초 수준의 응답이 필요할 경우 직접 LLM 호출이 더 나을 수 있습니다.
- 단순 명령‑제어: “불을 켜라” 혹은 “음악을 재생해”와 같은 작업은 전용 NLU 시스템이 RAG 파이프라인보다 효율적입니다.
그 강점과 한계를 이해하면, RAG를 활용해 보다 정확하고 신뢰성 있으며 유용한 AI 기반 애플리케이션을 구축할 수 있습니다.