تقسیم توکن‌ها

مدل‌های زبان محدودیت‌های توکن دارند. نباید حداکثر توکن مجاز را بیشتر کنید. بنابراین، هنگام تقسیم متن به قطعات، بهتر است تعداد توکن‌ها را محاسبه کنید. تعدادی پردازنده توکن (توکن ساز) موجود است. هنگام محاسبه تعداد توکن‌ها در متن، باید از همان پردازنده توکنی استفاده شود که در مدل زبان استفاده می‌شود.

در این فصل، شما با استفاده از توکن‌ساز‌های مختلف LangChain در تقسیم محتوای متن بر اساس توکن‌ها آشنا خواهید شدید.

tiktoken

tiktoken یک توکن‌ساز BPE سریع از طرف OpenAI به صورت open-source منتشر شده است.

ما می‌توانیم از آن برای تخمین تعداد توکن‌های استفاده شده استفاده کرد. این ممکن است برای مدل‌های OpenAI دقیق‌تر باشد.

  1. چگونگی تقسیم متن: بر اساس حروف ورودی.
  2. چگونگی اندازه قطعه: با استفاده از توکن‌ساز 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 یک کتابخانه نرم افزاری open-source برای پردازش زبان‌های طبیعی پیشرفته نوشته شده به زبان پایتون و سایتون است.

یک جایگزین دیگر برای استفاده از NLTK، استفاده از توکن‌ساز spaCy است.

  1. چگونگی تقسیم متن: با استفاده از توکن‌ساز spaCy.
  2. چگونگی اندازه قطعه: با شمردن تعداد حروف.
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

استفاده از Natural Language Toolkit، معمولاً با نام NLTK شناخته می‌شود، یک مجموعه کتابخانه‌ها و برنامه‌ها برای پردازش زبان طبیعی (NLP) نمادین و آماری است که به زبان برنامه‌نویسی Python نوشته شده و برای زبان انگلیسی استفاده می‌شود.

به جای اینکه متن را بر اساس "\n\n" به صورت ساده تقسیم کنیم، می‌توانیم از NLTK برای تقسیم بندی مبتنی بر توکن‌ساز NLTK استفاده کنیم.

  1. روش تقسیم متن: استفاده از توکن‌ساز NLTK.
  2. اندازه قسمت‌بندی: اندازه‌گیری بر اساس تعداد کاراکترها.
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، تعداد زیادی توکن‌ساز وجود دارد.

ما از GPT2TokenizerFast از توکن‌سازهای Hugging Face برای محاسبه تعداد توکن‌ها در متن استفاده می‌کنیم.

  1. چگونگی تقسیم متن: تقسیم بندی بر اساس کاراکترهای ورودی.
  2. چگونگی محاسبه اندازه قسمت: اندازه‌گیری بر اساس تعداد توکن‌های محاسبه شده توسط توکن‌ساز 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])