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

토큰과 글자: 눈감고 자르지 마

~18 min · chunking, tokens

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

글자 수로 나눌 때 생기는 문제

영어 1200자는 대략 240토큰이지만, 같은 1200자의 한국어는 700토큰일 수 있어. 파이썬 소스 1200자는 400토큰쯤 될 수도 있고. 임베딩 모델이 실제로 제한하는 것은 토큰 수야. 글자 수만 세면 언어나 콘텐츠 형식에 따라 청크 크기가 조용히 어긋나.

토큰 수를 고려한 분할

임베딩 모델의 토크나이저를 기준으로 나눠. 흔한 방식은 두 가지야.

  • 재귀 분할기에 토크나이저를 결합하기 — 먼저 문단이나 문장 단위로 나누고 토큰 수를 확인한 뒤, 너무 길면 더 잘게 나눠.
  • 토큰 배열을 직접 자르기 — 문서 전체를 인코딩하고 토큰 목록을 일정한 길이로 자른 다음 각 조각을 다시 디코딩해.

두 번째 방식이 빠르지만 단어 한가운데를 자를 수 있어 결과가 거칠어. 실제 서비스에서는 대개 첫 번째 방식을 써.

Code

LangChain 토크나이저 기반 재귀 분할기·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

글자 수가 비슷한 영어 문서와 한국어 문서를 하나씩 준비해. 각각 1000자 기준과 400토큰 기준으로 나누고 토큰 수 분포를 출력해 봐. 글자 수를 기준으로 나누면 영어 청크는 지나치게 작고 한국어 청크는 지나치게 커지는 모습을 확인할 수 있어.

Progress

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

댓글 0

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

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