토큰 분리

언어 모델은 토큰 제한이 있습니다. 토큰 제한을 초과해서는 안 됩니다. 따라서 텍스트를 청크로 나눌 때 토큰의 수를 계산하는 것이 가장 좋습니다. 많은 토큰 프로세서(토크나이저)가 있습니다. 텍스트의 토큰 수를 계산할 때는 언어 모델에서 사용된 동일한 토큰 프로세서를 사용해야 합니다.

이 장에서는 LangChain이 다양한 토큰 토크나이저를 사용하여 텍스트 콘텐츠를 토큰 기반으로 분리하는 방법을 소개합니다.

tiktoken

tiktoken은 OpenAI에서 오픈 소스로 공개한 빠른 BPE 토크나이저입니다.

우리는 이를 사용하여 사용된 토큰 수를 추정할 수 있습니다. OpenAI 모델에 대해 더 정확할 수 있습니다.

  1. 텍스트가 어떻게 분할되는지: 입력 문자에 따라 분할됩니다.
  2. 청크 크기가 어떻게 측정되는지: tiktoken 토크나이저를 사용하여 측정됩니다.
%pip install --upgrade --quiet langchain-text-splitters tiktoken
with open("../../../state_of_the_union.txt") as f:
    state_of_the_union = f.read()
	
from langchain_text_splitters import CharacterTextSplitter
text_splitter = CharacterTextSplitter.from_tiktoken_encoder(
    chunk_size=100, chunk_overlap=0
)
texts = text_splitter.split_text(state_of_the_union)
print(texts[0])
여자의 연설자, 여자의 부통령, 우리의 첫 번째 여사와 두 번째 신사. 의회 및 내각의 구성원. 대법원 재판관들. 나의 동포 아메리칸들.

지난 해 COVID-19로 우리를 분리시켰습니다. 올해에는 우리가 드디어 다시 함께합니다.

오늘 밤, 우리는 민주당과 공화당, 그리고 독립당으로 모입니다. 그러나 무엇보다 중요한 것은 미국인으로서 모입니다.

우리는 서로에게, 미국인들에게, 그리고 헌법에 대한 의무를 가지고 있습니다.

우리는 또한 tiktoken 분할기를 직접로드 할 수 있습니다.

from langchain_text_splitters import TokenTextSplitter

text_splitter = TokenTextSplitter(chunk_size=10, chunk_overlap=0)

texts = text_splitter.split_text(state_of_the_union)
print(texts[0])

spaCy

spaCy는 파이썬과 Cython으로 작성된 고급 자연어 처리를 위한 오픈 소스 소프트웨어 라이브러리입니다.

NLTK를 사용하는 대신 spaCy 토크나이저를 사용하는 다른 대안입니다.

  1. 텍스트가 어떻게 분할되는지: spaCy 토크나이저를 사용하여 분할됩니다.
  2. 청크 크기가 어떻게 측정되는지: 문자 수를 세어 측정됩니다.
with open("../../../state_of_the_union.txt") as f:
    state_of_the_union = f.read()
from langchain_text_splitters import SpacyTextSplitter

text_splitter = SpacyTextSplitter(chunk_size=1000)
texts = text_splitter.split_text(state_of_the_union)
print(texts[0])

SentenceTransformers

SentenceTransformersTokenTextSplitter는 특히 sentence-transformer 모델을 위해 설계된 텍스트 분할기입니다. 기본 동작은 원하는 sentence-transformer 모델에 적합한 토큰 창 크기의 블록으로 텍스트를 분할하는 것입니다.

from langchain_text_splitters import SentenceTransformersTokenTextSplitter
splitter = SentenceTransformersTokenTextSplitter(chunk_overlap=0)
text = "로렘 "
count_start_and_stop_tokens = 2
text_token_count = splitter.count_tokens(text=text) - count_start_and_stop_tokens
print(text_token_count)
2
token_multiplier = splitter.maximum_tokens_per_chunk // text_token_count + 1

text_to_split = text * token_multiplier

print(f"문장에있는 토큰 수: {splitter.count_tokens(text=text_to_split)}")
문장에있는 토큰 수: 514
text_chunks = splitter.split_text(text=text_to_split)

print(text_chunks[1])
로렘

NLTK

NLTK(자연어 처리 도구 모음)는 파이썬으로 작성된 기호 및 통계적 자연어 처리(NLP)를 위한 라이브러리와 프로그램 세트로, 영어에 사용됩니다.

"\n\n"을 기반으로 텍스트를 단순히 분할하는 대신, NLTK 토크나이저를 사용하여 분할할 수 있습니다.

  1. 텍스트 분할 방법: NLTK 토크나이저 사용.
  2. 청크(문자열 덩어리) 크기 측정: 문자 수로 측정됨.
with open("../../../state_of_the_union.txt") as f:
    state_of_the_union = f.read()
from langchain_text_splitters import NLTKTextSplitter

text_splitter = NLTKTextSplitter(chunk_size=1000)
texts = text_splitter.split_text(state_of_the_union)
print(texts[0])

Hugging Face Tokenizer

Hugging Face에는 여러 토크나이저가 있습니다.

우리는 Hugging Face 토크나이저의 GPT2TokenizerFast를 사용하여 텍스트의 토큰 수를 계산합니다.

  1. 텍스트가 어떻게 분할되는지: 입력 문자에 따라 분할됩니다.
  2. 청크 크기가 어떻게 계산되는지: Hugging Face 토크나이저로 계산된 토큰의 수로 측정됩니다.
from transformers import GPT2TokenizerFast

tokenizer = GPT2TokenizerFast.from_pretrained("gpt2")
with open("../../../state_of_the_union.txt") as f:
    state_of_the_union = f.read()

from langchain_text_splitters import CharacterTextSplitter
text_splitter = CharacterTextSplitter.from_huggingface_tokenizer(
    tokenizer, chunk_size=100, chunk_overlap=0
)
texts = text_splitter.split_text(state_of_the_union)
print(texts[0])