Divisão de Tokens

Os modelos de linguagem têm limites de tokens. Não devem ser ultrapassados; portanto, ao dividir o texto em pedaços, é melhor calcular o número de tokens. Existem muitos processadores de tokens (tokenizers) disponíveis. Ao calcular o número de tokens no texto, deve ser utilizado o mesmo processador de tokens usado no modelo de linguagem.

Este capítulo apresenta como o LangChain usa vários token tokenizers para dividir o conteúdo do texto com base nos tokens.

tiktoken

tiktoken é um tokenizador BPE rápido de código aberto da OpenAI.

Podemos usá-lo para estimar o número de tokens usados. Pode ser mais preciso para os modelos da OpenAI.

  1. Como o texto é dividido: de acordo com os caracteres de entrada.
  2. Como o tamanho do bloco é medido: usando o tokenizador 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])
Madam Speaker, Madam Vice President, our First Lady and Second Gentleman. Members of Congress and the Cabinet. Justices of the Supreme Court. My fellow Americans.  
    
    Last year COVID-19 kept us apart. This year we are finally together again. 
    
    Tonight, we meet as Democrats Republicans and Independents. But most importantly as Americans. 
    
    With a duty to one another to the American people to the Constitution.

Também podemos carregar diretamente o divisor 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 é uma biblioteca de software de código aberto para processamento avançado de linguagem natural, escrita em Python e Cython.

Outra alternativa ao uso do NLTK é usar o tokenizador spaCy.

  1. Como o texto é dividido: usando o tokenizador spaCy.
  2. Como o tamanho do bloco é medido: contando o número de caracteres.
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 é um divisor de texto projetado especificamente para o modelo sentence-transformer. Seu comportamento padrão é dividir o texto em blocos de janela de token adequados para o modelo sentence-transformer desejado.

from langchain_text_splitters import SentenceTransformersTokenTextSplitter
splitter = SentenceTransformersTokenTextSplitter(chunk_overlap=0)
text = "Lorem "
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"tokens in text to split: {splitter.count_tokens(text=text_to_split)}")
tokens in text to split: 514
text_chunks = splitter.split_text(text=text_to_split)

print(text_chunks[1])
lorem

NLTK

O Natural Language Toolkit, mais conhecido como NLTK, é um conjunto de bibliotecas e programas para processamento simbólico e estatístico de linguagem natural (NLP) escritos na linguagem de programação Python, utilizados para o idioma inglês.

Em vez de simplesmente dividir o texto com base em "\n\n", podemos usar o NLTK para dividir com base no tokenizador NLTK.

  1. Método de divisão de texto: utilizando o tokenizador NLTK.
  2. Medição do tamanho do fragmento: medido pelo número de caracteres.
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])

Tokenizador Hugging Face

Hugging Face possui muitos tokenizadores.

Utilizamos o GPT2TokenizerFast dos tokenizadores Hugging Face para calcular o número de tokens no texto.

  1. Como o texto é segmentado: segmentado com base nos caracteres de entrada.
  2. Como o tamanho do fragmento é calculado: medido pelo número de tokens calculados pelo tokenizador 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])