본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 26. 01:12

RAG를 위한 다양한 청킹(Chunking) 방법 가이드

요약

RAG 시스템의 성능을 결정짓는 핵심 전처리 기술인 청킹(Chunking)의 개념과 다양한 방법론을 소개합니다. 텍스트를 효율적으로 분할하여 LLM의 문맥 손실을 최소화하고 검색 품질을 높이는 전략을 다룹니다.

핵심 포인트

  • 청킹은 LLM의 토큰 제한 내에서 정보를 효율적으로 처리하기 위한 필수 전처리 단계입니다.
  • 고정 크기 청킹은 빠르지만 문맥 손실 위험이 있는 단순한 방식입니다.
  • 재귀적 청킹은 계층적 구분자를 사용하여 문맥을 보존하는 업계 표준 방식입니다.
  • 문서 특정 청킹은 Markdown이나 HTML 등 파일 구조를 활용해 의미 단위를 유지합니다.

RAG를 위한 청킹(Chunking) 방법 최종 가이드

청킹(Chunking)이란 무엇인가?

대규모 언어 모델(LLM)의 토큰 제한(token limit) 내에 머물기 위해, 우리는 연속된 텍스트를 개별 블록으로 나누는 전처리 기술인 **청킹 (Chunking)**을 사용합니다. 이를 통해 모델은 메모리 제약을 초과하지 않고 정보를 효율적으로 처리할 수 있습니다.

RAG란 무엇인가?

LLM은 종종 환각 (hallucinations) 현상을 겪으며, 근거 없는 자신감으로 잘못된 정보를 생성하곤 합니다. 이러한 사실적 "근거 (grounding)"의 부족은 많은 중요한 작업에서 모델을 신뢰할 수 없게 만듭니다.

이를 해결하기 위해, LLM이 답변하기 전에 참고할 수 있는 "진실의 원천 (source of truth)"을 제공하는 **RAG (Retrieval-Augmented Generation, 검색 증강 생성)**가 도입되었습니다.

RAG를 작동시키기 위해, 우리는 먼저 문서를 **벡터 임베딩 (vector embeddings)**이라고 불리는 "디지털 지문"으로 변환합니다. 우리는 특화된 AI 모델 (bi-encoders)을 사용하여 인간의 텍스트를 이러한 숫자로 번역하며, 이는 이후 벡터 데이터베이스 (vector database)에 저장됩니다.

이것을 첨단 도서관이라고 생각해보세요. 검색의 품질은 정보를 어떻게 분류했느냐에 전적으로 달려 있습니다. 만약 텍스트 "청크 (chunks)"가 너무 크거나 너무 작으면, AI는 올바른 답을 찾지 못할 것입니다. 이것이 바로 정확한 결과를 얻기 위해 스마트한 청킹 전략을 선택하는 것이 검색 방법 자체만큼이나 중요한 이유입니다.

다양한 청킹 방법

1. 고정 크기 청킹 (Fixed-Size Chunking)

이것은 가장 단순한 "무차별 대입 (brute force)" 방식으로, 정해진 수의 문자 또는 토큰(예: 500자)을 결정하고 해당 간격에서 정확히 텍스트를 분할합니다.

이 방식은 믿을 수 없을 정도로 빠르고 계산 비용이 저렴하지만, 콘텐츠에 대해서는 "맹목적"입니다. 문장의 중간을 자르거나 제목을 관련 문단으로부터 분리하는 경우가 많으며, 이는 검색 과정에서 문맥(context)의 손실로 이어질 수 있습니다. 이것은 "구식의 신뢰할 수 있는" 방법입니다. 그저 문자를 세고 자를 뿐입니다.

from langchain.text_splitter import CharacterTextSplitter

text = "Your long document text here..."
...

2. 재귀적 청킹 (Recursive Chunking)

많은 애플리케이션에서 "업계 표준 (industry standard)"으로 간주되는 이 방법은 텍스트의 구조를 보다 존중하려고 시도합니다. 이 방법은 이중 줄바꿈, 단일 줄바꿈, 공백 순으로 계층적인 구분자 (separators)를 사용하여 텍스트를 분할합니다.

만약 단락이 너무 크다면, 관련 문장들을 가능한 한 하나의 블록에 함께 유지하는 것을 목표로 하여 분할할 수 있는 다음 최적의 위치를 찾습니다. 이것이 권장되는 기본값 (default)입니다.

from langchain.text_splitter import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
...

3. 문서 특정 청킹 (Document-Specific Chunking)

이 방법은 Python 스크립트, HTML 페이지, Markdown 파일이 서로 다르게 구조화되어 있다는 점을 인정합니다. 모든 것을 단순한 텍스트 덩어리로 취급하는 대신, 문서 고유의 포맷팅 (예: <div> 태그, # 헤더, 또는 함수 정의)을 사용하여 경계를 결정합니다.

이를 통해 단일 함수나 매뉴얼의 특정 하위 섹션이 하나의 일관된 단위로 유지되도록 보장합니다. 이 방법은 Markdown, HTML 또는 코드와 같은 구조화된 데이터 (structured data)에 가장 적합합니다.

from langchain.text_splitter import MarkdownHeaderTextSplitter

headers_to_split_on = [
...

4. 의미론적 청킹 (Semantic Chunking)

문자나 포맷팅을 보는 대신, 이 방법은 의미 (meaning)를 봅니다. 문장 간의 아이디어 "거리 (distance)"를 분석하며, 문장들이 동일한 주제에 대해 이야기하고 있는 한 동일한 청크에 머무릅니다.

모델이 주제의 유의미한 변화를 감지하면 분할 지점을 생성합니다. 그 결과 청크의 크기는 다양할 수 있지만, 주제적 초점 (topical focus)은 매우 일관되게 유지됩니다. 이 방법은 문장을 "읽고" 그것들이 함께 속하는지 결정하기 위해 임베딩 모델 (embedding model)을 필요로 합니다.

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

...

5. 에이전트 기반 청킹 (Agentic Chunking)

5. 에이전트 기반 청킹 (Agentic Chunking)

이것은 가장 진보된 방식이자 "인간과 유사한" 전략으로, LLM (Large Language Model)이 자율적인 에이전트(Agent)로서 어디에서 끊어야 할지를 결정합니다. 에이전트는 문서를 읽으며 _"이 부분이 하나의 완전한 생각으로서 독립적으로 존재할 수 있는가?"_라고 자문합니다. 본질적으로 고차원적인 추론(Reasoning)을 바탕으로 문서를 논리적인 조각들로 "편집"하는 것입니다.

이 방법은 가장 정확하고 문맥을 잘 파악하는 방법이지만, 데이터를 준비하는 과정 자체에 여러 번의 AI 호출(AI calls)이 필요하기 때문에 가장 느리고 비용이 많이 듭니다. _이는 보통 LLM에게 특정 청크를 살펴보고 이것이 "완전한지" 아니면 더 많은 텍스트가 필요한지를 결정하도록 요청하는 커스텀 "루프 (loop)\

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0