티스토리 뷰

반응형

 

📘 시리즈: LLM + RAG + Ollama + NestJS 백엔드 연동 실습

7. 문서 분할(Chunking)과 전처리 – RAG 성능 최적화 전략


🎯 목표

이 글에서는 AI가 더 정확하고 유의미한 응답을 할 수 있도록,
문서 임베딩 전에 텍스트를 잘게 나누고(clean),
벡터 저장 성능과 검색 정확도를 높이는 기법을 소개합니다.


🧠 왜 문서 분할이 필요한가?

  • LLM의 입력 토큰 제한 존재
  • 한 번에 너무 많은 정보를 주면 정답률 저하
  • 벡터 검색에서 짧고 명확한 의미 단위가 더 유리

✂️ 문서 분할 전략

1. 고정 길이 분할 (Fixed-size chunking)

const splitter = new RecursiveCharacterTextSplitter({
  chunkSize: 500,     // 기본 500자 내외
  chunkOverlap: 50,   // 앞뒤 50자 겹치기
});
const docs = await splitter.createDocuments([text]);

💡 chunkOverlap은 문맥 연결을 위해 중요


2. 헤더 기반 분할 (Markdown, 법률문서 등)

반응형
const splitter = new MarkdownTextSplitter();
const docs = await splitter.createDocuments([text]);

langchain/text_splitter의 다양한 전략 사용 가능
XML, JSON, Code Splitter도 지원


🧹 전처리 전략 (Preprocessing)

전처리를 통해 불필요한 정보 제거 + 품질 향상:

  • 공백, 특수문자 정리
  • 목차, 페이지 번호 제거
  • 긴 숫자열, 반복 단어 제거

예시:

function cleanText(text: string) {
  return text
    .replace(/\s+/g, ' ')
    .replace(/Page \d+/g, '')
    .replace(/-{3,}/g, '')
    .trim();
}

🏗️ 전체 흐름: 분할 → 정제 → 임베딩

const rawText = await parsePdf(filePath);
const cleaned = cleanText(rawText);

const splitter = new RecursiveCharacterTextSplitter({ chunkSize: 500 });
const chunks = await splitter.createDocuments([cleaned]);

await this.vectorStore.addDocuments(chunks);

🧪 실전 테스트 팁

  • 비즈니스 보고서, 백서, 기술문서 등에 chunk 적용해 비교
  • 유사도 검색 결과의 품질을 직접 비교해보세요
  • similaritySearch() 시 검색 수(k)를 2~5로 조정하면서 확인

✅ 마무리

  • 문서 chunking은 RAG의 핵심 성능 요소입니다
  • 잘 쪼갤수록 더 정확하고 빠른 검색이 가능해집니다
  • 다음 단계는 문서 메타데이터 태깅, 캐시 전략으로 넘어갑니다

 

문서 chunking,RAG 성능 최적화,LangChain 텍스트 분할,AI 문서 전처리,NestJS LangChain 활용,텍스트 임베딩 품질 개선,LLM 입력 최적화,AI 검색 정확도 향상,RAG 검색 최적화 전략,LangChain chunk 실습


 

※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함
반응형