Sign in to save your progressYou can keep reading without an account, but completed lessons won't be saved.
Sign in

텍스트 청킹(chunking)은 RAG(Retrieval Augmented Generation) 파이프라인을 구축할 때 가장 중요한 단계 중 하나입니다. 문서를 어떻게 나누는지는 전체 시스템의 품질에 직접적인 영향을 미칩니다. 잘못된 청킹 전략은 프롬프트에 관련 없는 컨텍스트가 삽입되게 하여 AI가 완전히 잘못된 답변을 하게 만들 수 있습니다.

다음 예시를 생각해 보세요: 의학 연구와 소프트웨어 엔지니어링에 관한 섹션이 있는 문서가 있습니다. 청킹을 잘못하면, "올해 엔지니어들이 몇 개의 버그를 수정했나요?"라고 묻는 사용자가 의학 섹션에 "버그"라는 단어가 다른 맥락으로 포함되어 있었다는 이유만으로 소프트웨어 엔지니어링이 아닌 의학 연구에 관한 정보를 얻게 될 수 있습니다.

이는 청킹 전략이 왜 그렇게 중요한지를 보여줍니다. 목표는 의미적 일관성을 유지하고 검색되었을 때 의미 있는 컨텍스트를 제공하는 청크를 만드는 것입니다.

세 가지 주요 청킹 전략

텍스트를 청킹하는 데는 세 가지 주요 접근 방식이 있으며, 각각 고유한 장점과 트레이드오프가 있습니다:

  • 크기 기반(Size-based): 텍스트를 동일한 길이의 문자열로 나눕니다
  • 구조 기반(Structure-based): 문서 구조(헤더, 단락, 섹션)를 기준으로 분할합니다
  • 의미 기반(Semantic-based): NLP 기법을 사용하여 관련된 문장이나 섹션을 그룹화합니다

크기 기반 청킹

크기 기반 청킹은 가장 간단한 접근 방식입니다. 문서를 대략 동일한 문자 수 또는 단어 수의 청크로 나누기만 하면 됩니다. 구현이 쉽고 다양한 문서 유형에서 안정적으로 작동합니다.

하지만 이 접근 방식에는 명확한 단점이 있습니다. 단어가 문장 중간에서 잘리고, 청크가 중요한 컨텍스트를 잃게 됩니다. 예를 들어, 청크에 해당 내용이 실제로 무엇에 관한 것인지 설명해 줄 섹션 헤더가 포함되지 않을 수 있습니다.

해결책은 청크 간에 오버랩(overlap)을 추가하는 것입니다. 각 청크는 인접한 청크의 일부 문자를 포함하여 더 나은 컨텍스트 보존을 보장하고 갑작스러운 단절을 방지합니다.

다음은 오버랩을 적용한 문자 기반 청킹의 기본 구현입니다:

python
def chunk_by_char(text, chunk_size=150, chunk_overlap=20):
    chunks = []
    start_idx = 0
    
    while start_idx < len(text):
        end_idx = min(start_idx + chunk_size, len(text))
        chunk_text = text[start_idx:end_idx]
        chunks.append(chunk_text)
        
        start_idx = (
            end_idx - chunk_overlap if end_idx < len(text) else len(text)
        )
    
    return chunks

구조 기반 청킹

구조 기반 청킹은 문서의 자연스러운 구성을 활용합니다. 마크다운 파일로 작업하는 경우 헤더를 기준으로 분할할 수 있습니다. 다른 형식의 경우 단락이나 다른 구조적 요소를 기준으로 분할할 수 있습니다.

이 접근 방식은 문서 구조에 대한 보장이 있을 때 훌륭하게 작동합니다. 마크다운 문서의 경우 섹션 헤더를 기준으로 분할할 수 있습니다:

python
def chunk_by_section(document_text):
    pattern = r'\n## '
    return re.split(pattern, document_text)

주요 한계는 많은 문서가 일관된 구조를 가지고 있지 않다는 점입니다. 일반 텍스트 파일, PDF, 또는 사용자가 업로드한 문서에는 분할할 명확한 구조적 표시가 없을 수 있습니다.

의미 기반 청킹

의미 기반 청킹은 가장 정교한 접근 방식입니다. 문장 간의 의미와 관계를 분석하여 관련된 내용을 함께 그룹화합니다. 이는 일반적으로 다음을 포함합니다:

  • 텍스트를 문장으로 나누기
  • NLP 기법을 사용하여 의미적 유사성 측정하기
  • 관련된 문장을 일관된 청크로 그룹화하기

이 방법은 가장 높은 품질의 청크를 생성할 수 있지만, 계산 비용이 많이 들고 구현이 더 복잡합니다. 대부분의 애플리케이션에서는 더 간단한 접근 방식으로도 충분히 잘 작동합니다.

실용적인 구현

다음은 좋은 중간 지점을 제공하는 문장 기반 청킹 함수입니다:

python
def chunk_by_sentence(text, max_sentences_per_chunk=5, overlap_sentences=1):
    sentences = re.split(r'(?<=[.!?])\s+', text)
    chunks = []
    start_idx = 0
    
    while start_idx < len(sentences):
        end_idx = min(start_idx + max_sentences_per_chunk, len(sentences))
        current_chunk = sentences[start_idx:end_idx]
        chunks.append(' '.join(current_chunk))
        
        start_idx += max_sentences_per_chunk - overlap_sentences
        
        if start_idx < 0:
            start_idx = 0
    
    return chunks

올바른 전략 선택하기

청킹 전략의 선택은 전적으로 특정 사용 사례에 따라 달라집니다:

  • 일관된 문서 구조: 가장 깔끔한 결과를 위해 구조 기반 청킹을 사용하세요
  • 혼합된 문서 유형: 문장 기반 청킹이 대체로 잘 작동합니다
  • 코드 또는 기술 콘텐츠: 문자 기반 청킹이 가장 안정적입니다
  • 알 수 없는 문서 형식: 문자 기반 청킹이 가장 안전한 선택입니다

청킹은 종종 반복적인 과정이라는 점을 기억하세요. 간단한 접근 방식으로 시작하여 특정 문서와 사용 사례로 테스트한 다음, 결과를 바탕으로 개선하세요. "최선의" 청킹 전략은 여러분의 특정 데이터와 요구 사항에 대해 안정적으로 작동하는 전략입니다.