การแบ่งโทเคน

โมเดลภาษามีขีดจำกัดของโทเคน คุณไม่ควรเกินขีดจำกัดของโทเคน ดังนั้น เมื่อแบ่งข้อความเป็นชิ้นย่อย ควรคำนวณจำนวนของโทเคนด้วย มีหลายตัวประมวลชิ้น (tokenizer) ที่ใช้ได้ เมื่อคำนวณจำนวนของโทเคนในข้อความ ควรใช้ตัวประมวลชิ้นเดียวกันกับโมเดลภาษาที่ใช้

บทนี้จะนำเสนอว่า LangChain ใช้ตัวแบ่งโทเคนต่าง ๆ ในการแบ่งเนื้อหาข้อความตามโทเคน

tiktoken

tiktoken เป็นตัวแบ่งโทเคนประเภท BPE ที่เร็ว open-source โดย OpenAI

เราสามารถใช้มันเพื่อประมาณจำนวนของโทเคนที่ใช้ อาจจะแม่นยำมากขึ้นสำหรับโมเดล 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])
นางประธานสภา นายกรัฐมนตรีรอง ภริยาแรกและผู้ชายอำนวยการ สมาชิกสภาผู้แทนและคณะรัฐมนตรี ตัวแทนศาลสูงสุด พี่เหลืองสหรัฐฯ พี่เมืองผมเสียเปล่า ปีที่แล้วโควิด 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

  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 = "ลอเรม "
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
ข้อความชิ้น = splitter.split_text(text=text_to_split)

print(text_chunks[1])
ลอเรม

NLTK (เอ็น-แอล-ทีเค)

เอ็น-แอล-ทีเค หรือ Natural Language Toolkit คือชุดห้องสมุดและโปรแกรมสำหรับการประมวลผลภาษาธรรมชาติ (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])