Разделение токенов
Языковым моделям свойственны лимиты токенов. Не следует превышать их. Поэтому при разделении текста на куски лучше всего предварительно рассчитать количество токенов. Существует множество средств обработки токенов (токенизаторов). При расчете количества токенов в тексте следует использовать тот же токенизатор, что и в языковой модели.
В данной главе рассматривается, как LangChain использует различные токенизаторы для разделения контента на основе токенов.
tiktoken
tiktoken - быстрый токенизатор BPE, предоставленный в открытый доступ OpenAI.
Мы можем использовать его для оценки количества использованных токенов. Возможно, это более точно для моделей OpenAI.
- Как происходит разделение текста: в соответствии с введенными символами.
- Как измеряется размер фрагмента: с использованием токенизатора
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])
Мадам Спикер, миссис Вице-президент, наша первая леди и второй джентльмен. Члены Конгресса и кабинета. Судьи Верховного суда. Мои американцы.
В прошлом году COVID-19 разделил нас. В этом году мы наконец-то вместе снова.
Сегодня вечером мы встречаемся как демократы, республиканцы и независимые. Но самое главное, как американцы.
У нас есть обязанность перед друг другом, перед американским народом, перед Конституцией.
Также можно прямо загрузить токенизатор 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 - это библиотека с открытым исходным кодом для продвинутой обработки естественного языка, написанная на Python и Cython.
Еще один вариант использования NLTK заключается в использовании токенизатора spaCy.
- Как происходит разделение текста: с использованием токенизатора
spaCy
. - Как измеряется размер фрагмента: путем подсчета количества символов.
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
- это токенизатор текста, специально разработанный для модели sentence-transformer. Его поведение по умолчанию заключается в разделении текста на блоки размером с окно токенов, подходящим для желаемой модели 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"токенов в тексте для разделения: {splitter.count_tokens(text=text_to_split)}")
токенов в тексте для разделения: 514
text_chunks = splitter.split_text(text=text_to_split)
print(text_chunks[1])
lorem
NLTK
Естественноязычная библиотека, более известная как NLTK, представляет собой набор библиотек и программ для символьной и статистической обработки естественного языка (NLP), написанных на языке программирования Python и используемых для английского языка.
Вместо простого разделения текста на основе "\n\n", мы можем использовать NLTK для разделения на основе токенизатора NLTK.
- Метод разделения текста: использование токенизатора NLTK.
- Измерение размера блока: измеряется по количеству символов.
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
У Hugging Face есть много токенизаторов.
Мы используем GPT2TokenizerFast из токенизаторов Hugging Face для подсчета количества токенов в тексте.
- Как происходит сегментация текста: сегментация происходит на основе входных символов.
- Как рассчитывается размер блока: измеряется по количеству токенов, рассчитанных токенизатором 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])