Podział tokenów
Modele językowe mają ograniczenia co do ilości tokenów. Należy unikać przekraczania tej granicy. Dlatego podział tekstu na fragmenty powinien uwzględniać liczbę tokenów. Istnieje wiele procesorów tokenów (tokenizerów), które można wykorzystać. Aby obliczyć liczbę tokenów w tekście, należy użyć tego samego procesora tokenów, jakiego używa model językowy.
W tym rozdziale przedstawione jest, w jaki sposób LangChain wykorzystuje różne tokenizatory do podziału treści tekstowej na podstawie tokenów.
tiktoken
tiktoken to szybki tokenizator BPE udostępniony jako open source przez OpenAI.
Możemy go wykorzystać do oszacowania liczby użytych tokenów. Może to być bardziej precyzyjne dla modeli OpenAI.
- Jak tekst jest dzielony: na podstawie wprowadzonych znaków.
- Jak mierzony jest rozmiar fragmentu: przy użyciu tokenizatora
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])
Pani Marszałek, Pani Wiceprezydent, nasza Pierwsza Dama i Drugi Pan. Członkowie Kongresu i Gabinetu. Sędziowie Sądu Najwyższego. Moi Rodacy.
W zeszłym roku COVID-19 nas dzielił. W tym roku wreszcie jesteśmy znowu razem.
Dziś wieczorem spotykamy się jako Demokraci, Republikanie i Niezależni. Ale przede wszystkim jako Amerykanie.
Z obowiązkiem względem siebie, narodu amerykańskiego i Konstytucji.
Możemy także bezpośrednio załadować podział tekstu za pomocą tiktoken splitter.
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 to otwarta biblioteka oprogramowania do zaawansowanego przetwarzania języka naturalnego napisana w języku Python i Cython.
Inną alternatywą do użycia NLTK jest użycie tokenizer'a spaCy.
- Jak tekst jest dzielony: przy użyciu tokenizer'a
spaCy
. - Jak mierzony jest rozmiar fragmentu: poprzez policzenie liczby znaków.
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
to podział tekstu zaprojektowany specjalnie dla modelu sentence-transformer. Domyślne zachowanie polega na podziale tekstu na bloki o rozmiarze okna tokenów odpowiednim dla docelowego modelu sentence-transformer.
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
Natural Language Toolkit, bardziej znany jako NLTK, to zestaw bibliotek i programów do przetwarzania języka naturalnego (NLP) opartych na symbolach i statystyce, napisanych w języku programowania Python, używanych do języka angielskiego.
Zamiast po prostu dzielić tekst na podstawie "\n\n", możemy użyć NLTK do podziału na podstawie tokenizatora NLTK.
- Metoda dzielenia tekstu: za pomocą tokenizatora NLTK.
- Pomiar rozmiaru fragmentu: mierzony przez liczbę znaków.
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])
Tokenizer Hugging Face
Hugging Face ma wiele tokenizatorów.
Korzystamy z GPT2TokenizerFast z Hugging Face tokenizers do obliczenia liczby tokenów w tekście.
- Jak jest segmentowany tekst: zsegmentowany na podstawie znaków wejściowych.
- W jaki sposób obliczany jest rozmiar fragmentu: mierzony przez liczbę tokenów obliczoną przez tokenizator 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])