초급 과정으로 돌아가기
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자
메타데이터 활용
- • 문서 제목, 작성자 기록
- • 페이지 번호, 섹션 정보
- • 생성일, 수정일 추적
- • 태그, 카테고리 분류
품질 관리
- • 빈 청크 필터링
- • 중복 내용 제거
- • 최소 길이 기준 설정
- • 정기적인 품질 검증