Token Splitting

Sprachmodelle haben Token-Limits. Du solltest das Token-Limit nicht überschreiten. Daher ist es am besten, die Anzahl der Tokens beim Aufteilen von Text in Abschnitte zu berechnen. Es gibt viele Token-Prozessoren (Tokenizer), die verfügbar sind. Beim Berechnen der Anzahl von Tokens im Text sollte derselbe Token-Prozessor, der im Sprachmodell verwendet wird, ebenfalls verwendet werden.

In diesem Kapitel wird erläutert, wie LangChain verschiedene Token-Tokenizer verwendet, um Textinhalt basierend auf Tokens aufzuteilen.

tiktoken

tiktoken ist ein schneller BPE-Tokenizer, der von OpenAI als Open Source veröffentlicht wurde.

Wir können ihn verwenden, um die Anzahl der verwendeten Tokens zu schätzen. Er ist möglicherweise präziser für OpenAI-Modelle.

  1. Wie der Text aufgeteilt wird: entsprechend den Eingabezeichen.
  2. Wie die Chunk-Größe gemessen wird: unter Verwendung des tiktoken-Tokenizers.
%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, unsere First Lady und der Second Gentleman. Mitglieder des Kongresses und des Kabinetts. Richter des Obersten Gerichtshofs. Meine amerikanischen Mitbürger.  
    
    Letztes Jahr hat uns COVID-19 getrennt. Dieses Jahr sind wir endlich wieder zusammen. 
    
    Heute Abend treffen wir uns als Demokraten, Republikaner und Unabhängige. Aber am wichtigsten als Amerikaner. 
    
    Mit einer Verpflichtung zueinander, zum amerikanischen Volk, zur Verfassung.

Wir können auch direkt den tiktoken-Splitter laden.

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 ist eine Open-Source-Softwarebibliothek für fortgeschrittene natürliche Sprachverarbeitung, die in Python und Cython geschrieben ist.

Eine weitere Alternative zur Verwendung von NLTK ist die Verwendung des spaCy-Tokenizer.

  1. Wie der Text aufgeteilt wird: Verwendung des spaCy-Tokenizers.
  2. Wie die Chunk-Größe gemessen wird: durch Zählen der Anzahl von Zeichen.
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 ist ein Text-Splitter, der speziell für das Sentence-Transformer-Modell entwickelt wurde. Sein Standardverhalten besteht darin, den Text in Blöcke der Token-Fenstergröße für das gewünschte SentenceTransformer-Modell zu unterteilen.

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 im zu splittenden Text: {splitter.count_tokens(text=text_to_split)}")
Tokens im zu splittenden Text: 514
text_chunks = splitter.split_text(text=text_to_split)

print(text_chunks[1])
lorem

NLTK

Das Natural Language Toolkit, besser bekannt als NLTK, ist eine Reihe von Bibliotheken und Programmen für die symbolische und statistische Verarbeitung natürlicher Sprache (NLP), die in der Programmiersprache Python geschrieben sind und für Englisch verwendet werden.

Anstelle des einfachen Aufteilens des Textes basierend auf "\n\n" können wir NLTK verwenden, um ihn basierend auf dem NLTK-Tokenizer aufzuteilen.

  1. Textaufteilungsmethode: Verwendung des NLTK-Tokenizers.
  2. Messung der Chunk-Größe: gemessen anhand der Anzahl von Zeichen.
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 bietet viele Tokenizer.

Wir verwenden den GPT2TokenizerFast von den Hugging Face Tokenizern, um die Anzahl der Tokens im Text zu berechnen.

  1. Wie der Text segmentiert wird: basierend auf den Eingabezeichen.
  2. Wie die Chunk-Größe berechnet wird: gemessen anhand der Anzahl der von dem Hugging Face Tokenizer berechneten Tokens.
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])