생성형 AI 기반 RAG 개발자 과정
Session 12 · Text Splitter: 청크 최적화
생성형 AI 기반 RAG 개발자 과정

Text Splitter
청크 최적화

Session 12 / 33 — Day 2

검색 정확도의 숨은 70% — 청크 분할 전략

박수현 · (사)한국정보공학기술사회 · 2026

LLM 이론 · LangChain · ChromaDB CRUD · Agent — 4일 핸즈온
생성형 AI 기반 RAG 개발자 과정·Session 12 · Text Splitter: 청크 최적화출처: Day 2Text Splitter

이번 시간을 마치면

✂️ 분할 방식

  • Character Splitter
  • Recursive Splitter (권장)
  • Recursive 가 자연 경계를 따르는 원리

🎛️ 두 제어 변수

  • chunk size — 조각 크기
  • overlap — 경계 겹침
  • chunk 메타데이터(chunk_id)

🎯 목표: "작게=정밀 / 크게=문맥" 트레이드오프를 코드로 제어한다.

생성형 AI 기반 RAG 개발자 과정·Session 12 · Text Splitter: 청크 최적화출처: Day 2Text Splitter

분할 단계 — Loader 직후, 임베딩 직전

flowchart LR DOC["Document<br/>(긴 텍스트)"] --> SP["Text Splitter"] SP --> C1["chunk 1"] SP --> C2["chunk 2"] SP --> C3["chunk 3"] C1 --> EMB["임베딩 → 저장"] C2 --> EMB C3 --> EMB style SP fill:#fdcb6e22,stroke:#fdcb6e style EMB fill:#00b89422,stroke:#00b894

💡 검색은 chunk 단위로 수행된다 → chunk 가 곧 검색의 최소 단위.

생성형 AI 기반 RAG 개발자 과정·Session 12 · Text Splitter: 청크 최적화출처: Day 2Text Splitter

과대도 과소도 부적합한 chunk 크기

❌ 과대할 때

  • 한 chunk 에 여러 주제 → 잡음 혼입
  • 검색 정확도 저하, context 낭비

❌ 과소할 때

  • 문장이 끊겨 문맥 손상
  • 지시어("이것/그것")의 참조 대상 소실

✅ 적정할 때

  • 질문 하나에 답할 최소 충분량
  • 정확·저비용·고속
문서 권장 chunk
규정·매뉴얼 작게 (400~600)
서술·논문 크게 (800~1200)

🔑 Day1 S6 의 "질문 하나에 답할 만큼" 기준을 구체적인 수치로 확정하는 단계.

생성형 AI 기반 RAG 개발자 과정·Session 12 · Text Splitter: 청크 최적화출처: Day 2Text Splitter

청크 경계 결정 기준

flowchart TB CH["Character Splitter<br/>고정 글자 수로 절단"] --> CHX["문장 중간 절단 → 의미 단절"] RC["Recursive Splitter<br/>문단 → 문장 → 단어 순"] --> RCO["자연 경계 우선 → 의미 보존 ✅"] style CH fill:#ff767622,stroke:#ff7676 style RC fill:#00b89422,stroke:#00b894 style RCO fill:#00b89411,stroke:#00b894
  • Character: 단일 구분자(\n\n 등)로만 분할 — 단순하지만 크기 불균일·문장 절단 발생
  • Recursive: \n\n(문단) → \n(줄) → (단어) 순으로 자연 경계를 우선 적용 → 실무 기본은 RecursiveCharacterTextSplitter
생성형 AI 기반 RAG 개발자 과정·Session 12 · Text Splitter: 청크 최적화출처: Day 2Text Splitter

권장 분할기 — Recursive (스니펫)

from langchain_text_splitters import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,        # 조각당 최대 글자
    chunk_overlap=80,      # 인접 조각 겹침 (경계 보존)
)
chunks = splitter.split_documents(docs)
print(len(chunks), chunks[0].metadata)
  • split_documents → 메타데이터(source·page) 자동 승계
  • chunk_size / chunk_overlap 만 조정해 튜닝
  • 토큰 과금(OpenAI) 정밀 관리 → .from_tiktoken_encoder(...)토큰 단위 분할

📁 비교 예제: 2.langchain/7.RAG/2.loaders/2.3_chunking.py (Character · Recursive · tiktoken 3종 비교)

생성형 AI 기반 RAG 개발자 과정·Session 12 · Text Splitter: 청크 최적화출처: Day 2Text Splitter

overlap 으로 경계 문장 보존

flowchart LR A["chunk 1<br/>…환불 정책은"] --- O["겹침<br/>(overlap)"] O --- B["chunk 2<br/>환불 정책은 7일…"] style O fill:#fdcb6e33,stroke:#fdcb6e

overlap 이 없으면

  • chunk 경계에서 문장이 분절
  • 핵심 정보가 두 chunk 로 분산되어 검색 실패

overlap 이 있으면

  • 한 chunk 의 끝 N글자가 다음 chunk 앞에 재수록
  • 경계 문장을 양쪽 chunk 에 모두 포함
  • 통상 chunk size 의 10~20%
생성형 AI 기반 RAG 개발자 과정·Session 12 · Text Splitter: 청크 최적화출처: Day 2Text Splitter

chunk_size / overlap 슬라이딩 윈도우

chunking with overlap

RecursiveCharacterTextSplitter · chunk_size/overlap 슬라이딩 윈도우, 경계에서 겹쳐 문맥 손실 방지

생성형 AI 기반 RAG 개발자 과정·Session 12 · Text Splitter: 청크 최적화출처: Day 2Text Splitter

조각별 출처 정보 부여 (스니펫)

for i, c in enumerate(chunks):
    c.metadata["chunk_id"] = i          # 몇 번째 조각인지
    # source·page 는 split_documents 가 이미 승계

print(chunks[5].metadata)
# {'source': 'faq.pdf', 'page': 2, 'chunk_id': 5}
  • source + page + chunk_id정확한 출처 인용의 기반
  • Day2 RAG Chain(S16)·Day3 출처 표시(S22)에서 그대로 활용

📁 참고: 2.langchain/7.RAG/2.loaders/2.4_metadata.py

생성형 AI 기반 RAG 개발자 과정·Session 12 · Text Splitter: 청크 최적화출처: Day 2Text Splitter

실전 튜닝 — 증상별 조정 기준

증상 조정
답이 단편적·문맥 부족 chunk size , overlap ↑
검색에 엉뚱한 내용 섞임 chunk size (더 정밀하게)
경계에서 정보 누락 overlap ↑ (10→20%)
표·코드가 깨짐 문서별 분할 기준 조정

💡 고정된 정답은 없다 → 문서 단위 실험으로 결정. 동일 질문 세트로 답 품질을 비교하며 size·overlap 을 조정한다.

생성형 AI 기반 RAG 개발자 과정·Session 12 · Text Splitter: 청크 최적화출처: Day 2Text Splitter

핵심 5가지

  1. ✅ 검색은 chunk 단위 → 분할이 RAG 품질의 주요 변수
  2. Recursive = 문단→문장→단어 자연 경계 (실무 기본)
  3. chunk size: 작게=정밀 / 크게=문맥
  4. overlap(10~20%)으로 경계 문장 보존
  5. source·page·chunk_id 메타데이터 = 출처 추적의 기반
1 / 11

목차 — Session 12

키보드 단축키 (뷰어)

네비게이션

다음 슬라이드 Space
이전 슬라이드 PgUp
처음 / 끝Home End
목차M

화면

전체화면F
테마 전환D
글자 크게 / 작게+ -
원래 크기 (100%)=
도움말 (열기/닫기)H ?
닫기 (모든 오버레이)Esc
강의 종료 (메인으로)Q

키보드 단축키 (강사)

네비게이션

다음 슬라이드 Space
이전 슬라이드 PgUp
처음 / 끝Home End
목차 (Menu)M
전체화면F

화면

테마 전환D
도움말 (열기/닫기)H ?
닫기 (모든 오버레이)Esc
툴바 펼치기 / 접기[ ]
강의 종료 (메인으로)Q

화면 확대

글자 크게 / 작게+ -
원래 크기 (100%)=
돋보기 (마우스 따라 2× 확대)V

발표자 도구 (PPT 호환)

화이트 화면W ,
블랙 화면B .
레이저 포인터L
펜 모드 ON/OFFP
펜 색상1 2 3 4
펜 자국 지우기 (현재 슬라이드)E
펜 — 마지막 스트로크 취소 (Undo)Z
펜 — 다시 (Redo)R
⏰ 쉬는시간 타이머T
📱 노트뷰 QR (휴대폰 동기화)N

PDF / 종료

PDF 저장 (슬라이드)Ctrl+P
강의 종료 (메인으로)Q X