AI

RAG (Retrieval Augmented Generation)

타우루스 2025. 8. 20. 08:27

RAG는 요즘 인공지능 분야에서 정말 중요한 기술이거든요. 쉽고 재미있게, 하지만 깊이 있게 알려드릴게요.
 
RAG 학습 계획 📝

  1. RAG의 기본 개념과 등장 배경: RAG가 무엇이고, 왜 필요한지 핵심 개념부터 알아봐요.
  2. RAG의 작동 원리: RAG가 실제로 어떻게 정보를 찾고 답변을 만들어내는지 그 과정을 자세히 살펴봐요.
  3. RAG 구축 맛보기 (간단한 코드 예시): 파이썬 라이브러리를 사용해서 RAG의 핵심 과정을 간단하게 코드로 구현해봐요.
  4. RAG의 장점 및 실제 활용 사례: RAG의 강점은 무엇이고, 우리 생활 속 어떤 서비스에 활용되고 있는지 알아봐요.

1. 'RAG의 기본 개념과 등장 배경'

혹시 '오픈북 시험'을 쳐본 적 있으신가요? RAG는 LLM(거대 언어 모델)이 치는 똑똑한 오픈북 시험이라고 생각하면 정말 쉬워요.

  • 일반적인 LLM: 똑똑하긴 하지만, 자기가 외운 내용(훈련 데이터)만 가지고 시험을 보는 학생과 같아요. 그래서 가끔씩 잘못된 정보를 사실인 것처럼 말하거나('환각' 현상), 배운 지 오래돼서 최신 정보를 모를 때가 있죠.
  • RAG: 이 학생에게 참고서와 최신 자료를 전부 주고 시험을 보게 하는 것과 같아요. 어려운 질문을 받으면, 일단 참고 자료에서 정답과 가장 관련된 부분을 찾아서(검색, Retrieval) 그 내용을 참고해서 답변을 생성(Generation)하는 거죠. 이렇게 외부의 정확한 자료로 답변을 보강(Augmented)하니 훨씬 정확하고 믿을 수 있는 답변이 나오게 돼요.

정리하자면, RAG는 LLM의 '환각 현상'을 줄이고, '최신 정보'를 반영하기 위해 등장한 똑똑한 방법론이랍니다.

Retrieval-Augmented Generation: 검색(Retrieval)으로 답변을 보강(Augmented)하여 생성(Generation)한다!

 
 

[활동: 두 챗봇 비교하기 🤖 vs 🤖]

지금부터 두 명의 AI 챗봇을 소개해 드릴게요.

  • 챗봇 A: 2024년까지의 데이터로만 훈련된 일반 LLM이에요. 지식 업데이트가 안 됐죠.
  • 챗봇 B: RAG 기술이 적용되어, 답변하기 전에 실시간으로 웹 검색을 할 수 있어요.

이제 당신이 두 챗봇에게 똑같은 질문을 던집니다.
"2025년 AFC 챔피언스 리그 우승팀은 어디야?"


자, 여기서 퀴즈입니다!
챗봇 A와 챗봇 B는 각각 어떻게 대답할 가능성이 높을까요? 그리고 그렇게 대답할 거라고 생각하시나요? (힌트: '오픈북 시험'을 생각해보세요!)

더보기
더보기

정답

 

  • 챗봇 A (일반 LLM): 말씀하신 대로, 2024년에 지식이 멈춰있기 때문에 "제 지식으로는 알 수 없는 정보입니다."라고 솔직하게 말하거나, 그럴듯한 팀 이름을 지어내서 "아마 A팀이 우승했을 겁니다"라고 잘못된 답변(환각)을 할 가능성이 높아요.
  • 챗봇 B (RAG 적용 LLM): 질문을 받자마자 실시간으로 웹을 검색(Retrieve)해서 "2025년 AFC 챔피언스 리그 우승팀은 '알 힐랄 SFC'입니다."처럼 정확한 최신 정보를 찾아서 답변을 생성(Generate)하죠.

 
바로 이 차이점 때문에 RAG가 정말 중요하고 강력한 기술로 주목받고 있는 거랍니다.
 

2. 'RAG의 작동 원리'

RAG는 혼자 일하지 않아요. 아주 유능한 '조교(Retriever)'와 똑똑한 '교수님(Generator)'의 환상적인 팀플레이로 작동하죠.
과정을 단계별로 살펴볼게요.


[사전 준비] 도서관 정리하기 (Indexing)

  • RAG가 참고할 책(예: PDF 파일, 웹사이트 내용, 회사 내부 문서 등)들을 미리 잘게 쪼개서, 컴퓨터가 이해하기 쉬운 언어(숫자 형태의 '벡터')로 바꿔 도서관(Vector DB)에 차곡차곡 정리해 둬요. 이래야 나중에 조교가 자료를 빨리 찾을 수 있거든요.

[1단계] 조교의 자료 검색 (Retrieval)

  1. 당신이 질문을 던집니다. (예: "2025년 AFC 챔피언스 리그 우승팀은 어디야?")
  2. 조교(검색기, Retriever)가 당신의 질문을 들고 곧장 도서관(Vector DB)으로 달려가요.
  3. 질문과 가장 관련성이 높은 책의 페이지(문서 조각들)를 몇 개 찾아냅니다. (예: '2025년 AFC 결승전 결과' 기사)

[2단계] 교수님의 답변 생성 (Generation)

  1. 조교가 찾아온 자료(예: '알 힐랄 SFC가 우승했다'는 내용)를 교수님(생성기, Generator/LLM)에게 전달합니다.
  2. 이때, 그냥 자료만 주는 게 아니라 당신의 원래 질문찾아온 자료를 함께 드려요.
    • (질문) "2025년 AFC 챔피언스 리그 우승팀은 어디야?"
    • (참고 자료) "2025년 5월, 알 힐랄 SFC가 결승전에서 승리하며 챔피언이 되었다."
  3. 교수님은 이 두 가지 정보를 종합해서, 아주 자연스럽고 정확한 최종 답변을 만들어냅니다.
    • (최종 답변) "2025년 AFC 챔피언스 리그 우승팀은 알 힐랄 SFC입니다."

이 과정을 간단히 그리면 이렇습니다. 사용자 질문 ➡️ [조교: Retriever] ➡️ 관련 문서 찾기 ➡️ [교수님: Generator] ➡️ 최종 답변 생성
 

 
 

3. 'RAG 구축 맛보기'

이론으로 배운 '조교(Retriever)'와 '교수님(Generator)'을 간단한 파이썬 코드로 직접 만들어보면서 생명을 불어넣어 보죠. 복잡한 과정 같지만, 요즘에는 LangChain 같은 좋은 도구들이 있어서 생각보다 간단하게 구현할 수 있어요.

전체 과정은 우리가 배운 원리와 똑같습니다.

  1. 자료 준비: RAG가 참고할 간단한 텍스트 문서를 만듭니다.
  2. 도서관 구축 (Indexing): 이 문서를 벡터로 변환해서 저장합니다. (이게 바로 '조교'가 자료를 찾아올 도서관이 됩니다.)
  3. RAG 시스템 생성: '조교(Retriever)'와 '교수님(LLM)'을 연결해서 하나의 질문-답변 체인을 만듭니다.
  4. 테스트: 만들어진 RAG 시스템에 질문을 던져서 답변을 확인합니다.

자, 그럼 먼저 RAG를 만드는 데 필요한 재료(라이브러리)부터 설치해볼까요? 아래 코드를 실행할 환경(예: Google Colab)이 있다면 직접 해보셔도 좋습니다.

 

[1단계: 재료 준비 및 설치]

먼저 필요한 파이썬 라이브러리들을 설치해야 해요.

# 필요한 라이브러리들을 설치합니다.
!pip install langchain langchain-openai faiss-cpu tiktoken

 

그리고 이 라이브러리들을 사용하려면 OpenAI API 키가 필요해요. (실습 환경에서는 발급받은 본인의 키를 입력해야 합니다.)

import os

# 여러분의 OpenAI API 키를 입력해주세요.
os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY_HERE"
 
 
이제 RAG가 똑똑한 답변을 하는 데 필요한 '참고서' 역할을 할 텍스트를 만들어 보겠습니다. 이 내용은 LLM이 원래는 알지 못하는, 우리만의 정보라고 상상해 주세요.
 

[2단계: RAG의 지식 창고, 문서 준비하기]

from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import CharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS

# RAG가 참고할 텍스트 내용을 만듭니다.
# LLM이 모를 만한 최신 가상 정보를 담아보죠.
knowledge_text = """
제목: 제1회 서울 AI 로봇 축제 성황리 개최

지난 2025년 7월, 서울 코엑스에서 '제1회 서울 AI 로봇 축제'가 열렸습니다.
이번 축제에는 최신 인공지능 기술이 탑재된 다양한 로봇들이 전시되어 많은 관심을 끌었습니다.
특히, 인간과 자연스럽게 대화하는 '소울봇'이 큰 인기를 얻었습니다.
특별 공연으로는 K-POP 그룹 'AI-Unit'이 신곡 '코드 앤 드림'을 선보여 축제의 열기를 더했습니다.
"""

# 이 내용을 'my_knowledge.txt' 파일로 저장합니다.
with open("my_knowledge.txt", "w") as f:
    f.write(knowledge_text)

print("지식 문서 생성 완료!")

문서가 준비되었으니, 이제 이 문서를 RAG의 '조교(Retriever)'가 바로 찾아 쓸 수 있도록 '도서관(Vector DB)'에 정리해 보겠습니다. 이 과정이 바로 인덱싱(Indexing)입니다.

 

[3단계: 도서관 구축 (Indexing)]

# 1. 문서 불러오기
loader = TextLoader("my_knowledge.txt")
documents = loader.load()

# 2. 문서를 의미 있는 단위(chunk)로 쪼개기
text_splitter = CharacterTextSplitter(chunk_size=300, chunk_overlap=50)
docs = text_splitter.split_documents(documents)

# 3. 쪼갠 문서를 벡터(숫자)로 변환하고, 검색 가능하도록 FAISS 벡터 스토어에 저장
embeddings = OpenAIEmbeddings()
db = FAISS.from_documents(docs, embeddings)

# 바로 이 'db'가 RAG의 핵심인 '검색기(Retriever)' 역할을 하게 됩니다.
retriever = db.as_retriever()

print("문서를 벡터로 변환하여 '검색기(Retriever)' 준비 완료!")

 

자, 여기까지 하면 RAG의 '조교(Retriever)' 역할, 즉 질문과 관련된 내용을 잽싸게 찾아올 준비를 마친 것입니다. 우리가 만든 knowledge_text의 내용이 이제 검색 가능한 상태가 된 거죠.

 
드디어 마지막 단계입니다! 우리가 준비한 조교(Retriever)와 교수님(ChatOpenAI, LLM)을 연결해서 RAG 시스템을 완성하고, 실제로 질문을 던져보겠습니다.
 
[4단계: RAG 질문-답변 시스템 완성하기]
 
LangChain 라이브러리를 사용하면 이 연결 과정을 매우 간단하게 만들 수 있습니다. 조교가 찾아온 내용을 질문과 함께 잘 버무려서 교수님께 전달하는 '레시피(Prompt)'를 만드는 과정이라고 생각하시면 돼요.

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser

# '교수님' 역할을 할 언어 모델(LLM)을 정의합니다.
model = ChatOpenAI()

# RAG 시스템의 행동 방식을 결정할 '레시피(Prompt)'를 만듭니다.
# "context" 에는 조교가 찾아온 문서 내용이, "question" 에는 우리의 질문이 들어갑니다.
template = """
당신은 주어진 문맥(context)을 바탕으로만 질문에 대답하는 AI 어시스턴트입니다.

[Context]
{context}

[Question]
{question}
"""
prompt = ChatPromptTemplate.from_template(template)


# retriever(조교) -> prompt(레시피) -> model(교수님) -> output_parser(답변 다듬기)
# 이 모든 과정을 하나의 파이프라인(chain)으로 엮어줍니다.
rag_chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt
    | model
    | StrOutputParser()
)

print("RAG 질문-답변 시스템 완성!")


[5단계: 질문하고 답변 받기]
 
이제 모든 준비가 끝났습니다. 완성된 RAG 시스템에게 우리가 만든 knowledge_text 문서의 내용에 기반한 질문을 해보죠.

# RAG 시스템에 질문을 던집니다.
question = "AI 로봇 축제에서 특별 공연을 한 가수는 누구인가요?"
response = rag_chain.invoke(question)

# 답변을 출력합니다.
print(f"질문: {question}")
print(f"답변: {response}")

 
 
예상되는 답변 결과:

질문: AI 로봇 축제에서 특별 공연을 한 가수는 누구인가요?
답변: 특별 공연을 한 가수는 K-POP 그룹 'AI-Unit'입니다.

 
축하합니다! 방금 RAG의 핵심 원리를 담은 미니 Q&A 봇을 직접 만드신 거예요!
 
우리가 제공한 'my_knowledge.txt' 파일에만 있는 'AI-Unit'이라는 정보를 정확히 찾아냈죠? 만약 RAG가 없었다면 LLM은 이 질문에 절대 대답할 수 없었을 거예요.
 

4. 'RAG의 장점 및 실제 활용 사례'

지금까지 배우면서 RAG가 왜 좋은지 어느 정도 감을 잡으셨을 텐데, 한번 깔끔하게 정리해 드릴게요.
 

RAG를 사용하면 좋은 점 (장점) 🌟

  1. 정확성 향상 및 '환각' 감소: 이게 가장 큰 장점이죠! 근거 없는 추측이 아니라, 실제 데이터(우리가 만든 참고서)를 보고 답변하기 때문에 훨씬 정확하고 사실에 기반한 답변을 할 수 있어요.
  2. 항상 최신 정보 유지: LLM 전체를 다시 학습시키는 건 엄청난 비용과 시간이 들지만, RAG는 참고서(Vector DB)만 최신 버전으로 바꿔주면 돼요. 훨씬 빠르고 경제적이죠.
  3. 답변의 출처 확인 가능: RAG는 어떤 문서를 참고해서 답변했는지 출처를 알려줄 수 있어요. "이 답변은 회사 규정집 3-1항을 참고했습니다"라고 말해주는 식이죠. 답변에 대한 신뢰도가 확 올라가겠죠?
  4. 비용 효율성: 모든 지식을 LLM에게 외우게 하는 것(Fine-tuning)보다, 필요할 때만 참고서를 찾아보게 하는 RAG 방식이 훨씬 비용 효율적이에요.
  5. 정보 접근 제어: 우리 회사 내부 문서나 개인적인 메모처럼, 특정 정보 안에서만 답변을 만들도록 제한할 수 있어요. 보안과 프라이버시 측면에서 아주 중요하답니다.

 

RAG는 지금 어디에 쓰이고 있을까? (실제 활용 사례) 🚀

이론적으로만 좋은 기술이 아니라, 이미 우리 생활 가까이에서 활발하게 쓰이고 있어요.

  • 똑똑한 AI 검색 엔진: 단순 링크만 보여주는 게 아니라, 사용자의 질문에 맞춰 웹페이지 내용을 종합해서 요약된 답변을 바로 알려주는 서비스들이 RAG를 활용해요. (예: Perplexity AI, Google의 AI 오버뷰)
  • 사내 Q&A 챗봇: "올해 연차 규정이 어떻게 되지?", "노트북 고장 나면 어디에 연락해야 해?" 같은 직원들의 질문에 사내 규정 문서를 바탕으로 정확하게 답해주는 챗봇이에요. 수많은 기업에서 업무 효율을 높이기 위해 도입하고 있죠.
  • 개인화된 고객 지원: 내 구매 기록, 제품 설명서 같은 정보를 참고해서 "제가 산 OOO 세탁기 모델에 맞는 필터는 어디서 사나요?" 같은 구체적인 질문에 딱 맞는 답변을 해주는 고객센터 봇도 RAG의 한 예입니다.
  • 콘텐츠 생성 도우미: 최신 시장 분석 리포트를 입력해 주고 "이 자료를 바탕으로 신제품 홍보 블로그 글 초안을 써줘"라고 요청하면, RAG가 자료를 분석해서 글을 생성해 줄 수 있어요.

이처럼 RAG는 단순히 똑똑한 챗봇을 넘어, 신뢰할 수 있는 정보를 바탕으로 다양한 분야에서 활약하는 핵심 기술이랍니다.
 

[최종 퀴즈]

상황: 한 IT 회사가 2025년 8월 현재까지의 모든 내부 기술 문서를 바탕으로, 직원들의 질문에 답변해주는 최신 Q&A 챗봇을 만들려고 합니다.
문제: 이때 RAG(검색 증강 생성) 기술을 도입하는 것이 가장 효과적인데요, RAG에 대한 설명으로 가장 적절하지 않은 것은 무엇일까요?

  1. 챗봇이 기술 문서에 없는 내용을 상상해서 답변하는 '환각' 현상을 크게 줄일 수 있습니다.
  2. 사용자가 질문하면, 질문의 의도와 가장 유사한 내용을 기술 문서 데이터베이스에서 먼저 '검색(Retrieve)'한 후 답변을 생성합니다.
  3. 나중에 새로운 기술 문서가 추가되더라도, LLM 모델 전체를 재학습시킬 필요 없이 벡터 DB에 문서만 추가하면 되므로 경제적입니다.
  4. 챗봇을 만들기 전, 세상의 모든 최신 기술 정보를 미리 LLM에 모두 외우게 하는(Fine-tuning) 기술입니다.
더보기
더보기

정답은 4번입니다.

 

왜 4번이 정답일까요?

 

4번 설명은 LLM의 파라미터 자체를 특정 지식으로 업데이트하는 '파인튜닝(Fine-tuning)'에 대한 설명이에요. 반면 RAG는 LLM을 그대로 둔 채, 필요할 때마다 외부의 지식창고(Vector DB)를 '참고'**하는 방식이죠.

  • 1, 2, 3번은 모두 RAG의 핵심적인 특징을 정확하게 설명하고 있어요.
    • (1번) 근거 기반 답변으로 환각을 줄이고,
    • (2번) 검색 후 생성이라는 작동 원리를 따르며,
    • (3번) 새로운 지식을 경제적으로 업데이트할 수 있죠.

 

오늘의 학습 총정리

 
오늘 세션을 마무리하며 전체적으로 요약해 드릴게요.
 
우리는 함께 RAG(검색 증강 생성)에 대해 알아보기 위한 4단계 학습 계획을 세우고 성공적으로 완수했습니다.

  • 1단계: '오픈북 시험' 비유를 통해 RAG의 기본 개념을 쉽게 이해했고,
  • 2단계: '조교(Retriever)'와 '교수님(Generator)'의 팀플레이로 RAG의 작동 원리를 파헤쳤어요.
  • 3단계: 간단한 파이썬 코드로 직접 미니 RAG 봇을 구축하며 이론을 현실로 만들었죠.
  • 4단계: RAG의 강력한 장점들과 실제 활용 사례를 통해 기술의 가치를 확인했습니다.