기술과 산업/언어 및 프레임워크

Spring AI 시리즈 9화 – RAG 구축하기 (4): 문서 포맷 처리와 Text Chunking 전략

B컷개발자 2025. 6. 22. 13:19
728x90

RAG 시스템에서 문서 기반 응답을 구성하려면 다양한 문서 포맷을 파싱하고 의미 있는 단위로 분할하는 청크 전략이 핵심입니다. Spring AI의 문서 처리 컴포넌트 사용법과 실전에서 적용 가능한 Text Chunking 기법을 정리합니다.

 

 

문서를 넣으면 “LLM이 알아서 다 한다”?

 

많은 개발자들이 이렇게 생각합니다.

 

“PDF나 HTML을 넣으면 GPT가 알아서 문서를 읽고 답해주겠지.”

 

그러나 실제로는 그렇지 않습니다.

LLM은 길고 복잡한 문서를 한 번에 잘라내서 던져주면 오히려 문맥을 잃고 무의미한 답을 할 확률이 높습니다.

 

따라서 문서를 LLM이 이해할 수 있는 단위로 잘게 쪼개는 작업,

Text Chunking 전략이 RAG 시스템의 응답 품질을 좌우합니다.

 


 

Spring AI의 문서 처리 기본 구조

 

Spring AI는 다음과 같은 구성요소를 통해 다양한 문서를 처리하고,

벡터화 및 검색을 위한 전처리를 제공합니다.

컴포넌트역할

DocumentReader PDF, HTML, TXT, MD 파일을 로딩하여 문자열로 변환
TextSplitter 긴 텍스트를 적절한 크기의 청크로 나눔
Document 청크 단위로 저장되는 구조체 (텍스트 + 메타데이터 포함)

 


 

지원 문서 포맷

 

현재 spring-ai-document 모듈은 다음 포맷을 기본 지원합니다:

 

  • .pdf (Apache PDFBox 기반)
  • .html, .htm
  • .md (Markdown, Github 스타일)
  • .txt (Plain text)

 

추가적으로 XML, DOCX 등을 확장하려면 커스텀 DocumentReader를 구현하면 됩니다.

 


 

실전 예시 – PDF 문서를 벡터화 가능한 청크로 나누기

@Autowired
private PdfDocumentReader pdfReader;

@Autowired
private TokenTextSplitter textSplitter;

public List<Document> loadAndSplit(Path filePath) {
    List<Document> rawDocs = pdfReader.read(filePath);
    return textSplitter.split(rawDocs);
}

Spring AI의 PdfDocumentReader는 PDF를 내부적으로 페이지 단위로 파싱하고,

TokenTextSplitter는 GPT의 토큰 수를 기준으로 청크를 나눕니다.

 


 

Text Splitter 전략 – 단어 기반 vs 토큰 기반

 

 

1. 

TokenTextSplitter

 

GPT의 토큰 수(예: 300~500 tokens)를 기준으로 분할

→ 모델에 최적화된 구조

TokenTextSplitter splitter = new TokenTextSplitter(300, 50); // maxSize, overlap

 

  • maxSize: 한 청크의 최대 토큰 수
  • overlap: 문맥 유지를 위한 앞뒤 겹침 영역

 

 

2. 

LineTextSplitter

 

줄바꿈 또는 특정 구분자로 분할

→ 문서 구조를 어느 정도 유지 가능

LineTextSplitter splitter = new LineTextSplitter();

 

  • 뉴스, 이메일, FAQ 등에서는 각 줄이 의미 단위일 때 유리

 


 

왜 Overlap이 중요한가?

[청크 1]
... 이 기술은 제조업에서 매우 중요하다. 그 이유는 다음과 같다...

[청크 2]
... 첫째, 품질 관리 비용이 줄어든다. 둘째, 생산성이 향상된다...

위처럼 문장 중간에서 청크가 끊기면 문맥이 사라집니다.

따라서 앞뒤 청크에 일정 구간을 중복 삽입하면 LLM이 답변 시 문맥을 더 정확히 추론할 수 있습니다.

 


 

실전 시나리오별 Chunking 전략

시나리오추천 Splitter청크 길이Overlap

기술 매뉴얼 (PDF) TokenTextSplitter 300 tokens 50 tokens
고객 FAQ (TXT) LineTextSplitter 5~10줄 없음
웹페이지 콘텐츠 (HTML) TokenTextSplitter 200 tokens 30 tokens
회의록 (MD) LineTextSplitter 단락별 약간의 중첩

 


 

문서의 메타데이터도 같이 저장하자

 

Spring AI의 Document 객체는 단순히 텍스트만 담는 게 아니라

문서 제목, 페이지 번호, 원본 파일 경로 등 메타데이터도 함께 포함할 수 있습니다.

Document doc = new Document(text, Map.of(
    "fileName", "회계정책.pdf",
    "page", "12",
    "source", "internal"
));

이런 메타데이터는 검색 결과에 “출처”를 포함하거나,

사용자에게 답변 근거를 명시할 때 유용합니다.

 


 

문서 전처리 Best Practices

 

  1. 청크당 토큰 수는 300~500 tokens 이하가 적당
  2. 중요한 키워드가 포함된 문장은 청크 시작점에 오도록 조정
  3. HTML이나 Markdown은 태그 제거 후 텍스트만 사용
  4. PDF는 페이지마다 별도 청크 처리 → 페이지 번호 메타데이터 추가
  5. 청크에 질문-답변 구조가 있다면 별도 필드로 분리 추천

 


 

요약

단계역할

DocumentReader 다양한 문서 포맷을 읽어 텍스트로 변환
TextSplitter 텍스트를 LLM 최적화 단위로 분할
Document 텍스트 + 메타데이터를 담은 구조체로 저장
결과 VectorStore에 저장 → RAG 검색 대상이 됨

 

728x90