Back to Blog
ChunkingSemantic ChunkingProposition ChunkingChunk SizeRAG

0x02. 청크 최적화 - RAG 성능의 첫 번째 열쇠

RAG 성능을 좌우하는 청크 전략을 비교한다. 고정 크기, 의미 기반, 명제 기반 청킹의 원리와 최적화 방법을 알아본다.

RAG 파이프라인에서 가장 먼저 마주치는 결정이 있다. "문서를 어떻게 나눌 것인가?"

아무리 좋은 임베딩 모델과 LLM을 사용해도, 검색 대상인 청크(Chunk)의 품질이 낮으면 최종 답변의 품질도 떨어진다. 너무 큰 청크는 노이즈를 포함하고, 너무 작은 청크는 맥락을 잃는다. 이 글에서는 고정 크기 청킹부터 의미 기반, 명제 기반 청킹까지 세 가지 전략의 원리와 트레이드오프를 살펴본다.


고정 크기 청킹과 크기 최적화

가장 기본적인 접근은 고정된 토큰 수로 문서를 분할하는 것이다. 128, 256, 512 토큰 등 일정한 크기로 텍스트를 잘라내고, 청크 간 겹침(Overlap) 을 두어 경계에서 정보가 끊기는 문제를 완화한다.

단순하지만, 청크 크기를 어떻게 설정하느냐에 따라 검색 성능이 크게 달라진다. 최적의 크기를 찾기 위해서는 다양한 크기와 겹침 비율을 실험적으로 탐색해야 한다.

평가 기준

청크 크기를 평가할 때 주로 사용하는 두 가지 지표가 있다.

  • 충실도(Faithfulness): 생성된 답변이 검색된 문맥(Context)에 얼마나 충실한가? 다시 말해, 환각(Hallucination) 없이 검색 결과만을 근거로 답변하는가?
  • 관련성(Relevancy): 검색된 문맥과 생성된 답변이 사용자의 질문과 얼마나 관련이 있는가?

청크 크기 최적화의 본질은 "너무 많은 노이즈"와 "부족한 맥락" 사이의 균형을 찾는 것이다.

청크가 너무 크면 질문과 무관한 정보가 다량 포함되어 Relevancy가 떨어진다. 반대로 너무 작으면 하나의 문맥이 여러 조각으로 쪼개져 Faithfulness가 낮아진다. 데이터셋의 특성과 예상 질문 유형에 따라 적절한 지점은 달라지므로, 실제 데이터로 실험하여 최적 크기를 결정하는 과정이 필수적이다.


시맨틱 청킹: 의미가 바뀌는 지점에서 자르기

고정 크기 청킹의 근본적 한계는 텍스트의 의미를 고려하지 않는다는 점이다. 500토큰 지점이 문단 중간이든, 주제 전환 직후이든 상관없이 기계적으로 자른다. 이로 인해 하나의 완결된 생각이 두 청크로 쪼개지거나, 서로 다른 주제가 하나의 청크에 뒤섞이는 문제가 발생한다.

시맨틱 청킹(Semantic Chunking) 은 이 문제를 해결한다. 고정된 크기 대신, 문장 간 의미적 유사도를 분석하여 주제가 바뀌는 지점을 기준으로 분할하는 지능적인 기법이다.

시맨틱 청킹은 텍스트의 의미 흐름을 따라, 주제 전환이 일어나는 지점에서 자연스럽게 청크를 분할한다.

작동 원리

시맨틱 청킹은 네 단계로 이루어진다.

  1. 문장 단위 임베딩(Embedding): 문서를 개별 문장으로 나눈 뒤, 각 문장을 벡터로 변환한다.
  2. 유사도 계산: 인접한 문장들의 벡터 간 코사인 유사도(Cosine Similarity) 를 계산하여 문맥적 거리를 측정한다.
  3. 경계점 탐지: 문장 간 유사도가 급격하게 떨어지는 지점, 즉 주제가 바뀌는 지점을 경계점(Breakpoint)으로 식별한다.
  4. 의미 단위 분할: 탐지된 경계점들을 기준으로 텍스트를 분할하여, 의미적으로 완결된 하나의 청크를 생성한다.

예를 들어, 한 문서에서 "머신러닝의 역사"를 설명하다가 "딥러닝의 구조"로 주제가 넘어가는 지점이 있다면, 인접 문장 간 유사도가 급격히 낮아질 것이다. 시맨틱 청킹은 이 지점을 자동으로 감지하여 청크를 나눈다.

장점

  • 문맥 보존: 각 청크가 하나의 완결된 생각이나 주제를 담게 되어, 정보의 일관성이 높아진다.
  • 검색 정확도 향상: 의미적으로 명확한 청크는 사용자의 의도와 더 관련된 정보를 찾는 데 유리하다.
  • 가변적 크기: 내용에 따라 청크 크기가 유연하게 조절되어, 기계적 분할로 인한 정보 손실을 최소화한다.

구현

LangChain의 SemanticChunker 를 사용하면 간단하게 구현할 수 있다. breakpoint_threshold_type 파라미터를 통해 주제 전환을 판단하는 민감도를 조절할 수 있다.

from langchain_experimental.text_splitter import SemanticChunker
from langchain_openai.embeddings import OpenAIEmbeddings

embeddings = OpenAIEmbeddings()

# percentile: 유사도 분포의 백분위 기준으로 경계점 결정
chunker = SemanticChunker(
    embeddings,
    breakpoint_threshold_type="percentile"
)

chunks = chunker.create_documents([text])

breakpoint_threshold_type에는 percentile, standard_deviation 등의 옵션이 있다. percentile은 전체 유사도 분포에서 하위 몇 퍼센트를 경계점으로 삼을지 결정하고, standard_deviation은 평균에서 얼마나 벗어나야 경계로 볼지를 기준으로 한다. 데이터 특성에 맞게 선택하면 된다.


명제 기반 청킹: 사실 단위로 쪼개기

시맨틱 청킹이 "주제 단위"로 자른다면, 명제 기반 청킹(Proposition Chunking) 은 한 단계 더 나아가 "사실 단위"로 쪼갠다.

명제 기반 청킹은 LLM을 활용하여 문서를 의미적으로 완전한 최소 단위인 명제(Proposition) 로 분해하여, 검색의 정밀도를 극대화한다.

작동 원리

LLM을 사용하여 전체 문서를 여러 개의 핵심 명제로 분해한다. 각 명제는 그 자체로 완결된 하나의 사실을 담고 있다. 이렇게 추출된 명제들을 각각 임베딩하여 벡터 저장소에 저장하고, 검색 시에는 질문과 가장 관련 있는 "사실" 단위로 정보를 찾는다.

예를 들어, "Transformer는 2017년 Google이 발표했으며, Self-Attention 메커니즘을 사용하여 RNN의 한계를 극복했다"라는 문장이 있다면, 다음과 같은 명제들로 분해될 수 있다.

  • "Transformer는 2017년에 발표되었다."
  • "Transformer는 Google이 만들었다."
  • "Transformer는 Self-Attention 메커니즘을 사용한다."
  • "Transformer는 RNN의 한계를 극복했다."

각 명제가 독립적인 검색 단위가 되므로, "Transformer를 만든 회사는?"이라는 질문에 대해 불필요한 정보 없이 정확한 사실만 검색할 수 있다.

명제 기반 검색 vs 일반 청크 검색

두 방식은 뚜렷한 트레이드오프를 가진다.

명제 기반 검색일반 청크 검색
장점매우 정확하고 간결한 핵심 사실 검색에 강함풍부한 맥락과 자세한 배경 정보 제공
단점전체적인 맥락이나 배경 설명이 부족할 수 있음질문과 직접 관련 없는 정보가 함께 포함될 수 있음

명제 기반 청킹은 정밀도(Precision) 에서 강하지만, 맥락이 필요한 질문에는 불리하다. 반대로 일반 청크 검색은 맥락의 풍부함에서 강하지만, 노이즈가 섞일 수 있다. 실무에서는 명제 기반 검색으로 정확한 사실을 찾은 뒤, 해당 명제가 속한 원본 청크를 함께 반환하는 하이브리드 접근도 자주 사용된다.


세 가지 전략 비교

전략분할 기준청크 크기장점단점
고정 크기토큰 수고정구현이 단순하고 빠름의미적 경계를 무시
시맨틱의미 유사도가변문맥 보존, 의미 단위 분할임베딩 연산 비용
명제 기반사실 단위매우 작음높은 검색 정밀도LLM 호출 비용, 맥락 부족

어떤 전략이 "정답"이라고 단정하기는 어렵다. 데이터의 성격, 예상 질문 유형, 비용 제약 등을 종합적으로 고려하여 선택해야 한다. FAQ 형태의 짧은 질의응답이라면 명제 기반 청킹이 유리할 수 있고, 보고서처럼 맥락이 중요한 문서라면 시맨틱 청킹이 적합할 수 있다.


정리

RAG의 검색 품질은 결국 청크의 품질에서 시작된다. 이 글에서 다룬 세 가지 핵심 전략을 정리하면 다음과 같다.

  • 고정 크기 청킹: 다양한 크기와 겹침 비율을 실험하여, Faithfulness와 Relevancy의 균형점을 찾는 것이 핵심이다.
  • 시맨틱 청킹: 문장 임베딩과 코사인 유사도를 활용하여, 의미가 전환되는 지점에서 자연스럽게 분할한다.
  • 명제 기반 청킹: LLM으로 문서를 사실 단위의 명제로 분해하여, 군더더기 없는 정밀 검색을 가능하게 한다.

청킹은 RAG 최적화의 출발점이다. 다음 글에서는 검색 단계에서 성능을 높이는 기법들을 살펴볼 예정이다.