RAG 답변 품질을 높이는 핵심: 문서 청킹(Chunking) 전략과 텍스트 분할법 완벽 가이드

썸네일

서론: 당신의 RAG 시스템이 멍청한 이유, 혹시 '청킹' 때문은 아닐까요?

최근 인공지능 업계에서 가장 뜨거운 화두는 단연 RAG(Retrieval-Augmented Generation, 검색 증강 생성) 기술입니다. 기업들은 저마다의 데이터를 LLM(대규모 언어 모델)에 연결하여, 학습되지 않은 최신 정보나 사내 비공개 데이터를 기반으로 정확한 답변을 내놓는 AI 서비스를 구축하고 있습니다. 하지만 막상 시스템을 구축해 보면 기대와 다른 결과에 실망하는 경우가 많습니다. 답변이 엉뚱하거나, 문맥을 전혀 파악하지 못하거나, 심지어 없는 사실을 지어내는 환각(Hallucination) 현상을 겪기도 합니다.

많은 개발자와 기획자들이 이 문제를 해결하기 위해 더 비싼 모델(GPT-4 등)을 도입하거나 프롬프트를 수없이 수정합니다. 하지만 문제의 근본적인 원인은 모델이 아니라, 모델에게 주입되는 '데이터의 형태'에 있을 확률이 매우 높습니다. 그중에서도 가장 간과하기 쉽지만 가장 중요한 단계가 바로 문서 청킹(Document Chunking)입니다.

긴 문서를 어떻게 자르고, 어떤 단위로 벡터 데이터베이스에 저장하느냐에 따라 검색(Retrieval)의 정확도가 결정되고, 이는 곧 최종 답변의 품질(Generation Quality)로 직결됩니다. 이 글에서는 RAG 성능을 극대화하기 위한 다양한 문서 청킹 전략텍스트 분할법을 심도 있게 다루어보고자 합니다. 단순한 문자열 자르기부터 최신 시맨틱 청킹까지, 여러분의 데이터에 맞는 최적의 전략을 찾아보세요.


1. 문서 청킹(Chunking)이란 무엇이며 왜 중요한가?

청킹(Chunking)은 말 그대로 긴 텍스트 문서를 더 작고 관리하기 쉬운 조각(Chunk)으로 나누는 과정을 의미합니다. 우리가 책 한 권을 통째로 읽고 모든 내용을 한 번에 기억할 수 없듯이, LLM 또한 한 번에 처리할 수 있는 입력 데이터의 양인 컨텍스트 윈도우(Context Window)에 물리적인 제한이 있습니다. 따라서 우리는 방대한 문서를 페이지나 문단, 혹은 의미 단위로 나누어 사용자의 질문과 관련된 부분만 쏙 뽑아 모델에게 제공해야 합니다.

청킹이 RAG 성능에 미치는 결정적 영향

  • 검색 효율성 및 정확도 증대: 사용자의 질문에 딱 맞는 정보만을 정확하게 찾아낼 수 있습니다. 청크가 너무 크면 불필요한 정보가 섞여 정확도가 떨어지고, 너무 작으면 문맥이 잘려 이해도가 떨어집니다.
  • 비용 절감 효과: LLM API는 입력되는 토큰 수에 비례하여 과금됩니다. 필요한 핵심 정보만 추려내어 입력함으로써 불필요한 토큰 낭비를 막고 운영 비용을 획기적으로 절감할 수 있습니다.
  • 정보의 희석(Dilution) 방지: 너무 많은 정보를 한 번에 주입하면 모델이 핵심을 놓치거나 정보가 섞이는 현상이 발생합니다. 적절한 길이의 청크는 정보의 밀도를 유지하여 모델이 명확한 답변을 생성하도록 돕습니다.

2. 가장 기초적인 텍스트 분할 전략 (Basic Splitting)

RAG 구축 초기 단계에서 가장 흔히 사용되는 방법들입니다. 구현이 쉽고 빠르다는 장점이 있지만, 데이터의 특성을 고려하지 않으면 치명적인 문맥 손실을 야기할 수 있습니다.

2.1 고정 크기 청킹 (Fixed-size Chunking)

가장 직관적인 방법으로, 단순히 글자 수(Character)토큰(Token) 개수를 기준으로 텍스트를 기계적으로 자르는 방식입니다. 예를 들어, 문서를 무조건 500자 단위로 자르는 것입니다.

  • 장점: 별도의 복잡한 로직 없이 구현이 매우 간단하며, 계산 비용이 거의 들지 않습니다.
  • 단점: 문장이나 문단 중간에서 텍스트가 뚝 끊길 수 있습니다. 예를 들어, "오늘 날씨는 매우"에서 잘리고 다음 청크가 "맑습니다."로 시작된다면, 검색 엔진은 이 두 청크가 연결된 내용임을 파악하기 어렵습니다. 이는 문맥(Context)의 손실로 이어져 검색 품질을 저하시킵니다.

2.2 청크 중첩 (Chunk Overlap)의 필수성

고정 크기 청킹의 치명적인 단점을 보완하기 위해 반드시 함께 사용해야 하는 기법이 바로 청크 중첩(Chunk Overlap)입니다. 청크를 나눌 때 인접한 청크끼리 일정 부분(예: 10~20%) 겹치게 만드는 것입니다.

  • 전략적 이점: 청크 크기가 1000자라면, 중첩 크기를 100자 정도로 설정합니다. 이렇게 하면 문장이 중간에 잘리더라도 다음 청크의 앞부분에 해당 문장의 전체 내용이 포함되거나 문맥이 이어지게 됩니다. 이는 문맥의 연속성을 유지하여 검색 엔진이 내용을 놓치지 않게 하는 안전장치 역할을 합니다.

3. 문맥을 살리는 구조적/재귀적 청킹 (Recursive & Structural)

단순히 길이로 자르는 것을 넘어, 문서가 가진 구조나 문법적 요소를 고려하여 자르는 방식입니다. LangChain과 같은 프레임워크에서 기본적으로 가장 추천하는 방식이기도 합니다.

3.1 재귀적 문자 텍스트 분할 (Recursive Character Text Splitting)

이 방식은 텍스트를 무작정 자르기 전에, 리스트로 지정된 구분자(Separators)를 순서대로 시도하며 가장 적절한 지점을 찾습니다. 일반적으로 `["

", " ", " ", ""]` 순서로 분할을 시도합니다.

  1. 가장 먼저 문단(`

) 단위로 자르기를 시도하여, 하나의 문단이 통째로 유지되도록 합니다. 2. 문단이 설정한 청크 크기보다 크다면, 문장( ) 단위로 자릅니다. 3. 그래도 크다면 단어( `) 단위로 자릅니다.

이 전략의 핵심은 의미적으로 연관된 텍스트 조각을 최대한 유지하려고 노력한다는 점입니다. 문단은 하나의 주제를 담고 있을 확률이 높으므로, 문단을 깨지 않고 유지하는 것이 검색 품질에 유리합니다.

3.2 문서 구조 기반 청킹 (HTML/Markdown Header Splitting)

만약 다루는 데이터가 Markdown이나 HTML 형식을 따르고 있다면, 헤더 태그(#, ##, ### 또는

,

)를 기준으로 나누는 것이 매우 효과적입니다.

  • 작동 원리: 각 섹션의 제목을 메타데이터로 함께 저장하거나, 섹션 단위로 청크를 생성합니다.
  • 활용 예시: "계약서의 해지 조항"을 찾을 때 # 해지 및 종료 섹션 전체를 하나의 청크로 가져올 수 있습니다. 문서의 논리적 구조를 그대로 반영하므로, 특정 주제에 대한 명확한 답변을 찾을 때 매우 높은 정확도를 보입니다.

4. 차세대 고급 전략: 시맨틱 청킹 (Semantic Chunking)

최근 RAG의 품질을 한 단계 더 끌어올리기 위해 도입된 기술이 바로 시맨틱 청킹(Semantic Chunking)입니다. 이는 물리적인 길이나 구조가 아니라, 내용의 의미(Semantics)가 변하는 지점을 찾아 문서를 나눕니다.

4.1 시맨틱 청킹의 작동 원리

  1. 문서를 문장 단위로 세분화합니다.
  2. 각 문장을 임베딩 모델(Embedding Model)을 통해 벡터로 변환합니다.
  3. 인접한 문장 간의 코사인 유사도(Cosine Similarity)를 계산합니다.
  4. 유사도가 급격히 낮아지는 지점, 즉 주제나 내용의 흐름이 바뀌는 지점을 경계로 삼아 청크를 분할합니다.

4.2 장점과 한계

  • 장점: 주제별로 완벽하게 묶인 청크를 생성할 수 있습니다. 검색 시 노이즈가 적고, LLM이 이해하기 가장 좋은 형태의 정보를 제공하여 답변 품질이 우수합니다.
  • 단점: 모든 문장에 대해 임베딩을 수행해야 하므로 계산 비용이 비싸고 처리 속도가 느립니다. 실시간 처리가 중요하거나 데이터 양이 방대한 경우 시스템 부하가 커질 수 있습니다.

5. 실전 가이드: 내 프로젝트에 맞는 최적의 청킹 전략 수립하기

"그래서 어떤 방법을 써야 하나요?"라는 질문에 대한 정답은 "데이터의 특성과 사용자의 질문 패턴에 따라 다르다"입니다. 다음의 기준을 참고하여 전략을 선택하세요.

5.1 데이터 종류에 따른 맞춤 전략

  • 일반적인 텍스트(뉴스, 블로그, 에세이): Recursive Character Text Splitter가 가장 무난하고 성능이 좋습니다. 문단 구조를 유지하면서 적절히 분할해 줍니다.
  • 구조화된 문서(매뉴얼, 논문, 법률 문서): Markdown이나 Header 기반 분할을 강력 추천합니다. 상위 섹션의 제목을 메타데이터로 포함시키는 것이 필수적입니다.
  • 코드(Code): 프로그래밍 언어별 전용 Splitter를 사용해야 합니다. Python, Java 등은 클래스나 함수 단위로 잘라야 코드의 로직과 의미가 유지됩니다.

5.2 청크 크기(Chunk Size) 결정의 딜레마

  • 짧은 청크 (100~300 토큰): 매우 구체적이고 세밀한 정보를 검색해야 할 때 유리합니다. 하지만 문맥이 부족하여 LLM이 답변을 생성할 때 어려움을 겪을 수 있습니다.
  • 긴 청크 (1000~2000 토큰): 전체적인 흐름이나 요약이 필요할 때 유리합니다. 하지만 검색 정확도가 떨어질 수 있고(불필요한 정보 포함), 임베딩 벡터가 희석될 수 있습니다.
  • 권장 사항: 처음에는 500~1000 토큰 사이에서 시작하고, Chunk Overlap10~20% 정도로 설정하여 테스트해 보는 것이 좋습니다.

5.3 비장의 무기: Small-to-Big 전략 (Parent Document Retriever)

이 전략은 검색의 정확도와 생성의 풍부함을 모두 잡는 고급 기법입니다.

  1. 문서를 아주 작은 단위(Small Chunk)로 잘라 벡터 인덱싱을 수행합니다. (검색용)
  2. 검색에 성공하면, 해당 작은 청크를 포함하는 더 큰 상위 청크(Big Chunk/Parent Document)를 LLM에게 전달합니다. (생성용)

이 방식을 사용하면, 검색은 핀포인트로 정확하게 수행하면서, 답변 생성 시에는 충분한 앞뒤 문맥을 제공할 수 있어 RAG 품질을 획기적으로 개선할 수 있습니다.


결론: 데이터 전처리가 AI의 지능을 결정합니다

많은 사람들이 더 좋은 LLM 모델을 사용하는 것에만 집중하지만, 실제 RAG 시스템의 성능은 얼마나 깨끗하고 의미 있는 단위로 데이터를 주입하느냐에 달려 있습니다. 아무리 똑똑한 AI라도 뒤죽박죽 섞인 책 페이지를 주면 내용을 제대로 이해할 수 없습니다.

단순한 고정 크기 분할에서 시작하여, 데이터의 구조를 반영한 분할, 더 나아가 의미 기반의 시맨틱 청킹까지 실험해 보아야 합니다. 특히 Small-to-Big 전략과 같이 검색과 생성을 위한 데이터를 분리하는 접근법은 최근 매우 효과적인 솔루션으로 자리 잡고 있습니다. 여러분의 RAG 시스템이 기대만큼 똑똑하지 않다면, 프롬프트를 수정하기 전에 데이터가 어떻게 잘리고 있는지(Chunking) 먼저 점검해 보세요. 올바른 텍스트 분할 전략이 멍청한 AI를 똑똑한 비서로 바꾸는 열쇠가 될 것입니다.

신고하기

쿠팡 다이나믹 배너

×

※ 본 페이지는 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정 수수료를 제공받을 수 있습니다.

이미지alt태그 입력