RAG2026-5일7차시 · 텍스트 분할 이해9 / 19← 이전목차다음 →MetaContents

7차시. 텍스트 분할 이해

6. 실습 ② — overlap을 눈으로 확인하기

출처: 원본 PDF 07차시_텍스트분할이해.pdf 13쪽 · 쪽 그림 13쪽

개념 설명만으로는 잘 와닿지 않습니다. 직접 겹치는 부분을 봅시다.

📝 src/check_overlap.py

Python
def show_boundary(chunks, i=0):
    print(f"=== {i}번 조각의 마지막 80자 ===")
    print(chunks[i].page_content[-80:])
    print()
    print(f"=== {i+1}번 조각의 처음 80자 ===")
    print(chunks[i+1].page_content[:80])
    print()
    print("▶ 위아래에 같은 문장이 보이면 overlap 정상 작동!")
# 3·4번 조각 사이가 실제로 겹치는 지점입니다
show_boundary(chunks, 3)

실습 코드 · 07/check_overlap.py

실습 코드: 실습/src/07/check_overlap.py · 위의 원본 PDF 7차시 13쪽 「6️⃣ 실습 ② — overlap을 눈으로 확인하기」과 이어집니다.

Python
# ============================================================
# 7차시 | PPT: 07차시_텍스트분할이해.pptx
# 역할: chunk_overlap 때문에 이웃 조각의 경계가 겹치는지 확인
# 입력: ../../data/manual.pdf
# 출력: 로딩 문장, 0번 조각의 끝 20자, 1번 조각의 앞 20자
# 흐름:
#   manual.pdf -> load_documents
#     -> 페이지 본문을 한 문자열로 합침
#     -> splitter (크기 30, 겹침 20)
#     -> show_boundary()
# ============================================================
# Document: 본문과 metadata를 담는 객체. 여기서는 합친 글 전체를 담습니다.
# chunk: 잘라 낸 조각. overlap: 앞 조각 끝과 다음 조각 시작이 겹치는 글자 수

from langchain_community.document_loaders import PyPDFLoader
import os
import sys

from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_core.documents import Document

CURRENT_DIR = os.path.dirname(__file__)
INGEST_DIR = os.path.join(CURRENT_DIR, "..", "06")
sys.path.insert(0, INGEST_DIR)

from ingest import load_documents

docs = load_documents("../../data/manual.pdf")

# 크기를 30, 겹침을 20으로 두어 경계가 잘 보이게 합니다.
splitter = RecursiveCharacterTextSplitter(
    # chunk_size = 100,
    chunk_size = 30,
    chunk_overlap = 20,
    separators=["\n\n", "\n", ". ", " ", ""],
    length_function = len,
)

# chunk_overlap 내용을 알려면?
# chunks = splitter.split_documents(docs)
# for i in range(len(chunks) - 1):
#     print(f"Chunk {i} 끝: {chunks[i].page_content[-50:]!r}")
#     print(f"Chunk {i + 1} 시작: {chunks[i + 1].page_content[:50]!r}")
#     print()

# 페이지를 따로 자르면 경계가 페이지에서 끊깁니다. 글을 한 덩어리로 합칩니다.
full_text = ""

for doc in docs:
    full_text += doc.page_content + "\n\n"

merged_doc = Document(page_content = full_text)

chunks = splitter.split_documents([merged_doc])

def show_boundary(chunks, index=0):
    # index 조각의 마지막 20자와 다음 조각의 처음 20자를 출력합니다.
    print(chunks[index].page_content[-20:])
    print()
    print(chunks[index+1].page_content[:20])
    print('='*50)

show_boundary(chunks, 0)

실행 결과 샘플 (교안 기록. API 키가 필요한 코드는 키 없이 맞춘 예시이고, 모델의 답은 실행할 때마다 달라집니다)

출력
===== 실행 결과 샘플 =====
실행: cd 실습/src/07
      python check_overlap.py
3쪽 로딩 완료 (총 1529 자)
명서
가정용 공기청정기 AP-3300

가정용 공기청정기 AP-3300
목차
==================================================

코드 해설

chunk_overlap 때문에 이웃 조각의 경계가 겹치는지 확인입니다. 입력은 ../../data/manual.pdf이고, 출력은 로딩 문장, 0번 조각의 끝 20자, 1번 조각의 앞 20자입니다.

주석에 적힌 흐름입니다.

출력
manual.pdf -> load_documents
-> 페이지 본문을 한 문자열로 합침
-> splitter (크기 30, 겹침 20)
-> show_boundary()

코드 앞에서 고정해 두는 말입니다.

  • Document: 본문과 metadata를 담는 객체. 여기서는 합친 글 전체를 담습니다.
  • chunk: 잘라 낸 조각. overlap: 앞 조각 끝과 다음 조각 시작이 겹치는 글자 수

함수와 클래스로 나누어 읽습니다.

  • show_boundary: 이름 그대로 한 가지 일만 합니다. 본문 주석을 같이 읽습니다.

파일 맨 아래 실행 결과 샘플 주석은 실행되지 않습니다. 화면 출력은 다음 절에 다시 적어 두었습니다.

6-1) overlap 있을 때 vs 없을 때

출력
■ chunk_overlap = 20 일 때
─────────────────────────────
=== 3번 조각의 마지막 80자 ===
을 신청할 수 있으며 단순 변심으로 환불하는 경우 왕복
배송비는 고객이 부담하고 제품에 불량이 있는 경우에는
30일 이내에 무상으로 교환해드리며
=== 4번 조각의 처음 80자 ===
30일 이내에 무상으로 교환해드리며 이때 배송비는
회사가 부담합니다
        ↑ "30일 이내에 무상으로 교환해드리며" 겹침 확인!

■ chunk_overlap = 0 일 때
─────────────────────────────
=== 3번 조각의 마지막 80자 === (동일)
=== 4번 조각의 처음 80자 ===
이때 배송비는 회사가 부담합니다
  ↑ 겹치는 부분이 전혀 없음

⚠️ 직접 실행해보세요
chunk_overlap 값을 0과 50으로 각각 바꿔가며
show_boundary를 실행해보세요.
글로 읽는 것보다
직접 눈으로 확인하는 것이 열 배 빠릅니다.

← 이전 절7차시 · 5. 실습 ① — 기본 분할 해보기다음 절 →7차시 · 7. 실습 ③ — chunk_size 비교 실험