RAG에서 Text를 분할하는 내용 위주로 정리하였다.

01. Document Loader

  • 다양한 파일 형식을 LangChain 문서 객체(Document)로 불러오기 위한 도구.

1) TextLoader

  • 단일 텍스트 파일 로드에 사용
  • autodetect_encoding=True로 인코딩 자동 추정 가능 → 혼합 코퍼스 처리에 유용
  • load() / lazy_load() 선택 (메모리 vs 속도 트레이드오프)
from langchain_community.document_loaders import TextLoader

loader = TextLoader("sample.txt", autodetect_encoding=True)
docs = loader.load()

2) DirectoryLoader

  • 특정 폴더 내 패턴과 일치하는 모든 파일을 로드
  • glob="*/.txt" 패턴 지원
  • 멀티스레딩 I/O, 에러 핸들링 제공
  • load() / lazy_load() 지원
from langchain_community.document_loaders import DirectoryLoader

loader = DirectoryLoader("data/", glob="**/*.txt", use_multithreading=True)
docs = loader.load()

3) CSVLoader

  • CSV 파일 로드 → 행(row)=1 Document
  • csv_args={"delimiter": ","} 등 파서 제어 가능
  • source_column 지정 시 문서 출처 메타데이터 기록 가능
from langchain_community.document_loaders import CSVLoader

loader = CSVLoader("data/articles.csv", source_column="source")
docs = loader.load()

4) UnstructuredMarkdownLoader

  • 마크다운 파일(.md) 로드 (추가 라이브러리 unstructured 필요)
  • mode="single": 문서 전체 / mode="elements": 제목·본문 등 요소별로 분리
  • 헤더·리스트 구조 보존 가능
from langchain_community.document_loaders import UnstructuredMarkdownLoader

loader = UnstructuredMarkdownLoader("notes.md", mode="elements")
docs = loader.load()

02. Text Splitter

  • 긴 문서를 LLM이 다룰 수 있는 chunk 단위로 나누는 모듈.

1) RecursiveCharacterTextSplitter

  • 단락 → 문장 → 단어 순 재귀 분할
  • 주요 파라미터
    • chunk_size: 최대 길이(문자 단위)
    • chunk_overlap: 청크 간 겹침(정보 손실 방지)
    • separators: 우선 분할 기준 (예: ["\n\n", "\n", " ", ""])
    • add_start_index=True: 원문 내 시작 위치를 메타데이터에 기록
from langchain_text_splitters import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=150)
chunks = splitter.split_documents(docs)

2) TokenTextSplitter

  • 모델 토크나이저 기준으로 일정 크기로 분할
  • 장점: 토큰 예산 안정적 관리, 과소/과대 분할 감소
from langchain_text_splitters import TokenTextSplitter

splitter = TokenTextSplitter(encoding_name="cl100k_base", chunk_size=400, chunk_overlap=40)
chunks = splitter.split_documents(docs)

3) MarkdownHeaderTextSplitter

  • 마크다운 파일 구조(헤더)를 활용해 의미 단위 분할
  • 지정 헤더 레벨 기준 섹션 분리
  • 필요시 2단 분할(헤더 → 토큰)로 균질화 가능
from langchain_text_splitters import MarkdownHeaderTextSplitter

headers = [("#", "h1"), ("##", "h2"), ("###", "h3")]
splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers)
sections = splitter.split_text(open("notes.md").read())

4) PythonCodeTextSplitter

  • 코드 전용 분리기
  • 함수·클래스 등 구문 단위 경계 기준 분할
  • 코드 검색/리트리벌 시 문맥 유지에 유리
from langchain_text_splitters import PythonCodeTextSplitter

splitter = PythonCodeTextSplitter(chunk_size=800, chunk_overlap=80)
chunks = splitter.split_text(open("app.py").read())
profile
2025화이팅!

0개의 댓글