홈으로
🔍

RAG 검색 증강 생성

문서 기반 AI 시스템 구축의 모든 것

12시간
intermediate
6개 챕터
초급 과정으로 돌아가기

Chapter 2: 문서 처리와 청킹

RAG의 핵심, 문서를 AI가 이해할 수 있게 만들기

2.1 문서 처리의 중요성

다양한 형식의 문서를 일관된 형태로 변환

✅ 지원되는 문서 형식

PDF

PDF 문서

PyPDF2, PDFMiner 활용

DOC

Word 문서

python-docx 라이브러리

HTML

웹 페이지

BeautifulSoup4 파싱

TXT

텍스트 파일

UTF-8 인코딩 지원

⚠️ 문서 처리의 도전과제

  • 레이아웃 보존: 표, 그림, 헤더/푸터 처리
  • 인코딩 문제: 한글, 특수문자 깨짐 방지
  • 메타데이터: 작성자, 생성일, 페이지 번호
  • 품질 관리: OCR 오류, 불완전한 텍스트

💡 실무 팁

🔧 전처리 체크리스트:

  • ✓ 불필요한 공백, 개행 제거
  • ✓ 특수 문자 정규화
  • ✓ 중복 내용 제거

📊 메타데이터 활용:

  • ✓ 검색 필터링에 활용
  • ✓ 권한 관리 기준
  • ✓ 문서 출처 추적

2.2 청킹(Chunking) 전략

문서를 적절한 크기로 나누는 핵심 기술

1️⃣ 고정 크기 청킹

📏 설정 방법

청크 크기: 1000자

중첩(Overlap): 200자

분할 기준: 문장 단위

✅ 장점

  • • 구현이 간단
  • • 일관된 크기
  • • 처리 속도 빠름

❌ 단점

  • • 문맥 단절 가능
  • • 의미 단위 무시
  • • 품질 편차 발생

2️⃣ 의미적 청킹

🧠 작동 원리

1

문단별로 임베딩 생성

2

인접 문단 간 유사도 측정

3

유사도 기준으로 묶거나 분할

⚡ 실제 사용예시

청크 1: "회사 소개와 비전"

→ 회사 관련 문단들이 자연스럽게 묶임

청크 2: "제품 및 서비스"

→ 제품 설명 문단들이 논리적으로 그룹화

3️⃣ 중첩(Overlap) 전략

🔄 중첩의 필요성

❌ 중첩 없을 때

문장이 중간에 끊어져 의미 손실

✅ 중첩 있을 때

문맥 연결성 유지, 검색 품질 향상

📊 최적 중첩 비율

10-20%권장

일반적인 문서에 적합

30%고품질

기술 문서, 법률 문서용

2.3 실습: 문서 처리 파이프라인

실제 코드로 문서 처리와 청킹 구현

document_processor.py
class DocumentProcessor:
    """문서 처리 및 청킹 파이프라인"""
    
    def __init__(self, chunk_size=1000, chunk_overlap=200):
        self.chunk_size = chunk_size
        self.chunk_overlap = chunk_overlap
        
    def process_document(self, file_path):
        """메인 문서 처리 함수"""
        
        # 1. 파일 형식 감지
        file_type = self.detect_file_type(file_path)
        
        # 2. 문서 파싱
        if file_type == 'pdf':
            text = self.parse_pdf(file_path)
        elif file_type == 'docx':
            text = self.parse_docx(file_path)
        elif file_type == 'html':
            text = self.parse_html(file_path)
        else:
            text = self.parse_text(file_path)
        
        # 3. 텍스트 전처리
        cleaned_text = self.clean_text(text)
        
        # 4. 청킹
        chunks = self.create_chunks(cleaned_text)
        
        return chunks
    
    def create_chunks(self, text):
        """고정 크기 + 중첩 청킹"""
        
        chunks = []
        start = 0
        
        while start < len(text):
            # 청크 끝 위치 계산
            end = start + self.chunk_size
            
            # 문장 단위로 자르기 위해 마지막 마침표 찾기
            if end < len(text):
                last_period = text.rfind('.', start, end)
                if last_period > start:
                    end = last_period + 1
            
            # 청크 생성
            chunk = text[start:end].strip()
            if chunk:
                chunks.append({
                    'text': chunk,
                    'start_pos': start,
                    'end_pos': end,
                    'chunk_id': len(chunks)
                })
            
            # 다음 시작점 (중첩 고려)
            start = max(start + 1, end - self.chunk_overlap)
        
        return chunks

# 사용 예시
processor = DocumentProcessor(chunk_size=1000, chunk_overlap=200)
chunks = processor.process_document("company_policy.pdf")

print(f"총 {len(chunks)}개 청크 생성")
for i, chunk in enumerate(chunks[:3]):
    print(f"\nChunk {i+1}: {chunk['text'][:100]}...")

실무 베스트 프랙티스

청크 크기 최적화

  • • 짧은 문서: 500-800자
  • • 긴 문서: 1000-1500자
  • • 기술 문서: 1500-2000자
  • • 대화형 문서: 300-500자

메타데이터 활용

  • • 문서 제목, 작성자 기록
  • • 페이지 번호, 섹션 정보
  • • 생성일, 수정일 추적
  • • 태그, 카테고리 분류

품질 관리

  • • 빈 청크 필터링
  • • 중복 내용 제거
  • • 최소 길이 기준 설정
  • • 정기적인 품질 검증