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.
- Wie der Text aufgeteilt wird: entsprechend den Eingabezeichen.
- 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.
- Wie der Text aufgeteilt wird: Verwendung des
spaCy
-Tokenizers. - 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.
- Textaufteilungsmethode: Verwendung des NLTK-Tokenizers.
- 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.
- Wie der Text segmentiert wird: basierend auf den Eingabezeichen.
- 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])