본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 05. 27. 05:40

98. RAG: AI에게 당신의 문서에 대한 접근 권한을 부여하세요

요약

LLM의 환각 문제를 해결하기 위한 RAG(검색 증강 생성)의 개념과 전체 파이프라인을 설명합니다. 청킹, 임베딩, 검색, 생성으로 이어지는 단계별 구축 방법과 Fine-tuning과의 차이점을 다룹니다.

핵심 포인트

  • RAG는 외부 지식 베이스를 활용해 LLM의 환각 현상을 방지함
  • 효과적인 청킹(Chunking)과 오버랩 설정이 검색 품질의 핵심임
  • Fine-tuning은 스타일 학습에, RAG는 지식 접근에 적합함
  • LangChain과 sentence-transformers를 활용한 구현 가이드 제공

당신은 ChatGPT에게 회사의 내부 정책에 대해 질문합니다. 그것은 무언가를 지어냅니다. 매우 자신감 있게 들립니다. 하지만 틀렸습니다.

이것이 바로 환각 (Hallucination) 문제입니다. LLM (Large Language Models)은 학습 과정에서 배운 내용을 바탕으로 텍스트를 생성합니다. 만약 정답이 학습 데이터에 없었다면, 그들은 그럴듯하게 들리는 답변을 꾸며냅니다.

RAG (Retrieval Augmented Generation, 검색 증강 생성)가 이 문제를 해결합니다. 생성하기 전에, 시스템은 당신의 지식 베이스(Knowledge Base)에서 관련 문서를 검색합니다. LLM은 해당 문서들을 읽고 실제 콘텐츠에 근거한 답변을 생성합니다.

당신의 문서. 당신의 데이터. 정확한 답변.

여기서 배우게 될 내용

  • 지식 집약적인 작업에서 왜 RAG가 미세 조정 (Fine-tuning)보다 우수한지
  • 전체 RAG 파이프라인 (Pipeline): 청킹 (Chunk), 임베딩 (Embed), 검색 (Retrieve), 생성 (Generate)
  • 실제로 효과적인 청킹 (Chunking) 전략
  • sentence-transformers와 로컬 LLM을 사용하여 처음부터 RAG 구축하기
  • 실제 프로젝트를 위해 LangChain으로 RAG 구축하기
  • RAG 평가: 무엇이 좋은 상태이고 무엇이 시스템을 망가뜨리는지
  • 일반적인 실패 모드와 이를 해결하는 방법

RAG vs Fine-Tuning: 언제 무엇을 사용해야 하는가

둘 다 LLM에게 새로운 지식에 대한 접근 권한을 부여합니다. 하지만 이들은 서로 다른 문제를 해결하고 있습니다.

Fine-tuning (미세 조정):
  - 최적의 용도: 스타일, 형식, 행동 학습
  - 모델 가중치 (Weights)를 업데이트함
...

전체 RAG 파이프라인 (Pipeline)

1. 인덱싱 (INDEXING) (한 번 수행, 오프라인)
   문서 로드
   → 청크 (Chunks)로 분할
...

1단계: 문서 청킹 (Chunking Documents)

가장 과소평가된 단계입니다. 문서를 어떻게 나누느냐에 따라 검색 품질이 극적으로 달라집니다.

import re
from typing import List

...

출력:

Fixed chunks:     7
Sentence chunks:  4
Paragraph chunks: 4
...

청킹 (Chunking) 가이드라인:

  • 대부분의 사용 사례에는 300-600자 크기의 청크가 잘 작동합니다.
  • 경계 부분에서 문맥이 손실되지 않도록 항상 오버랩 (Overlap, 50-100자)을 포함하세요.
  • 단락 청킹 (Paragraph chunking)은 고정 크기보다 의미 단위 (Semantic units)를 더 잘 보존합니다.
  • 작은 청크: 더 높은 정밀도 (Precision, 더 구체적인 검색)
  • 큰 청크: 더 높은 재현율 (Recall, 청크당 더 많은 문맥)

2단계: 인덱스 구축 (Building the Index)

from sentence_transformers import SentenceTransformer
import chromadb
import numpy as np
...

Output:

Indexed 16 chunks from 8 documents

Query: 'How do I prevent a model from overfitting?'
...

3단계: 검색된 문맥을 이용한 생성 (Generation With Retrieved Context)

# HuggingFace Transformers를 통한 로컬 모델 사용
from transformers import pipeline

...

더 나은 생성을 위한 OpenAI API 사용

프로덕션 품질을 위해서는 실제 LLM API를 사용하세요. 검색 (Retrieval) 과정은 동일하게 유지됩니다. 오직 생성 (Generation) 단계만 변경됩니다.

# 생성기(generator)를 OpenAI API로 교체
# pip install openai

...

LangChain: 30줄로 구현하는 RAG

LangChain은 전체 RAG 파이프라인을 조합 가능한 컴포넌트 (Composable components)로 추상화합니다.

pip install langchain langchain-community langchain-chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import HuggingFaceEmbeddings
...

일반적인 RAG 실패 사례 및 해결 방법

failures = {
    "Retrieval finds wrong chunks": {
        "symptoms": "답변이 주제에서 벗어나거나 질문에 답하지 않음",
        "causes":   ["청크(Chunk)가 너무 큼 (많은 주제를 포함함)", "도메인에 부적합한 임베딩 모델 (Embedding model)"],
        "fixes":    ["더 작은 청크 (200-400자)", "도메인 특화 임베딩 모델",
                     "하이브리드 검색 (Hybrid search: 키워드 + 의미론적 검색)"]
    },
    "Chunks miss key information": {
        "symptoms": "모델이 '모릅니다'라고 답하지만, 정답은 문서 안에 있음",
        "causes":   ["청크 경계가 관련 문장을 잘라버림",
                     "top_k 값이 너무 작음", "질의(Query)와 문서의 표현 방식이 너무 다름"],
        "fixes":    ["청크 간에 중첩(Overlap) 추가", "top_k를 5-7로 증가",
                     "질의 확장 (Query expansion: 질의를 여러 방식으로 재구성하고 결과 병합)"]
    },
    "Model ignores retrieved context": {
        "symptoms": "답변이 검색된 청크와 전혀 일치하지 않음",
        "causes":   ["LLM (대규모 언어 모델) 규모가 너무 작음", "컨텍스트(Context)만 사용하도록 하는 프롬프트(Prompt)가 불분명함"],
        "fixes":    ["더 크고 성능이 좋은 LLM 사용", "더 강력한 프롬프트 지침",
                     "온도(Temperature) 낮춤"]
    },
    "Too much irrelevant context": {
        "symptoms": "모델이 혼란을 느끼며, 답변이 모호함",
        "causes":   ["top_k가 너무 높음", "모든 청크의 유사도 점수(Similarity scores)가 낮음"],
        "fixes":    ["유사도 임계값(Similarity threshold) 미만의 청크 필터링",
                     "top_k를 2-3으로 감소", "질의가 답변 가능한 내용인지 확인"]
    },
    "Hallucination despite retrieval": {
        "symptoms": "모델이 검색된 컨텍스트에 없는 사실을 생성함 (환각 현상)",
        "causes":   ["모델이 학습된 지식으로 컨텍스트를 무시함",
                     "프롬프트가 충분히 명확하지 않음"],
        "fixes":    ["시스템 프롬프트에 '컨텍스트만 사용하라'는 명시적 지침 추가",
                     "모델에게 컨텍스트에서 인용하도록 요청", "더 작고 주관적이지 않은 LLM 사용"]
    }
}

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0