💻데브노트소개
🤖

RAG(검색증강생성)란? 개념부터 파이썬 구현까지 한 번에 정리

데브노트 편집팀·2026.06.17·7분 읽기
X(트위터)
ADVERTISEMENT

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을 우리 데이터에 연결하는 가장 빠른 길입니다. 작은 프로토타입부터 시작해 검색 품질을 차근차근 끌어올리세요.

#RAG#검색증강생성#LLM#벡터검색
X(트위터)
ADVERTISEMENT