LLM을 위한 RAG 파이프라인 구현 (RAG Pipeline Implementation for LLMs)¶
개요¶
LLM 기반 시스템을 구축할 때 직면하는 주요 과제들:
- 도메인 지식 격차: 일반 LLM의 특정 분야 지식 부족
- 사실성 문제: 최신 정보에 대한 정확한 답변 불가
- 환각 현상: 존재하지 않는 정보를 그럴듯하게 생성
- 신뢰성 부족: 답변의 출처를 추적할 수 없음
RAG는 이러한 문제들을 체계적으로 해결하는 실용적인 솔루션입니다. 이 페이지에서는 RAG 파이프라인의 각 구성 요소를 상세히 설명하고 실제 구현 방법을 다룹니다.
RAG 파이프라인의 구조¶
RAG 시스템은 네 가지 핵심 단계로 구성됩니다:
1. 문서 전처리 (Preprocessing)
├─ 문서 수집
├─ 텍스트 정제
└─ 청킹 (Chunking)
↓
2. 인덱싱 (Indexing)
├─ 임베딩 생성
├─ 벡터 정규화
└─ 벡터 저장소 저장
↓
3. 검색 (Retrieval)
├─ 쿼리 임베딩
├─ 유사도 계산
└─ 관련 문서 추출
↓
4. 생성 (Generation)
├─ 프롬프트 구성
├─ LLM 호출
└─ 최종 답변 생성
1단계: 문서 청킹 (Document Chunking)¶
문제: 문서의 크기와 구조¶
원본 문서들은 다양한 형식과 크기를 가집니다: - PDF 논문: 수십~수백 페이지 - 웹 페이지: 수백~수천 단어 - 사내 정책: 불규칙한 구조
LLM의 컨텍스트 윈도우에 맞추려면 문서를 작은 단위로 분할해야 합니다.
청킹 전략¶
1. 고정 크기 청킹 (Fixed-Size Chunking)¶
가장 간단한 방법이지만 문맥을 무시할 수 있습니다.
# 예시: 512 토큰 단위로 청킹
chunk_size = 512
overlap = 128 # 인접 청크 간 중복
chunks = []
for i in range(0, len(text), chunk_size - overlap):
chunk = text[i:i + chunk_size]
chunks.append(chunk)
장점: 구현 간단, 계산 효율적 단점: 문장 중간에 자를 수 있음
2. 의미 기반 청킹 (Semantic Chunking)¶
문장, 단락, 섹션 단위로 문서를 분할합니다.
원본 문서:
┌─────────────────────────────────────────┐
│ 제목: 법인세법 개정안 │
├─────────────────────────────────────────┤
│ 제1장. 기본원칙 │
│ 제1조. 정의 │
│ 제2조. 적용 범위 │
├─────────────────────────────────────────┤
│ 제2장. 세율 │
│ 제3조. 법인세 세율 │
└─────────────────────────────────────────┘
↓ 의미 기반 청킹
청크1: 제1장 (정의, 적용 범위)
청크2: 제2장 (세율)
청크3: 부칙
!!! 💡 실전 팁 - 한국 문서: 장, 절, 항 같은 법령 체계를 활용한 청킹이 효과적 - 마크다운: 제목(#, ##, ###)을 기준으로 청킹 - 겹침 설정: 5-10% 정도의 중복으로 문맥 연속성 유지
3. 하이브리드 청킹 (Hybrid Chunking)¶
문서 구조를 인식하면서 크기 제약을 고려합니다.
청킹 파라미터 선택¶
| 파라미터 | 권장 범위 | 설명 |
|---|---|---|
| 청크 크기 | 256-1024 토큰 | LLM 컨텍스트의 10-20% |
| 겹침 | 0-20% | 인접 청크 간 중복 비율 |
| 분할 기준 | 문장/단락 | 의미 단위 우선 |
2단계: 임베딩과 벡터 저장소 (Embedding and Vector Database)¶
임베딩이란?¶
텍스트를 수치 벡터로 변환하여 의미적 유사성을 계산할 수 있게 합니다.
"법인세 세율은 23%입니다"
↓ 임베딩
[0.12, -0.45, 0.78, ..., 0.23] (1536 차원)
"법인세율이 몇 퍼센트인가요?"
↓ 임베딩
[0.13, -0.44, 0.79, ..., 0.24] (1536 차원)
↓ 코사인 유사도 = 0.98 (매우 유사!)
2026년 주요 임베딩 모델¶
| 모델 | 제공사 | 차원 | 특징 |
|---|---|---|---|
| text-embedding-3-large | OpenAI | 3,072 | 매우 높은 정확도, 한국어 우수 |
| Claude Embeddings | Anthropic | 1,024 | 컨텍스트 인식, 빠른 속도 |
| Gemini Embedding 001 | 768 | 멀티모달 지원, 비용 효율 | |
| multilingual-e5-large-ko | 한국 오픈소스 | 1,024 | 한국어 최적화 |
!!! 💡 한국 기업을 위한 팁
- 한국어 문서: multilingual-e5-large-ko 또는 OpenAI의 한국어 지원 모델 사용
- 혼합 언어: Gemini Embedding으로 영한 문서 동시 처리
- 비용 최적화: 작은 모델로 시작 후 필요시 업그레이드
벡터 저장소¶
임베딩된 청크들을 저장하고 빠르게 검색하는 데이터베이스입니다.
벡터 저장소의 구조:
청크 ID | 텍스트 | 임베딩 벡터 | 메타데이터
--------|--------|-----------|----------
001 | "법인세율..." | [0.12, ...] | {"출처": "법인세법", "장": 2}
002 | "부가가치세..." | [0.45, ...] | {"출처": "부가가치세법", "장": 1}
003 | "근로소득..." | [0.67, ...] | {"출처": "소득세법", "장": 3}
주요 벡터 저장소¶
| 저장소 | 특징 | 규모 |
|---|---|---|
| Pinecone | 관리형, 높은 성능 | 대규모 (수억 벡터) |
| Weaviate | 오픈소스, 유연함 | 중규모 (수천만 벡터) |
| Milvus | 오픈소스, 빠름 | 대규모 |
| Qdrant | 최신 기술, 신속 | 중규모 |
3단계: 검색 전략 (Retrieval Strategies)¶
의미적 검색 (Semantic Search)¶
벡터 유사도를 기반으로 관련 문서를 찾습니다.
사용자 쿼리: "법인세 세율이 얼마인가?"
↓
쿼리 임베딩: [0.13, -0.44, 0.79, ...]
↓
벡터 저장소에서 코사인 유사도 계산
↓
결과:
1. "법인세 세율은 23%입니다" (유사도: 0.98)
2. "법인세 신고 기한은 3월입니다" (유사도: 0.75)
3. "법인세 면제 대상은..." (유사도: 0.68)
하이브리드 검색 (Hybrid Search)¶
의미적 검색과 키워드 검색을 결합합니다.
쿼리: "법인세"
의미적 검색 결과:
→ 법인세, 소득세, 부가가치세 등 조세 관련 문서
키워드 검색 결과:
→ 정확히 "법인세"라는 단어가 포함된 문서
결합된 결과:
→ 둘 다 만족하는 문서 우선
!!! 💡 실전 팁 - 정확도 중시: 하이브리드 검색 사용 (의미 50% + 키워드 50%) - 속도 중시: 의미적 검색만 사용 - 법령/정책: 정확한 조항 번호를 찾아야 하므로 하이브리드 필수
검색 결과 순위 최적화¶
# 재순위 지정 (Re-ranking)
# 1차: 벡터 유사도로 상위 100개 추출
# 2차: 더 정교한 모델로 재순위 지정
initial_results = vector_search(query, top_k=100)
final_results = rerank_model.rank(query, initial_results, top_k=5)
4단계: 프롬프트 설계 (Prompt Design for RAG)¶
기본 프롬프트 구조¶
당신은 법률 전문가입니다. 주어진 문서를 바탕으로만 답변하세요.
[검색 문서]
{retrieved_documents}
[사용자 질문]
{user_question}
[지시사항]
- 문서에 없는 정보는 "정보 없음"이라고 답변하세요.
- 관련 조항 번호를 인용하세요.
- 최대 500자 이내로 답변하세요.
답변:
효과적인 RAG 프롬프트 기법¶
1. 역할 지정 (Role Assignment)¶
2. 출처 강조¶
"다음 회사 문서들을 참고하여 답변하세요:
문서1: 휴가 정책 (2024년 개정)
문서2: 보수 규정 (2024년 적용)
문서3: 근로시간 기준 (2024년)
이 문서들의 내용에만 기반하여 답변하세요."
3. 아웃풋 포맷 명시¶
4. 한국 기업을 위한 예시¶
# LangChain/LlamaIndex 스타일 프롬프트
rag_prompt = """
당신은 {company_name} 정책 자문 AI입니다.
아래의 사내 정책 문서를 바탕으로만 답변하세요:
{context}
직원 질문: {question}
답변 시 주의사항:
1. 문서에 명시된 정보만 사용하세요
2. 정책 변경 날짜를 명시하세요
3. 불확실한 경우 "미결정"이라고 표시하세요
4. 관련 부서를 안내하세요
답변:
"""
한국 실무 예시: 법률 문서 검색 시스템¶
상황: 법무팀이 법규 해석을 위한 RAG 시스템 구축
1. 문서 준비¶
2. 임베딩 및 인덱싱¶
3. 검색 로직¶
법무팀 변호사: "개인사업자의 소득세율이 어떻게 되나?"
검색 단계:
1. 의미적 검색 → "소득세", "세율", "개인사업자" 관련 청크
2. 키워드 검색 → "소득세율" 정확히 포함된 청크
3. 메타데이터 필터링 → 최신 개정본만 선택
결과:
- 소득세법 제13조 (종합소득세 세율)
- 국세청 유권해석 (개인사업자 적용 사례)
4. 생성 단계¶
Claude 4.6으로 처리:
입력:
- 검색된 법조문 3개
- 관련 판례 2개
- 사용자 질문
출력:
"개인사업자의 종합소득세율은 소득세법 제13조에 따라
6% ~ 49%의 누진세율이 적용됩니다.
[관련 조항]
- 소득세법 제13조 1항 (종합소득세 세율)
- 동법 시행령 제48조 (세율 적용 기준)
[판례]
- 대법원 2021-세-12345호 (개인사업자 소득 인정 사례)"
!!! 💡 실전 팁 - 법률 RAG의 핵심: 정확한 조항 인용이 필수 - 버전 관리: 법령 개정에 따라 청크 버전 기록 - 신뢰도 표시: 최신 법령 기반 vs 판례 기반 구분 - 정기 검토: 월 1회 이상 법령 업데이트 확인
평가 및 최적화¶
RAG 성능 지표¶
| 지표 | 설명 | 목표 |
|---|---|---|
| 검색 정확도 (Precision) | 상위 K개 중 관련 문서 비율 | > 80% |
| 검색 재현율 (Recall) | 전체 관련 문서 중 검색된 비율 | > 75% |
| MRR (Mean Reciprocal Rank) | 첫 관련 문서의 순위 | > 0.8 |
| 생성 품질 (BLEU/ROUGE) | 생성 답변의 품질 | 모델별 상이 |
📝 핵심 정리¶
RAG 파이프라인 구성¶
- 문서 청킹: 의미 기반 청킹 추천 (512 토큰, 10% 겹침)
- 임베딩: 한국어 최적화 모델 사용 (text-embedding-3-large 또는 multilingual-e5-large-ko)
- 벡터 저장소: 규모와 성능에 맞는 저장소 선택
- 검색: 하이브리드 검색으로 정확도 향상
- 프롬프트: 역할 정의, 출처 강조, 형식 명시
최적화 포인트¶
- 검색 품질: 임베딩 모델 선택, 하이브리드 검색
- 생성 품질: 프롬프트 엔지니어링, 아웃풋 포맷
- 비용: 청크 크기, 저장소 선택, 배치 처리
한국 기업 구현 팁¶
- 법률/정책 문서는 정확한 조항 인용 필수
- 정기적인 문서 업데이트 프로세스 구축
- 메타데이터를 최대한 활용한 필터링
다음 단계¶
다음 페이지에서 RAG의 신뢰성 평가와 인용 관리 방법을 배우겠습니다.