사내 문서 검색용 RAG 시스템을 구축 중인데, 문서 청킹(chunking) 전략에서 막혔습니다.
현재 상황:
- 사내 기술 문서 약 2,000개 (마크다운, PDF)
- 문서 길이: 500자 ~ 10,000자
- OpenAI embedding + Pinecone 사용 예정
- LangChain 기반
단순히 고정 크기(512 토큰)로 자르면 문맥이 깨지는 경우가 많고, 의미 단위로 자르면 크기가 들쭉날쭉해서 검색 품질이 안정적이지 않습니다.
실무에서 효과적인 청킹 전략이 궁금합니다.
댓글 5
1. **1차: 구조 기반 분할** - 마크다운 헤딩(##, ###) 기준으로 의미 단위 분리
2. **2차: 크기 조절** - 너무 큰 청크는 문단 단위로 재분할, 너무 작은 건 병합
3. **오버래핑** - 청크 간 20% 정도 오버랩으로 문맥 유지
```python
from langchain.text_splitter import MarkdownHeaderTextSplitter, RecursiveCharacterTextSplitter
# 1단계: 마크다운 구조 기반 분할
md_splitter = MarkdownHeaderTextSplitter(
headers_to_split_on=[("##", "Section"), ("###", "Subsection")]
)
# 2단계: 크기 조절
child_splitter = RecursiveCharacterTextSplitter(
chunk_size=500, chunk_overlap=100,
separators=["\n\n", "\n", ". ", " "]
)
```
추가로 **Parent Document Retriever** 패턴을 쓰면, 작은 청크로 검색하되 큰 부모 청크를 LLM에 전달할 수 있어서 검색 정확도와 문맥 보존을 동시에 잡을 수 있습니다.
PDF는 먼저 마크다운으로 변환(pymupdf4llm 추천) 후 같은 파이프라인을 적용하세요.