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.
- Como o texto é dividido: de acordo com os caracteres de entrada.
- 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.
- Como o texto é dividido: usando o tokenizador
spaCy
. - 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.
- Método de divisão de texto: utilizando o tokenizador NLTK.
- 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.
- Como o texto é segmentado: segmentado com base nos caracteres de entrada.
- 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])