Retrieval-Augmented Generation (RAG) 이해하기

발행: (2025년 12월 11일 오후 04:47 GMT+9)
7 min read
원문: Dev.to

Source: Dev.to

RAG란 무엇인가?

RAG는 외부 지식 베이스와 연결하여 LLM을 강화하는 기술입니다. 사전 학습된 데이터에만 의존하는 대신, 모델은 먼저 검색을 통해 특정 데이터셋(예: 내부 문서, 데이터베이스, 웹사이트)에서 관련 정보를 찾아낸 뒤 생성을 통해 보다 정확하고 상황에 맞는 응답을 제공합니다.

마치 LLM을 위한 오픈북 시험과 같습니다. 모델이 모든 것을 외울 필요는 없고, 답변하기 전에 올바른 정보를 찾아볼 수만 있으면 됩니다.

왜 필요할까?

RAG의 주요 동기는 독립형 LLM이 갖는 고유한 한계를 극복하기 위함입니다:

  • 지식 컷오프: LLM은 학습 이후에 발생한 사건이나 데이터에 대해 알지 못합니다. RAG는 최신 정보를 직접 연결해 줍니다.
  • 환각(Hallucination): 답을 모를 때 LLM이 그럴듯하지만 잘못된 내용을 만들어낼 수 있습니다. RAG는 사실 데이터에 기반을 두어 환각을 크게 줄여줍니다.
  • 구체성 부족: 일반 목적 LLM은 특정 분야(예: 내부 정책이나 기술 매뉴얼)에 대한 깊은 지식이 부족할 수 있습니다. RAG를 사용하면 도메인‑특화 전문 지식을 주입할 수 있습니다.
  • 검증 가능성: RAG를 이용하면 답변을 생성할 때 사용된 출처를 인용할 수 있어 사용자가 정보를 검증할 수 있습니다.

RAG는 어떻게 작동할까?

RAG 프로세스는 두 가지 주요 단계로 나눌 수 있습니다.

단계 1: 인덱싱 (설정 단계)

  1. 문서 로드: PDF, Markdown 파일, 데이터베이스 레코드 등을 가져옵니다.
  2. 청킹(Chunking): 각 문서를 작고 관리하기 쉬운 텍스트 청크로 나눕니다.
  3. 임베딩: 각 청크를 임베딩 모델을 사용해 수치 벡터로 변환합니다.
  4. 저장: 청크와 해당 임베딩을 벡터 스토어에 저장해 빠른 유사도 검색이 가능하도록 최적화합니다.

이 오프라인 인덱싱은 원본 문서가 변경될 때만 수행됩니다.

단계 2: 검색 및 생성 (실시간 단계)

  1. 사용자 질의: 사용자가 질문을 제출합니다(예: “원격 근무 정책은 무엇인가요?”).
  2. 질의 임베딩: 동일한 임베딩 모델을 사용해 질문을 벡터로 변환합니다.
  3. 검색: 벡터 스토어가 가장 유사한 텍스트 청크들을 반환합니다.
  4. 증강: 원본 질문과 검색된 청크를 결합해 풍부한 프롬프트를 만듭니다.
  5. 생성: 증강된 프롬프트를 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 기반 애플리케이션을 구축할 수 있습니다.

Back to Blog

관련 글

더 보기 »