시맨틱 청킹
시맨틱 청킹은 문서를 글자 수 같은 고정 단위가 아니라 의미 경계를 기준으로 분할하는 방식입니다. 인접한 문장 임베딩 사이의 유사도가 크게 떨어지는 지점을 찾아 그곳에서 끊어, 의미적으로 응집된 청크를 만드는 RAG 분할 전략입니다.
- 시맨틱 청킹은 문서를 글자 수가 아니라 의미 경계 기준으로 나누는 청킹 전략으로, 인접 문장 임베딩의 유사도가 크게 떨어지는 지점에서 끊습니다.
- 청킹(chunking) 자체가 상위 개념이며, 시맨틱 청킹은 그중 '어디서 끊을지'를 임베딩 유사도로 결정하는 의미 기반 분할 방식입니다.
- LangChain의 SemanticChunker와 LlamaIndex의 SemanticSplitterNodeParser가 대표 구현이며, 백분위수·표준편차·사분위수 같은 임계값으로 분할점을 정합니다.
- 의미적으로 응집된 청크는 검색 정확도를 높일 잠재력이 있지만, 임베딩 호출 비용이 추가됩니다.
- 2024년 평가 연구(arXiv:2410.13070)는 시맨틱 청킹의 이득이 일관적이지 않으며 추가 연산 비용을 정당화하기에 부족한 경우가 많다고 결론지었습니다.
시맨틱 청킹이란
시맨틱 청킹(Semantic Chunking)은 문서를 의미 경계를 기준으로 분할하는 방식입니다. 문장이나 작은 단위를 차례로 임베딩한 뒤, 인접한 조각들 사이의 임베딩 유사도(보통 코사인 거리)를 측정하고, 유사도가 급격히 떨어지는 지점(거리가 큰 지점)을 분할점으로 삼습니다. 그 결과 한 청크 안에는 의미적으로 가까운 문장들이 모이고, 주제가 바뀌는 자리에서 경계가 생깁니다.
여기서 전제는 청킹(chunking)이라는 상위 개념입니다. RAG 파이프라인은 긴 문서를 그대로 임베딩하거나 검색할 수 없으므로 작은 단위(청크)로 쪼개는데, 이때 '어떤 기준으로 끊을 것인가'가 청킹 전략의 핵심입니다. 가장 단순한 방식은 글자 수나 토큰 수를 정해 기계적으로 자르는 고정 크기 청킹이며, 시맨틱 청킹은 그 기준을 길이가 아니라 의미 변화로 바꾼 전략입니다. 즉 시맨틱 청킹은 청킹의 한 종류이고, 차별점은 분할 지점을 임베딩 유사도로 결정한다는 데 있습니다.
중요한 이유는 청크 경계가 검색 품질을 좌우하기 때문입니다. 하나의 의미 단위가 두 청크로 쪼개지면 검색 시 맥락이 끊기고, 관련 없는 내용이 한 청크에 섞이면 임베딩 신호가 희석됩니다. 시맨틱 청킹은 경계를 의미에 맞춰 의미적 응집도가 높은 청크를 만들려는 시도입니다.
고정 크기 청킹 vs 시맨틱 청킹
| 구분 | 고정 크기 청킹 | 시맨틱 청킹 |
|---|---|---|
| 분할 기준 | 글자 수·토큰 수 등 정해진 길이(흔히 오버랩 포함) | 인접 문장 임베딩의 유사도 변화(의미 경계) |
| 경계 위치 | 고정 위치에서 기계적으로 절단 | 유사도가 급락하는 지점, 주제 전환부 |
| 청크 길이 | 균일 | 가변(내용에 따라 다름) |
| 의미 응집도 | 경계가 문장·주제 중간을 가를 수 있음 | 의미가 가까운 문장끼리 묶일 가능성이 높음 |
| 연산 비용 | 낮음(임베딩 불필요) | 높음(분할용 임베딩 추가 호출) |
| 대표 구현 | RecursiveCharacterTextSplitter 등 | LangChain SemanticChunker, LlamaIndex SemanticSplitterNodeParser |
동작 방식과 임계값
시맨틱 청킹의 분할점은 임계값(threshold) 방식으로 정합니다. arXiv:2410.13070 논문과 LangChain 문서는 다음과 같은 상대 임계값들을 설명합니다.
- 백분위수(percentile): 인접 거리 분포의 n번째 백분위수를 넘는 지점에서 분할합니다. 95 백분위수를 흔히 사용하며, 값을 낮출수록 분할이 잦아집니다.
- 표준편차(standard deviation): 평균에서 표준편차의 일정 배수만큼 벗어난 거리에서 분할합니다.
- 사분위수(interquartile): 사분위 범위(IQR)를 기준으로 이상치에 해당하는 거리에서 분할합니다.
- 기울기(gradient): 거리의 2차 차분(변화율)에 백분위수를 적용해 경계를 잡습니다.
LangChain의 SemanticChunker는 위 네 가지 breakpoint_threshold_type을 지원하며 백분위수가 기본값입니다. LlamaIndex의 SemanticSplitterNodeParser는 buffer_size(유사도 평가 시 함께 묶는 문장 수)와 breakpoint_percentile_threshold를 매개변수로 두며, 공식 예시에서 각각 1과 95를 사용합니다. 백분위수 임계값을 높이면 큰 주제 전환에서만 끊어 청크가 보수적으로(더 길게) 만들어집니다.
# LlamaIndex 예시
from llama_index.core.node_parser import SemanticSplitterNodeParser
from llama_index.embeddings.openai import OpenAIEmbedding
splitter = SemanticSplitterNodeParser(
buffer_size=1,
breakpoint_percentile_threshold=95,
embed_model=OpenAIEmbedding(),
)
nodes = splitter.get_nodes_from_documents(documents)근거와 사례
시맨틱 청킹은 직관적으로 매력적이지만, 효과는 데이터와 상황에 따라 갈립니다. Vectara와 위스콘신-매디슨 대학 연구진의 2024년 논문 "Is Semantic Chunking Worth the Computational Cost?"(Qu, Tu, Bao, arXiv:2410.13070)는 문서 검색·증거 검색·답변 생성 세 과제에 걸쳐 시맨틱 청킹과 고정 크기 청킹을 대규모로 비교했습니다. 문서 검색에는 10개 데이터셋, 증거 검색에는 RAGBench 기반 5개 데이터셋을 사용했습니다. 결론은 시맨틱 청킹의 이득이 "일관적이지 않고 추가 연산 비용을 정당화하기에 부족한 경우가 많다"는 것이었으며, 특히 실제 문서 구조를 반영한 비합성 문서에서는 고정 크기 청킹이 더 효율적이고 신뢰할 만한 선택으로 남았다고 밝혔습니다.
같은 맥락에서 여러 후속 평가도 시맨틱 청킹이 항상 우월하지는 않음을 보고합니다. 일부 기업 문서 검색에서는 단순(naive) 청킹이 특정 임베딩과 결합했을 때 가장 높은 성능을 내, 시맨틱 청킹 우월성이라는 통념과 어긋나는 결과가 관찰되기도 했습니다. 따라서 시맨틱 청킹 도입은 비용 대비 효과를 실제 데이터로 검증한 뒤 결정하는 편이 안전합니다.