다양한 문서를 불러오는 법 — LangChain Document Loader

📌 3줄 요약
· Document Loader는 PDF·웹페이지·CSV 같은 다양한 원본을 LangChain이 다룰 수 있는 Document 객체로 바꿔 주는 입구입니다.
· 어떤 형식이든 불러오고 나면 본문(page_content)과 출처·페이지 같은 메타데이터(metadata)가 담긴 같은 모양으로 정리됩니다.
· 로더로 불러오기만 하면, 이후 분할 → 임베딩 → 검색(RAG)으로 매끄럽게 이어집니다.
원본 파일·URL → Document Loader → Document(본문+메타) → 분할·임베딩 → 검색·답변

앞선 글들에서 모델과 체인, 에이전트를 다뤘다면, 이번엔 그들이 읽을 재료를 준비하는 이야기입니다. 우리가 쓰는 지식은 PDF 보고서, 회사 홈페이지, 엑셀 표, 노션 문서처럼 제각각의 형식으로 흩어져 있습니다. 이 서로 다른 원본을 하나의 통일된 모양으로 정리해 주는 것이 바로 Document Loader(문서 로더)입니다. 이번 글에서는 로더가 무엇을 해 주는지, 어떤 종류가 있고 어떻게 불러오는지 정리해 보겠습니다.


📥 왜 문서를 '불러오는' 단계가 따로 필요할까

PDF는 페이지와 폰트 정보가 뒤섞여 있고, 웹페이지는 HTML 태그로 가득하며, CSV는 행과 열로 나뉘어 있습니다. 형식이 다르면 읽어 들이는 방법도 전부 다릅니다. 만약 형식마다 직접 파싱 코드를 짜야 한다면, 새로운 자료를 붙일 때마다 처음부터 다시 작업해야 하겠죠.

로더의 발상은 이렇습니다. 불러오는 방식은 형식마다 감추고, 나오는 결과는 항상 같은 모양으로 통일하자.

덕분에 우리는 "이건 PDF, 저건 웹페이지"를 신경 쓰지 않고, 불러온 다음의 일(분할·검색·요약)에만 집중할 수 있습니다. 형식이 늘어나도 뒷단 코드는 그대로 재사용됩니다.


🧱 Document 객체의 생김새

로더가 무엇을 불러오든, 결과는 Document라는 같은 형태로 돌아옵니다. 이 객체는 크게 두 부분으로 이뤄져 있습니다.

page_content (본문)
실제 텍스트 내용입니다. 모델이 읽고, 나중에 조각으로 나누고 임베딩하는 대상이 바로 이 부분입니다.
metadata (메타데이터)
출처 파일명, 페이지 번호, URL 같은 부가 정보입니다. 답변에 근거 출처를 붙일 때 요긴하게 쓰입니다.

이렇게 본문과 메타데이터가 한 세트로 묶이기 때문에, 나중에 "이 답의 근거가 몇 페이지에서 왔는지" 되짚어 볼 수 있습니다. RAG에서 출처 표기가 가능한 이유가 여기에 있습니다.


📚 자주 쓰는 로더 종류

LangChain에는 자료 형식별로 다양한 로더가 준비되어 있습니다. 대표적인 몇 가지를 정리하면 아래와 같습니다.

대상 불러오는 것 쓰임새
텍스트 파일.txt 등 순수 텍스트메모, 로그
PDF페이지 단위 본문보고서, 논문
웹페이지URL의 본문 텍스트뉴스, 블로그
CSV행 단위 데이터표, 목록
디렉터리폴더 안 여러 파일문서 묶음 일괄

이 밖에도 노션·구글 드라이브·유튜브 자막 등 수많은 로더가 있습니다. 종류는 많지만 사용법은 대체로 비슷해서, 하나만 익혀 두면 나머지도 금방 손에 익습니다.


💻 코드로 불러오기

로더의 사용 흐름은 형식이 달라도 거의 같습니다. 로더를 만들고 → load()로 불러오면 → Document 목록이 돌아옵니다.

# 1) 텍스트 파일 불러오기
from langchain_community.document_loaders import TextLoader

loader = TextLoader("notes.txt")
docs = loader.load()          # Document 리스트가 반환됨

print(docs[0].page_content)   # 본문 텍스트
print(docs[0].metadata)       # 예: {'source': 'notes.txt'}

# 2) PDF 불러오기 — 사용법이 거의 동일하다
from langchain_community.document_loaders import PyPDFLoader

pdf_docs = PyPDFLoader("report.pdf").load()
# 페이지마다 Document 하나, metadata에 page 번호가 담긴다

주목할 점은 어떤 로더를 쓰든 반환값이 같다는 것입니다. 텍스트든 PDF든 결국 page_content와 metadata를 가진 Document 목록이 나오므로, 그다음 단계의 코드는 형식과 무관하게 한 벌만 준비하면 됩니다.


⚠️ 자주 부딪히는 문제

로더는 단순해 보여도, 원본이 지저분하면 결과도 지저분해집니다. 아래 지점에서 자주 걸립니다.

깨진 인코딩
한글 텍스트가 글자가 깨져 들어오면 이후 전부 어긋납니다. 인코딩(UTF-8 등)을 명시해 불러오는 편이 안전합니다.
불필요한 잡음
웹페이지는 메뉴·광고 텍스트까지 함께 딸려 옵니다. 본문만 추리는 후처리가 필요할 때가 많습니다.
이미지형 PDF
스캔한 PDF는 글자가 이미지라 그냥은 못 읽습니다. 이때는 OCR을 거쳐야 텍스트가 나옵니다.

🔧 실무 팁

  • 메타데이터를 챙기세요 — 출처·페이지 정보를 잘 남겨 두면, 나중에 답변에 근거 링크를 붙이기가 훨씬 쉬워집니다.
  • 불러온 직후 확인 — 본문이 제대로 들어왔는지, 빈 문서는 없는지 앞부분만 출력해 눈으로 점검하세요.
  • 로딩과 분할은 다른 단계 — 로더는 '불러오기'까지만 합니다. 긴 문서를 조각내는 일은 다음 단계(Text Splitter)의 몫입니다.
  • 대량은 디렉터리 로더로 — 파일이 많으면 하나씩 열지 말고 폴더째 불러오는 로더가 편합니다.

❓ 자주 묻는 질문 (FAQ)

Q. 로더가 문서를 알아서 조각까지 내주나요?
A. 아니요. 로더는 불러오는 일까지만 합니다. 긴 본문을 검색하기 좋은 크기로 나누는 것은 Text Splitter라는 별도의 단계입니다. 둘을 구분해 두면 흐름이 명확해집니다.

Q. PDF 한 파일을 불러오면 Document가 하나인가요?
A. 대개는 페이지마다 하나씩 생깁니다. 그래서 metadata에 페이지 번호가 담기고, "몇 페이지에서 온 내용인지" 추적할 수 있습니다.

Q. 지원하지 않는 형식이면 어떻게 하나요?
A. 우선 텍스트로 변환한 뒤 텍스트 로더로 불러오거나, 직접 Document 객체를 만들어 넣을 수도 있습니다. 결과가 page_content와 metadata 형태이기만 하면 이후 단계는 동일하게 동작합니다.


마무리

정리하면, Document Loader는 제각각인 원본 자료를 본문과 메타데이터를 가진 통일된 Document로 바꿔 주는 입구입니다. 형식이 무엇이든 불러오고 나면 뒷단 코드는 그대로 재사용할 수 있고, 메타데이터 덕분에 나중에 출처까지 되짚을 수 있죠. 자료를 준비했으니, 다음 편에서는 이 긴 문서를 검색하기 좋은 크기로 나누는 Text Splitter 이야기로 이어 가겠습니다.

댓글

이 블로그의 인기 게시물

지하철 노선도로 이해하는 LangGraph (분기·반복 설계)

LangGraph State란 무엇인가? 상태 관리 개념 쉽게 이해하기

LangGraph Node와 Edge 개념 쉽게 이해하기 (초보자 완전 정리)