Semantic Chunking
시맨틱 청킹은 인접 문장 간 임베딩 유사도로 주제 변화를 측정해 문서를 분할하므로 각 청크에 하나의 아이디어가 담깁니다.
시맨틱 청킹은 모든 고정된 문자 수나 토큰 수마다 자르는 대신, 인접 문장의 임베딩을 비교해 주제가 바뀌는 지점에서 검색 증강 생성(RAG)과 검색을 위한 문서 청크를 나눕니다. 각 청크는 하나의 아이디어를 담으므로 벡터 데이터베이스의 단일 벡터가 해당 아이디어를 잘 나타내며, 검색된 청크는 대규모 언어 모델(LLM)에 한 섹션의 끝부분과 다음 섹션의 시작 부분이 아니라 완결된 생각을 전달합니다.
시맨틱 청킹의 작동 방식#
Greg Kamradt의 텍스트 분할 튜토리얼로 널리 알려지고 LangChain에서 SemanticChunker로 구현된 일반적인 알고리즘은 네 단계로 구성됩니다. 텍스트를 문장으로 나누고, 각 문장을 임베딩합니다. 노이즈를 줄이기 위해 문장과 이웃 문장을 함께 묶는 경우도 있습니다. 연속된 문장 쌍 사이의 코사인 유사도를 거리로 변환합니다. 임계값을 사용해 거리가 비정상적으로 큰 지점을 분할 지점으로 표시합니다. LangChain은 기본적으로 문서 전체 거리의 95백분위수를 사용하며 표준편차, 사분위 범위, 기울기 기반 임계값도 제공합니다. 분할 지점 사이의 문장들이 하나의 청크를 이룹니다. LlamaIndex의 시맨틱 분할기도 동일한 백분위수 기반 분할 지점을 사용합니다.
import numpy as np
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
sentences = [
"The XR-12 coolant pump circulates water through the press line.",
"Inspect the XR-12 pump seals for leaks every week.",
"A worn pump bearing grinds loudly before it fails.",
"The staff cafeteria now opens for breakfast at 7:00.",
"The cafeteria menu adds vegetarian lunches in May.",
]
# 각 문장과 그다음 문장 사이의 코사인 거리
embeddings = model.encode(sentences, normalize_embeddings=True)
distances = 1 - np.sum(embeddings[:-1] * embeddings[1:], axis=1)
# 거리가 95백분위수를 넘는 지점에서 새 청크를 시작합니다.
threshold = np.percentile(distances, 95)
chunks = [[sentences[0]]]
for sentence, distance in zip(sentences[1:], distances):
if distance > threshold:
chunks.append([])
chunks[-1].append(sentence)
print(np.round(distances, 2))
print(*[" ".join(chunk) for chunk in chunks], sep="\n")이웃 문장 사이의 거리는 0.56, 0.64, 0.98, 0.62이므로 펌프 베어링에서 구내식당으로 주제가 넘어가는 0.98 지점에만 분할 지점이 생깁니다. 결과적으로 XR-12 펌프를 다룬 세 문장짜리 청크 하나와 구내식당을 다룬 두 문장짜리 청크 하나가 생성됩니다.
청킹 전략 비교#
- 고정 크기 청킹: 보통 이웃 청크 간에 일부 중복을 두고 N개의 토큰마다 분할합니다. 빠르고 예측 가능하지만 주제 경계는 고려하지 않습니다.
- 재귀 분할: 각 조각이 크기 제한에 맞을 때까지 문단 구분, 줄바꿈, 문장 순으로 분할합니다. LangChain은 일반 텍스트에 재귀적 문자 분할기를 사용할 것을 권장합니다.
- 구조 인식 분할: 제목, Markdown 섹션, HTML 요소 또는 PDF의 페이지 레이아웃을 따릅니다.
- 시맨틱 청킹: 의미의 변화를 기준으로 분할합니다. 색인 생성 중 모든 문장을 임베딩해야 하고 청크 크기가 크게 달라질 수 있으므로, 구현 시 최소 및 최대 길이를 설정합니다.
- 레이트 청킹 및 문맥 기반 검색: 대명사의 지시 대상이 이전 청크에 있는 경우처럼 문서의 나머지 부분에서 맥락이 분리된 청크 문제를 해결하며, 위의 경계 지정 방법과 함께 사용할 수 있습니다.
로보틱스에서 액션 청킹은 이름만 같을 뿐 다른 개념입니다. 이 경우 정책이 미래의 모터 명령 시퀀스를 하나의 단위로 예측합니다.
텍스트를 넘어선 시맨틱 청킹#
음성-텍스트 변환 시스템의 전사에는 문단 구분이 없으므로 임베딩 기반 분할 지점은 회의나 팟캐스트에서 주제가 바뀌는 부분을 찾는 일반적인 방법입니다. 비디오도 콘텐츠를 기준으로 청킹할 수 있으므로, 임의의 10초 구간 대신 각 클립이 비디오 이해 또는 멀티모달 RAG를 위한 하나의 이벤트를 보여주도록 만들 수 있습니다. Ultralytics YOLO26은 사람과 차량이 등장하는 장면에서 이러한 경계를 제공합니다. 추적 모드는 감지된 각 객체에 프레임 전체에서 유지되는 ID를 부여하므로, 파이프라인은 새 ID가 장면에 들어오면 클립을 시작하고 추적 중인 ID가 모두 장면을 벗어나면 클립을 종료할 수 있습니다.
시맨틱 청킹은 검색 성능을 개선할까요?#
전사, 웹 스크래핑 페이지, 연결된 메모처럼 서로 관련 없는 주제가 제목 없이 나란히 놓인 경우 주제 기반 경계가 특히 중요합니다. 시맨틱 청크는 임베딩 모델과 임계값에도 영향을 받으므로 둘 중 하나가 바뀌면 동일한 문서도 다르게 나뉩니다. 두 요소는 모두 실제 질의에 대한 재현율을 기준으로 조정해야 합니다. 2024년 연구인 시맨틱 청킹은 연산 비용을 들일 만한 가치가 있는가?는 문서 검색, 근거 검색, 검색 기반 답변 생성을 대상으로 시맨틱 청킹과 고정 크기 청킹을 비교한 결과, 시맨틱 청킹의 추가 연산이 고정 크기 청킹보다 일관된 성능 향상을 가져오지는 않는다고 밝혔습니다.










