RAG2026-5일6차시 · 문서 로딩 실습15 / 19← 이전목차다음 →MetaContents

6차시. 문서 로딩 실습

실습 1 — 문서 로딩 실습 실습 따라 하기

관련 수업 자료: 6차시 「4. 실습 ① — 텍스트 파일 읽기」(8~9쪽), 6차시 「5. 실습 ② — PDF 읽기」(10~11쪽), 6차시 「10. 이번 차시 실습 정리」(19쪽) · 실습 코드 06/load_text.py, 06/load_pdf.py, 06/validate.py, 06/ingest.py

이 실습은 교안 해설(06_문서로딩실습.md)의 실습 순서를 옮긴 것입니다. OpenAI 임베딩이나 채팅 모델을 부르는 파일은 .env 에 API 키가 있어야 돌아갑니다. 키가 없으면 실행 결과 샘플로 출력 모양을 확인합니다.

수업 자료와 이어지는 곳

실습 코드원본 PDF이어지는 내용
06/load_text.py8쪽6차시 「4. 실습 ① — 텍스트 파일 읽기」 › 4-2) 코드 작성 아래에 실었습니다
06/load_pdf.py10쪽6차시 「5. 실습 ② — PDF 읽기」 › 5-1) 코드 작성 아래에 실었습니다
06/validate.py10쪽6차시 「5. 실습 ② — PDF 읽기」 › 5-1) 코드 작성 아래에 실었습니다
06/ingest.py19쪽6차시 「10. 이번 차시 실습 정리」 아래에 실었습니다

실행 흐름

출력
TXT 또는 PDF → Loader
Loader → Document 목록
Document 목록 → 잡음 제거
잡음 제거 → metadata 보강
metadata 보강 → 빈 페이지 확인

실습 순서

실습/src/06에서 순서대로 실행합니다.

Bash
python load_text.py
python load_pdf.py
python validate.py
python ingest.py

load_text.py는 이름과 달리 PDF를 읽도록 원본이 작성되어 있습니다. 파일 위 주석에 그 점을 적었습니다. 실행 위치는 이 폴더입니다.

스스로 확인

  • TXT 1개와 PDF 여러 페이지의 Document 개수가 왜 다른가?
  • metadata가 없으면 출처를 왜 말할 수 없는가?
  • 빈 page_content는 로더를 바꿔서 해결되는 문제인가?

코드 설명

  • loader.load() 는 Document 리스트를 돌려줍니다. 결과가 하나뿐이어도 리스트이므로 본문은 documents[0].page_content 처럼 번호를 붙여 꺼냅니다.
  • PyPDFLoader("../../data/notice.pdf") 의 경로는 실행 위치 기준입니다. 실습/src/06 이 아닌 곳에서 실행하면 FileNotFoundError가 납니다. 여기서 많이들 헷갈리십니다.
  • metadata 의 page 는 0부터 셉니다. notice.pdf의 첫 쪽이 'page': 0, 'page_label': '1' 로 찍히는 까닭입니다.
  • if len(text) < 10: 은 validate.py가 스캔 PDF를 골라내는 기준입니다. notice.pdf는 본문이 길어서 이 조건에 걸리지 않고, 그래서 아무것도 출력되지 않습니다.
  • ingest.py의 re.sub(r"\n{3,}", "\n\n", text) 는 결과를 text 에 다시 넣지 않아 본문이 바뀌지 않습니다. 수업 자료 10절처럼 text = re.sub(...) 로 받아야 합니다.
  • ingest.py의 os.path.basename 은 괄호가 없어 파일 이름 대신 함수 자체가 metadata에 들어갑니다. os.path.basename(path) 로 호출해야 notice.pdf 가 들어갑니다.
← 이전 절6차시 · 체크리스트와 과제다음 절 →6차시 · 퀴즈 1 — 쪽 번호가 붙은 Document 딕셔너리 만들기