AI Prompt Engineering · 강의

긴 텍스트를 위한 청킹 전략

고정 크기, 문장 경계 기준 및 의미 기반 청킹 방식을 살펴봅니다.

레슨 1/413개 단계

긴 텍스트를 위한 청킹 전략은(는) CoddyKit의 무료 AI Prompt Engineering 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 AI Prompt Engineering 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. AI Prompt Engineering 강의에는 총 4개의 강의가 포함되어 있습니다.

긴 문서가 어려운 이유

LLM에는 한 번에 처리할 수 있는 토큰 수의 최대치인 문맥 창이 있습니다. GPT-4는 128k 토큰을 지원하고 클로드는 200k 토큰을 지원하지만, 이 한도를 초과하는 문서도 많습니다. 더 중요한 점은 매우 긴 문맥에서 모델의 정확도가 저하되는 경우가 많다는 연구 결과입니다. 문서 분할은 처리하기 전에 문서를 더 작은 조각으로 나누는 방법입니다.

고정 크기 분할

고정 크기 분할은 내용의 경계와 관계없이 N개 토큰(또는 문자)마다 텍스트를 나눕니다. 가장 단순한 전략이며 의미를 이해할 필요가 없습니다.

일반적인 조각 크기는 500–1000개 토큰입니다. 조각은 색인하고 검색하기 쉽지만 문장 중간에서 나뉘어 경계 부분의 의미를 잃을 수 있습니다.

import tiktoken

def fixed_chunk(text, max_tokens=1000):
    enc = tiktoken.get_encoding('cl100k_base')
    tokens = enc.encode(text)
    chunks = []
    for i in range(0, len(tokens), max_tokens):
        chunk_tokens = tokens[i:i + max_tokens]
        chunks.append(enc.decode(chunk_tokens))
    return chunks

chunks = fixed_chunk(long_document)
print(f'Total chunks: {len(chunks)}')

고정 크기 분할의 장단점

장점:

  • 구현이 간단합니다 — 자연어 처리 없이도 가능합니다.
  • 조각 크기를 예측할 수 있습니다 — API 비용을 관리하기 쉽습니다.
  • 처리가 빠릅니다.

단점:

  • 문장과 단락의 경계를 가로질러 나눕니다.
  • 한 문장이 여러 조각으로 나뉘면 검색할 때 문맥을 잃습니다.
  • 요약에 적합하지 않습니다 — 조각이 논증의 중간에서 끝날 수 있습니다.

문장 경계 기반 분할

문장 경계 기반 분할은 자연스러운 문장 또는 단락의 끊김 지점에서 텍스트를 나눕니다. 각 조각이 완전한 문장 끝에서 끝나므로 문장이 중간에 잘리지 않습니다. 그 결과 읽기 쉽고 일관성 있는 조각이 생성됩니다.

문장 토큰화 도구(spaCy 또는 NLTK)를 사용해 경계를 감지한 다음, 조각이 목표 크기에 도달할 때까지 문장을 묶습니다.

import spacy

nlp = spacy.load('en_core_web_sm')

def sentence_chunk(text, max_tokens=1000):
    doc = nlp(text)
    sentences = [sent.text.strip() for sent in doc.sents]
    chunks, current, count = [], [], 0
    for sent in sentences:
        word_count = len(sent.split())
        if count + word_count > max_tokens and current:
            chunks.append(' '.join(current))
            current, count = [], 0
        current.append(sent)
        count += word_count
    if current:
        chunks.append(' '.join(current))
    return chunks

의미 기반 분할

의미 기반 분할은 한 단계 더 나아가 주제가 바뀌는 지점에서 텍스트를 나눕니다. 인접한 문장을 임베딩하고 코사인 유사도를 측정하면 논의가 새로운 주제로 이동하는 시점을 감지할 수 있습니다.

유사도가 임계값 아래로 떨어지면 분할 경계를 삽입합니다. 이렇게 하면 주제 응집도가 높은 조각이 생성되어 검색 증강 생성(RAG)에 적합합니다.

from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np

model = SentenceTransformer('all-MiniLM-L6-v2')

def semantic_chunk(sentences, threshold=0.75):
    embeddings = model.encode(sentences)
    chunks, current = [], [sentences[0]]
    for i in range(1, len(sentences)):
        sim = cosine_similarity(
            [embeddings[i-1]], [embeddings[i]]
        )[0][0]
        if sim < threshold:
            chunks.append(' '.join(current))
            current = []
        current.append(sentences[i])
    if current:
        chunks.append(' '.join(current))
    return chunks

세 가지 전략 비교

선택에 도움이 되도록 나란히 비교해 보겠습니다.

  • 고정 크기: 가장 빠르지만 경계의 정확도가 가장 낮습니다 — 단순한 처리 과정에 사용합니다.
  • 문장 경계 기반: 문장의 완결성을 보존합니다 — 일관성이 중요할 때 사용합니다.
  • 의미 기반: 주제 응집도가 가장 높습니다 — 정밀한 검색이 중요한 RAG에 사용합니다.

실제로 의미 기반 분할은 임베딩 계산으로 인해 지연 시간이 늘어납니다. 검색 정확도 요구 사항에 따라 선택합니다.

검색 작업을 위한 분할

검색 증강 생성(RAG)에서는 분할 단위가 검색 단위가 됩니다. 사용자 질의를 임베딩한 다음 가장 유사한 조각을 검색하여 프롬프트에 삽입합니다.

더 작은 조각(200–400개 토큰)을 사용하면 각 조각에 하나의 핵심 아이디어만 포함되므로 검색 정밀도가 향상됩니다. 더 큰 조각(800–1000개 토큰)은 더 많은 맥락을 제공하지만 관련 구절과 함께 관련 없는 내용도 포함할 수 있습니다.

import openai
import numpy as np

client = openai.OpenAI(api_key='sk-...')

def embed(text):
    resp = client.embeddings.create(
        model='text-embedding-3-small',
        input=text
    )
    return np.array(resp.data[0].embedding)

def retrieve(query, chunks, top_k=3):
    q_emb = embed(query)
    scores = [(i, np.dot(q_emb, embed(c))) for i, c in enumerate(chunks)]
    scores.sort(key=lambda x: x[1], reverse=True)
    return [chunks[i] for i, _ in scores[:top_k]]

요약 작업을 위한 분할

요약에서는 조각 하나에 완전한 논증이나 절이 들어갈 수 있을 만큼 크게 만들어야 합니다. 600–800개 토큰의 문장 경계 기반 조각이 잘 작동합니다.

각 조각을 독립적으로 요약하는 분할 단계를 거친 다음, 요약을 최종 요약으로 결합하는 통합 단계를 수행합니다. 이것은 고전적인 분할-통합 패턴이며 다음 수업에서 다룹니다.

중복 구간: 분할 경계 연결

경계 오류를 줄이는 실용적인 방법 중 하나는 조각 사이에 중복 구간을 추가하는 것입니다. N번째 조각의 마지막 100–200개 토큰을 N+1번째 조각의 시작 부분에 반복합니다.

중복 구간을 사용하면 경계에 걸친 문장이 적어도 하나의 조각에는 완전한 형태로 포함됩니다. 이는 검색에서 특히 중요합니다 — 경계에 걸친 주제에 대한 질의가 중복되는 조각과 일치할 수 있기 때문입니다.

def fixed_chunk_with_overlap(text, max_tokens=1000, overlap=200):
    enc = tiktoken.get_encoding('cl100k_base')
    tokens = enc.encode(text)
    chunks = []
    step = max_tokens - overlap
    for i in range(0, len(tokens), step):
        chunk_tokens = tokens[i:i + max_tokens]
        chunks.append(enc.decode(chunk_tokens))
        if i + max_tokens >= len(tokens):
            break
    return chunks

조각별 메타데이터 보강

각 조각에는 후속 단계에서 출처를 참조할 수 있도록 메타데이터가 포함되어야 합니다.

  • source: 파일 이름 또는 URL
  • page: 페이지 번호
  • chunk_index: 문서 내 위치
  • section: 장 또는 제목

이 메타데이터는 벡터 데이터베이스(파인콘, 크로마, 위비에이트)의 임베딩과 함께 저장되며, 검색된 조각과 함께 반환되어 LLM이 출처를 인용할 수 있게 합니다.

def chunk_with_metadata(text, source='doc.pdf', page=1):
    chunks = fixed_chunk_with_overlap(text)
    return [
        {
            'text': chunk,
            'metadata': {
                'source': source,
                'page': page,
                'chunk_index': i
            }
        }
        for i, chunk in enumerate(chunks)
    ]

적절한 전략 선택

빠른 선택 가이드는 다음과 같습니다.

  • 속도가 우선이고 내용이 산문인 경우: 문장 경계 기반 분할
  • 검색 정확도가 중요한 경우: 작은 조각(300개 토큰)을 사용하는 의미 기반 분할
  • 책이나 보고서를 요약하는 경우: 더 큰 조각(800개 토큰)을 사용하는 문장 경계 기반 분할과 분할-통합
  • 법률/기술 문서: 조항을 함께 유지하는 의미 기반 분할

전략을 확정하기 전에 대표 질의 집합에서 검색 재현율을 항상 측정합니다.

지식 확인

인접한 문장 임베딩 사이의 코사인 유사도가 임계값 아래로 떨어질 때 텍스트를 나누는 청킹 전략은 무엇인가요?

복습: 청킹 전략

세 가지 핵심 청킹 전략을 학습했습니다:

  • 고정 크기: N개 토큰마다 분할 — 빠르고 단순하지만 경계를 고려하지 않음
  • 문장 경계 기준: 자연스러운 문장 구분점에서 분할 — 일관성이 높고 복잡도가 보통임
  • 의미 기반: 임베딩 유사도를 통해 주제가 바뀌는 지점에서 분할 — 가장 정확하지만 비용이 가장 높음

청크 사이에 오버랩을 추가하면 경계에서 발생하는 오류를 줄일 수 있으며, 인용과 추적 가능성을 확보하려면 항상 메타데이터(출처, 페이지, 인덱스)를 연결해야 합니다. 다음 수업에서는 맵리듀스 요약 패턴을 다룹니다.

무료로 시작

AI 튜터와 함께 AI Prompt Engineering을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
53
레슨
199

자주 묻는 질문

“긴 텍스트를 위한 청킹 전략” 강의는 무료인가요?

네 — “긴 텍스트를 위한 청킹 전략” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 AI Prompt Engineering 강의 전체를 잠금 해제할 수 있습니다. AI Prompt Engineering 강의에는 총 4개의 강의가 포함되어 있습니다.

“긴 텍스트를 위한 청킹 전략”에서 뭘 배우나요?

고정 크기, 문장 경계 기준 및 의미 기반 청킹 방식을 살펴봅니다. 브라우저에서 직접 실행하는 실습 코드로 AI Prompt Engineering을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

AI Prompt Engineering을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 AI Prompt Engineering은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“긴 텍스트를 위한 청킹 전략” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 AI Prompt Engineering 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 AI Prompt Engineering 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 긴 텍스트를 위한 청킹 전략
  2. 맵-리듀스 요약 패턴
  3. 계층적 요약
  4. 청크 간 맥락 유지하기
← AI Prompt Engineering(으)로 돌아가기