División de tokens

Los modelos de lenguaje tienen límites de tokens. No se debe exceder el límite de tokens. Por lo tanto, al dividir el texto en trozos, es mejor calcular el número de tokens. Hay varios procesadores de tokens (tokenizers) disponibles. Al calcular el número de tokens en el texto, se debe utilizar el mismo procesador de tokens que se utiliza en el modelo de lenguaje.

Este capítulo presenta cómo LangChain utiliza varios tokenizadores para dividir el contenido del texto en base a tokens.

tiktoken

tiktoken es un tokenizador BPE rápido de código abierto desarrollado por OpenAI.

Podemos usarlo para estimar el número de tokens utilizados. Puede ser más preciso para modelos de OpenAI.

  1. Cómo se divide el texto: según los caracteres de entrada.
  2. Cómo se mide el tamaño del fragmento: utilizando el 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])
Señora Presidenta, Señora Vicepresidenta, nuestra Primera Dama y Segundo Caballero. Miembros del Congreso y del Gabinete. Magistrados de la Corte Suprema. Mis compatriotas estadounidenses.  
    
    El año pasado, el COVID-19 nos mantuvo separados. Este año finalmente estamos juntos de nuevo. 
    
    Esta noche, nos reunimos como demócratas, republicanos e independientes. Pero, lo más importante, como estadounidenses. 
    
    Con el deber hacia el otro, hacia el pueblo estadounidense, hacia la Constitución.

También podemos cargar directamente el divisor de 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 es una biblioteca de software de código abierto para el procesamiento avanzado del lenguaje natural escrita en Python y Cython.

Otra alternativa para usar NLTK es utilizar el tokenizador de spaCy.

  1. Cómo se divide el texto: utilizando el tokenizador spaCy.
  2. Cómo se mide el tamaño del fragmento: contando el 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 es un divisor de texto diseñado específicamente para el modelo de sentence-transformer. Su comportamiento predeterminado es dividir el texto en bloques del tamaño de ventana de tokens adecuado para el modelo de sentence-transformer deseado.

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

El Kit de herramientas de procesamiento del lenguaje natural, más conocido como NLTK, es un conjunto de bibliotecas y programas para el procesamiento del lenguaje natural (PLN) simbólico y estadístico escritos en el lenguaje de programación Python, utilizados para el inglés.

En lugar de simplemente dividir el texto basado en "\n\n", podemos usar NLTK para dividirlo en base al tokenizador de NLTK.

  1. Método de división de texto: utilizando el tokenizador de NLTK.
  2. Medición del tamaño del fragmento: medido por el 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 de Hugging Face

Hugging Face tiene muchos tokenizadores.

Utilizamos el GPT2TokenizerFast de los tokenizadores de Hugging Face para calcular el número de tokens en el texto.

  1. Cómo se segmenta el texto: segmentado en base a los caracteres de entrada.
  2. Cómo se calcula el tamaño del fragmento: medido por el número de tokens calculados por el tokenizador de 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])