7차시. 텍스트 분할 이해
5. 실습 ① — 기본 분할 해보기
출처: 원본 PDF 07차시_텍스트분할이해.pdf 11~12쪽 · 쪽 그림 11쪽 12쪽
이제 코드를 봅시다. 6차시에서 만든 load_documents를 그대로 씁니다.
📝 src/split_basic.py
from langchain_text_splitters import RecursiveCharacterTextSplitter
from ingest import load_documents # 6차시에서 만든 함수
docs = load_documents("data/manual.pdf")
splitter = RecursiveCharacterTextSplitter(
chunk_size=100, # 조각 하나의 최대 길이
chunk_overlap=20, # 겹치는 길이
separators=["\n\n", "\n", ". ", " ", ""], # 자를 곳 우선순위
length_function=len, # 길이를 세는 방법 (글자 수)
)
chunks = splitter.split_documents(docs)
print(f"원본 {len(docs)}쪽 → 조각 {len(chunks)}개")
print()
print("--- 0번 조각 ---")
print(chunks[0].page_content)
print()
print("메타데이터:", chunks[0].metadata)실습 코드 · 07/split_basic.py
실습 코드: 실습/src/07/split_basic.py · 위의 원본 PDF 7차시 11쪽 「5️⃣ 실습 ① — 기본 분할 해보기」과 이어집니다.
# ============================================================
# 7차시 | PPT: 07차시_텍스트분할이해.pptx
# 역할: 설명서 PDF를 작은 chunk로 나누고 첫 조각과 metadata를 출력
# 입력: ../../data/manual.pdf (06차시 ingest.load_documents 사용)
# 출력: 로딩 문장, 조각 개수, 첫 조각 본문, metadata
# 흐름:
# manual.pdf
# -> ingest.load_documents()
# -> RecursiveCharacterTextSplitter
# -> chunks -> print
# ============================================================
# Document: 본문(page_content)과 metadata를 담는 객체
# metadata: 파일 경로, 쪽 번호 등 부가 정보 딕셔너리
# chunk: 긴 문서를 잘라 낸 조각. 여기서도 Document입니다.
# overlap: 이웃 조각끼리 겹치는 글자 수 (chunk_overlap)
from langchain_community.document_loaders import PyPDFLoader
import os
import sys
# 분할기는 langchain_text_splitters 패키지에 따로 들어 있습니다.
from langchain_text_splitters import RecursiveCharacterTextSplitter
# 이 파일 위치를 기준으로 src/06을 import 경로에 넣습니다.
CURRENT_DIR = os.path.dirname(__file__)
INGEST_DIR = os.path.join(CURRENT_DIR, "..", "06")
# 맨 앞(0번)에 넣어서 다른 곳의 ingest보다 06 폴더의 것을 먼저 찾게 합니다.
sys.path.insert(0, INGEST_DIR)
# 6차시에 만든 함수를 그대로 다시 씁니다.
from ingest import load_documents
# 불러오는 동안 "N쪽 로딩 완료"가 출력됩니다.
docs = load_documents("../../data/manual.pdf")
# 문단, 줄, 문장, 공백 순으로 자르는 기준입니다. 길이는 len(글자 수)입니다.
# chunk_size=100은 실습용으로 작게 잡은 값입니다. 한글 문서의 출발점은 400~500입니다.
splitter = RecursiveCharacterTextSplitter(
chunk_size = 100,
chunk_overlap = 20,
separators=["\n\n", "\n", ". ", " ", ""],
length_function = len,
)
# split_documents는 Document 리스트를 받아 더 작은 Document 리스트를 돌려줍니다.
# 각 조각은 원래 쪽의 metadata를 그대로 물려받습니다.
chunks = splitter.split_documents(docs)
# 조각 수는 쪽 수(3)보다 훨씬 많아집니다.
print(len(chunks))
print(chunks[0].page_content)
# filename 값은 ingest.py에서 함수 호출 없이 넣었으므로 함수 객체가 보입니다.
print(chunks[0].metadata)실행 결과 샘플 (교안 기록. API 키가 필요한 코드는 키 없이 맞춘 예시이고, 모델의 답은 실행할 때마다 달라집니다)
===== 실행 결과 샘플 =====
실행: cd 실습/src/07
python split_basic.py
3쪽 로딩 완료 (총 1529 자)
21
1
제품 사용 설명서
가정용 공기청정기 AP-3300
목차
1. 제품 개요
2. 설치 방법
3. 사용 방법
4. 환불 및 교환 규정
5. 보증 및 무상 A/S
{'producer': 'ReportLab PDF Library - (opensource)', 'creator': '(unspecified)', 'creationdate': '2026-09-20T09:07:25+00:00', 'author': '', 'keywords': '', 'moddate': '2026-09-20T09:07:25+00:00', 'subject': '(unspecified)', 'title': '제품 사용 설명서 - 가정용 공기청정기 AP-3300', 'trapped': '/False', 'source': '../../data/manual.pdf', 'total_pages': 3, 'page': 0, 'page_label': '1', 'filename': <function basename at 0x0000026A7224F270>, 'page_no': 1}코드 해설
설명서 PDF를 작은 chunk로 나누고 첫 조각과 metadata를 출력입니다. 입력은 ../../data/manual.pdf (6차시 ingest.load_documents 사용)이고, 출력은 로딩 문장, 조각 개수, 첫 조각 본문, metadata입니다.
주석에 적힌 흐름입니다.
manual.pdf
-> ingest.load_documents()
-> RecursiveCharacterTextSplitter
-> chunks -> print코드 앞에서 고정해 두는 말입니다.
- Document: 본문(page_content)과 metadata를 담는 객체
- metadata: 파일 경로, 쪽 번호 등 부가 정보 딕셔너리
- chunk: 긴 문서를 잘라 낸 조각. 여기서도 Document입니다.
- overlap: 이웃 조각끼리 겹치는 글자 수 (chunk_overlap)
함수로 나누지 않고 위에서 아래로 실행됩니다.
CURRENT_DIR = os.path.dirname(__file__)— 이 파일 위치를 기준으로 src/06을 import 경로에 넣습니다.docs = load_documents("../../data/manual.pdf")— 불러오는 동안 "N쪽 로딩 완료"가 출력됩니다.splitter = RecursiveCharacterTextSplitter(— 문단, 줄, 문장, 공백 순으로 자르는 기준입니다. 길이는 len(글자 수)입니다.print(chunks[0].metadata)— filename 값은 ingest.py에서 함수 호출 없이 넣었으므로 함수 객체가 보입니다.
파일 맨 아래 실행 결과 샘플 주석은 실행되지 않습니다. 화면 출력은 다음 절에 다시 적어 두었습니다.
5-1) 실행 결과
✓ 2쪽 로딩 완료 (총 343자)
원본 2쪽 → 조각 6개
--- 0번 조각 ---
제품 사용 설명서
1. 제품 개요
본 제품은 가정용 공기청정기로 최대 10평 공간에
적합하며 HEPA 필터로 초미세먼지를 99.9% 제거합니다.
메타데이터: {'source': 'data/manual.pdf', 'page': 0,
'filename': 'manual.pdf', 'page_no': 1}💡 확인할 것 세 가지
① 조각 수가 늘어났습니다
12쪽 → 24조각. 페이지 하나가 평균 2조각으로 나뉘었습니다.
② metadata가 그대로 유지됩니다
조각으로 나눠도 출처 정보는 사라지지 않습니다.
그래서 나중에 "몇 페이지에서 왔는지" 말할 수 있습니다.
③ 문장이 중간에 끊기지 않았습니다
separators가 제대로 일했다는 뜻입니다.