검색 증강 생성
모델이 모르는 자료를 검색해 프롬프트에 넣는 RAG의 흐름을 이해하고, 미세조정과 비교하며 Naive·Advanced·Modular RAG를 구분한다.
- 검색 증강 생성(Retrieval-Augmented Generation, RAG): 질문과 관련된 자료를 먼저 검색하고, 검색한 자료를 프롬프트에 넣어 답변을 생성하는 방법.
- 증강의 종류 중 정보 조회에 해당. 함수 호출이 재고표를 조회했다면, RAG는 문서 더미에서 필요한 부분을 찾아옴.
- 모델의 파라미터는 바꾸지 않음. 바뀌는 것은 모델에 전달하는 입력.
모델이 모르는 자료
- 사내 규정, 제품 설명서, 고객 안내서처럼 학습 데이터에 없는 자료는 모델이 알 수 없음.
- 이번 주 실습 자료: 가상의 쇼핑몰 '마인드몰'의 고객 안내서. 회원 등급·적립금·배송·반품·환불·품질 보증 규정을 마크다운 형식으로 쓴 문서.
- 실습 자료 다운로드: mindmall_guide.py. 현재 폴더에 업로드. 안내서 원문이 문자열 변수
guide에 들어 있음.
!pip install -q openai
from pathlib import Path
from openai import OpenAI
client = OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key=Path("openrouter-key.txt").read_text().strip(), # 키 파일에서 읽기
)
model = "openai/gpt-4.1-mini"
from mindmall_guide import guide # 안내서 전체가 담긴 문자열
len(guide) # 글자 수
실행 결과
1863
질문만 보내기: 모델은 마인드몰의 규정을 모름.
question = "마인드몰에서 단순 변심으로 반품하면 배송비는 얼마인가요?"
response = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": question}],
)
print(response.choices[0].message.content)
실행 결과
마인드몰에서 단순 변심으로 반품할 경우, 고객이 부담해야 하는 배송비는 5,000원입니다.
반품 시 택배비는 반드시 선결제하셔야 하며, 반품 완료 후 환불 처리됩니다.
자세한 내용은 마인드몰 반품 정책 페이지를 참고하시거나 고객센터에 문의해 보시는 것이 좋습니다.
- 위 실행에서는 5,000원이라고 답함. 마인드몰의 실제 규정은 왕복 6,000원. 모델이 알 수 없는 금액을 그럴듯하게 지어낸 환각(hallucination).
- 실행마다 다른 금액을 말하거나 쇼핑몰에 확인하라고 안내할 수도 있음. 어느 쪽이든 실제 규정은 모름.
- 사용자는 지어낸 금액과 실제 규정을 구분하기 어려움.
관련 자료를 함께 보내기: 안내서에서 반품 규정 부분을 찾아 프롬프트에 넣음.
sections = guide.split("\n## ") # 제목 수준 2를 기준으로 나누기
context = sections[4] # 0: 머리말, 1: 회원 등급, ..., 4: 교환과 반품
print(context[:200])
실행 결과
4. 교환과 반품
상품을 받은 날로부터 7일 안에 교환이나 반품을 신청할 수 있다. 신청은 주문 내역의 교환·반품 버튼으로 한다.
단순 변심으로 반품하면 왕복 배송비 6,000원을 고객이 낸다. 상품에 불량이 있거나 주문과 다른 상품이 배송된 경우에는 배송비를 마인드몰이 낸다. 이 경우 수령 후 30일 안에 신청하면 된다.
다음 경우에는 단순 변심에
prompt = f"""다음 자료만 근거로 질문에 답하세요. 자료에 없으면 모른다고 답하세요.
[자료]
{context}
[질문]
{question}"""
response = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": prompt}],
)
print(response.choices[0].message.content)
실행 결과
단순 변심으로 반품하면 왕복 배송비 6,000원을 고객이 냅니다.
- 같은 모델이 자료를 받자 마인드몰의 규정으로 답함.
- 남은 문제: 실제로는 질문마다 어느 부분을 넣어야 할지 미리 알 수 없음. 위에서는 사람이
sections[4]를 골랐음. 이 고르는 일을 자동으로 하는 단계가 검색.
RAG의 흐름
Mermaid 다이어그램 원문
flowchart LR
subgraph 색인["색인: 미리 한 번"]
D[문서] --> C[청크로 나누기] --> E1[임베딩] --> V[(벡터 DB)]
end
subgraph 질의["질의: 질문마다"]
Q[질문] --> E2[임베딩] --> S[검색]
V --> S
S --> P[질문 + 검색 결과로 프롬프트 구성] --> L[LLM] --> A[답변]
end대화형 다이어그램을 불러오기 전에는 원문으로 표시됩니다.
- 색인(indexing): 문서를 작은 조각(청크)으로 나누고, 검색할 수 있는 형태로 저장. 문서가 바뀔 때만 다시 실행.
- 질의(query): 질문이 들어올 때마다 관련 청크를 검색해 프롬프트에 넣고 답변 생성.
- 검색 방법: 키워드가 겹치는 정도로 찾는 키워드 검색, 의미가 비슷한 정도로 찾는 벡터 검색. 둘을 함께 쓰기도 함.
- 출처: Lewis 외(2020), Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks가 RAG라는 이름을 처음 사용.
RAG와 미세조정
- 모델에 새 지식을 넣는 다른 방법: 그 자료로 모델을 추가 학습시키는 미세조정(fine-tuning).
| 비교 항목 | RAG | 미세조정 |
|---|---|---|
| 지식 갱신 | 문서만 바꾸면 바로 반영 | 다시 학습해야 반영 |
| 준비할 것 | 문서와 검색 시스템 | 고품질 학습 데이터와 학습 계산 |
| 출처 확인 | 어떤 문서를 근거로 답했는지 추적 가능 | 어떤 학습 데이터 때문인지 알기 어려움 |
| 잘 바꾸는 것 | 모델이 아는 사실 | 말투·형식·전문 용어 사용 같은 행동 |
| 응답 속도 | 검색 단계만큼 느려짐 | 검색 없이 바로 응답 |
| 환각 | 검색한 근거가 있어 줄어듦. 검색이 틀리면 틀린 답 | 학습한 분야에서 줄어들지만 낯선 입력에서는 여전함 |
- 자주 바뀌는 사실, 출처가 중요한 답변 → RAG.
- 일정한 형식이나 말투, 특정 분야의 문체 → 미세조정.
- 둘은 배타적이지 않음. 미세조정한 모델에 RAG를 붙여 사용 가능.
RAG 패러다임

Naive RAG
- 질문으로 검색 → 검색 결과를 프롬프트에 붙임 → 생성. 위 흐름 그대로.
- 문제점:
- 낮은 정밀도: 관련 없는 청크가 검색되어 답변을 방해.
- 낮은 재현도: 필요한 청크가 검색 결과에서 빠짐.
- 오래된 정보: 더 이상 유효하지 않은 문서가 검색됨.
Advanced RAG
- 검색 전후에 처리 단계를 추가해 Naive RAG의 문제를 보완.
- 검색 전: 질문을 검색하기 좋게 다시 쓰기(query rewriting), 질문을 여러 개로 늘리기(query expansion), 질문 유형에 맞는 처리 경로 고르기(routing).
- 검색 후: 검색 결과의 순위 다시 매기기(rerank), 검색 결과 요약, 여러 검색 결과 합치기(fusion).
Modular RAG
- 검색·기억·생성 등을 모듈로 나누고, 작업에 맞게 조합하는 방식. Naive·Advanced RAG도 그 조합의 하나.
- 예: 검색 → 생성 → 생성 결과로 다시 검색 → 생성을 반복(ITER-RETGEN). 한 번의 검색으로 부족한 질문에 사용.
- 검색 여부를 모델이 판단하게 하면 9주에 다룬 함수 호출과 같은 구조. RAG의 검색기를 도구로 제공.
출처: Gao 외(2023), Retrieval-Augmented Generation for Large Language Models: A Survey.
퀴즈
검색 증강 생성(RAG)에서 질문마다 바뀌는 것은?
퀴즈를 풀려면 대화형 기능을 불러와야 합니다.