RAG(검색증강생성)란? 개념부터 파이썬 구현까지 한 번에 정리
LLM은 강력하지만 두 가지 약점이 있습니다. 학습 시점 이후의 정보를 모르고, 모르는 것도 그럴듯하게 지어내는 환각(hallucination) 현상이 있죠. RAG(Retrieval-Augmented Generation, 검색증강생성)는 이 문제를 모델 재학습 없이 해결하는 가장 실용적인 방법입니다.
RAG가 동작하는 원리
RAG의 아이디어는 단순합니다. 질문이 들어오면 외부 지식베이스에서 관련 문서를 먼저 검색하고, 그 내용을 프롬프트에 넣어 LLM이 답하게 합니다. 모델의 파라미터를 건드리지 않고도 회사 내부 문서나 최신 자료를 근거로 답변하게 만드는 셈입니다.
전체 흐름은 크게 두 단계로 나뉩니다.
- 인덱싱(준비): 문서를 잘게 쪼개(청킹) 임베딩 벡터로 변환해 벡터 DB에 저장
- 검색·생성(질의): 질문을 임베딩해 유사한 청크를 찾고, 이를 컨텍스트로 LLM에 전달
1단계: 문서 청킹과 임베딩
긴 문서를 통째로 넣으면 컨텍스트 윈도우를 낭비하고 검색 정확도도 떨어집니다. 적당한 크기로 나누는 청킹이 핵심입니다.
def chunk_text(text, size=500, overlap=50):
chunks = []
start = 0
while start < len(text):
end = start + size
chunks.append(text[start:end])
start += size - overlap # 문맥 단절 방지용 겹침
return chunks
docs = chunk_text(open("manual.txt", encoding="utf-8").read())
겹침(overlap)을 두면 청크 경계에서 문장이 잘려 의미가 끊기는 문제를 줄일 수 있습니다.
2단계: 검색과 답변 생성
질문과 청크를 같은 임베딩 공간에 놓고 코사인 유사도로 가장 가까운 것을 찾습니다. 아래는 OpenAI 임베딩과 채팅 API를 쓴 최소 예시입니다.
from openai import OpenAI
import numpy as np
client = OpenAI()
def embed(texts):
r = client.embeddings.create(model="text-embedding-3-small", input=texts)
return np.array([d.embedding for d in r.data])
doc_vecs = embed(docs)
def search(query, k=3):
q = embed([query])[0]
sims = doc_vecs @ q / (np.linalg.norm(doc_vecs, axis=1) * np.linalg.norm(q))
top = sims.argsort()[-k:][::-1]
return [docs[i] for i in top]
def ask(query):
context = "\n\n".join(search(query))
prompt = f"다음 자료만 근거로 답하라.\n\n[자료]\n{context}\n\n[질문] {query}"
res = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}],
)
return res.choices[0].message.content
실무에서는 직접 행렬 연산 대신 **벡터 DB(FAISS, Chroma, pgvector 등)**를 써서 검색을 확장합니다.
RAG vs 파인튜닝, 언제 무엇을?
| 구분 | RAG | 파인튜닝 |
|---|---|---|
| 지식 갱신 | 문서만 교체 (즉시) | 재학습 필요 |
| 비용 | 낮음 | 높음 |
| 출처 제시 | 가능 | 어려움 |
| 말투·형식 학습 | 약함 | 강함 |
사실 기반 Q&A는 RAG, 특정 톤·형식 고정은 파인튜닝이 정석입니다. 둘을 함께 쓰기도 합니다.
마무리 체크리스트
- 청킹 크기와 overlap을 데이터에 맞게 튜닝했는가
- "자료에 없으면 모른다고 답하라"는 지시로 환각을 억제했는가
- 검색된 청크의 출처를 답변에 함께 노출했는가
- 트래픽이 늘면 벡터 DB로 검색을 분리했는가
RAG는 적은 비용으로 LLM을 우리 데이터에 연결하는 가장 빠른 길입니다. 작은 프로토타입부터 시작해 검색 품질을 차근차근 끌어올리세요.
함께 보면 좋은 글
LLM(거대 언어모델)이란 무엇인가 — 비전공자를 위한 쉬운 설명 (2026)
LLM이란 무엇인지 토큰·확률예측·파라미터 개념을 일상 비유로 풀어 설명합니다. 왜 똑똑하면서도 가끔 틀리는지, 그리고 어떻게 활용하면 좋은지까지 알려드립니다.
프롬프트 엔지니어링 실전 기법 7가지 (Few-shot·CoT·역할부여)
같은 모델도 프롬프트에 따라 결과 품질이 크게 달라집니다. Few-shot, Chain-of-Thought, 역할 부여 등 실무에서 바로 쓰는 프롬프트 엔지니어링 기법을 예시와 함께 정리합니다.
AI로 업무 자동화하기 (2026) — 직장인 실전 활용 사례 10가지
이메일·회의록·보고서·엑셀·번역까지 AI로 업무 자동화하는 직장인 실전 사례 10가지를 실제 프롬프트 예시와 함께 정리했습니다. 보안·검증 주의점도 함께 확인하세요.