C.W.K.
Stream
Lesson 02 of 05 · published

토큰 vs 글자: 눈감고 자르는 거 그만

~18 min · chunking, tokens

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

글자 split 의 문제

영어 1200 글자 청크는 대략 240 토큰. 같은 1200 글자 한국어는 700 토큰일 수 있고. 같은 1200 글자 Python 소스는 400 일 수 있어. 임베딩 모델이 신경쓰는 건 토큰 budget — 글자 카운팅은 언어 / 콘텐츠 타입에 따라 조용히 misbehave.

토큰-aware split

모델 tokenizer 로 split 해. 흔한 두 패턴:

  • 재귀 splitter 에 tokenizer 감싸기 — 문단/문장 단위로 split, 토큰 카운트 체크, 필요하면 더 split.
  • 토큰 직접 슬라이싱 — 전체 문서 인코딩, 토큰 리스트 슬라이스, 각 슬라이스 디코딩.

두 번째가 빠른데 단어 중간에서 잘려서 못생김. 프로덕션은 대부분 첫 번째.

Code

LangChain tokenizer-aware 재귀 splitter·python
from langchain_text_splitters import RecursiveCharacterTextSplitter
import tiktoken

enc = tiktoken.encoding_for_model('text-embedding-3-large')

splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(
    encoding_name=enc.name,
    chunk_size=400,        # 글자 아니라 TOKENS
    chunk_overlap=60,
    separators=['\n\n', '\n', '. ', ' ', ''],   # 문단부터 시도
)

chunks = splitter.split_text(open('handbook.md').read())
for c in chunks[:3]:
    print(len(enc.encode(c)), '→', c[:80].replace('\n', ' '))
순수 토큰 슬라이싱 (빠른데 못생김)·python
def token_chunks(text: str, size: int = 400, overlap: int = 60):
    ids = enc.encode(text)
    chunks = []
    start = 0
    while start < len(ids):
        slice_ids = ids[start:start + size]
        chunks.append(enc.decode(slice_ids))
        start += size - overlap
    return chunks

External links

Exercise

비슷한 글자 길이의 영어 문서 1개 + 한국어 문서 1개. 각각 1000-글자 splitter 와 400-토큰 splitter 로 split. 토큰 카운트 분포 print. 글자 split 이 영어 청크는 굶기고 한국어 청크는 넘치게 하는 거 봐.

Progress

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

댓글 0

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

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