검색 정확도의 숨은 70% — 청크 분할 전략
박수현 · (사)한국정보공학기술사회 · 2026
🎯 목표: "작게=정밀 / 크게=문맥" 트레이드오프를 코드로 제어한다.
💡 검색은 chunk 단위로 수행된다 → chunk 가 곧 검색의 최소 단위.
| 문서 | 권장 chunk |
|---|---|
| 규정·매뉴얼 | 작게 (400~600) |
| 서술·논문 | 크게 (800~1200) |
🔑 Day1 S6 의 "질문 하나에 답할 만큼" 기준을 구체적인 수치로 확정하는 단계.
\n\n 등)로만 분할 — 단순하지만 크기 불균일·문장 절단 발생\n\n(문단) → \n(줄) → (단어) 순으로 자연 경계를 우선 적용 → 실무 기본은 RecursiveCharacterTextSplitterfrom 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 만 조정해 튜닝.from_tiktoken_encoder(...) 로 토큰 단위 분할📁 비교 예제:
2.langchain/7.RAG/2.loaders/2.3_chunking.py(Character · Recursive · tiktoken 3종 비교)

RecursiveCharacterTextSplitter · chunk_size/overlap 슬라이딩 윈도우, 경계에서 겹쳐 문맥 손실 방지
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 → 정확한 출처 인용의 기반📁 참고:
2.langchain/7.RAG/2.loaders/2.4_metadata.py
| 증상 | 조정 |
|---|---|
| 답이 단편적·문맥 부족 | chunk size ↑, overlap ↑ |
| 검색에 엉뚱한 내용 섞임 | chunk size ↓ (더 정밀하게) |
| 경계에서 정보 누락 | overlap ↑ (10→20%) |
| 표·코드가 깨짐 | 문서별 분할 기준 조정 |
💡 고정된 정답은 없다 → 문서 단위 실험으로 결정. 동일 질문 세트로 답 품질을 비교하며 size·overlap 을 조정한다.
source·page·chunk_id 메타데이터 = 출처 추적의 기반