Spring AI 시리즈 9화 – RAG 구축하기 (4): 문서 포맷 처리와 Text Chunking 전략
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
- 청크당 토큰 수는 300~500 tokens 이하가 적당
- 중요한 키워드가 포함된 문장은 청크 시작점에 오도록 조정
- HTML이나 Markdown은 태그 제거 후 텍스트만 사용
- PDF는 페이지마다 별도 청크 처리 → 페이지 번호 메타데이터 추가
- 청크에 질문-답변 구조가 있다면 별도 필드로 분리 추천
요약
단계역할
DocumentReader | 다양한 문서 포맷을 읽어 텍스트로 변환 |
TextSplitter | 텍스트를 LLM 최적화 단위로 분할 |
Document | 텍스트 + 메타데이터를 담은 구조체로 저장 |
결과 | VectorStore에 저장 → RAG 검색 대상이 됨 |