본문 바로가기
C.W.K.
Stream
Lesson 01 of 05 · published

왜 굳이 잘게 나눌까?

~18 min · chunking, intuition

Level 0Scout
0 XP0/41 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

청킹이 필요한 두 가지 이유

  1. 임베딩 모델에는 토큰 한도가 있어. 한도를 넘긴 부분은 경고도 없이 잘릴 수 있어.
  2. 문서 전체를 임베딩하면 여러 주제가 벡터 하나에 뒤섞여. 결제를 다루는 10페이지 문서에도 체험판 가입, 환불 정책, 미납 안내 메일, 세금 준수처럼 서로 다른 주제가 들어갈 수 있어. 이를 점 하나로 표현하면 그 점은 모든 주제의 평균 부근에 놓여 어떤 구체적인 질문과도 멀어져.

검색 정밀도와 문맥 사이의 균형

청크가 작으면 검색은 정밀해지지만 결과 하나가 주는 문맥은 줄어. 청크가 크면 문맥은 풍부해지지만 관련 없는 내용까지 섞이고 주제 경계를 넘기 쉬워져. 많은 지식 베이스에서 쓸 만한 출발점은 200–800토큰10–20% 중첩이야. 법칙은 아니니 실제 코퍼스와 쿼리로 측정해야 해.

분할 방식 네 가지

  1. 고정 크기 — N자 또는 N토큰마다 나눠. 단순하지만 결과를 예측하기 쉬워.
  2. 재귀 문자 분할 — 문단, 문장, 단어 순으로 경계를 찾아. LangChain의 기본 방식이야.
  3. 구조 기반 분할 — 마크다운 제목, HTML 태그, 코드 AST를 따라 논리 경계를 보존해.
  4. 의미 기반 분할 — 문장을 임베딩하고 의미가 크게 바뀌는 지점에서 새 청크를 시작해. 품질은 높지만 느리고 동작을 설명하기도 어려워.

Code

고정 글자 수로 나누기(가장 단순한 기준선)·python
def fixed_chunks(text: str, size: int = 1200, overlap: int = 200):
    chunks = []
    start = 0
    while start < len(text):
        end = start + size
        chunks.append(text[start:end])
        start = end - overlap
    return chunks

chunks = fixed_chunks(open('handbook.md').read())
print(f'{len(chunks)} chunks, avg {sum(len(c) for c in chunks)//len(chunks)} chars')

External links

Exercise

3000토큰이 넘는 실제 문서 하나를 골라 256, 512, 1024토큰과 10% 중첩으로 각각 나눠 봐. 세 결과를 임베딩한 뒤 같은 쿼리 다섯 개로 검색하고, 쿼리마다 상위 결과의 순위를 직접 매겨. 가장 잘 나온 설정을 초기 청크 크기로 삼으면 돼.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.