การแบ่งโทเคน
โมเดลภาษามีขีดจำกัดของโทเคน คุณไม่ควรเกินขีดจำกัดของโทเคน ดังนั้น เมื่อแบ่งข้อความเป็นชิ้นย่อย ควรคำนวณจำนวนของโทเคนด้วย มีหลายตัวประมวลชิ้น (tokenizer) ที่ใช้ได้ เมื่อคำนวณจำนวนของโทเคนในข้อความ ควรใช้ตัวประมวลชิ้นเดียวกันกับโมเดลภาษาที่ใช้
บทนี้จะนำเสนอว่า LangChain ใช้ตัวแบ่งโทเคนต่าง ๆ ในการแบ่งเนื้อหาข้อความตามโทเคน
tiktoken
tiktoken เป็นตัวแบ่งโทเคนประเภท BPE ที่เร็ว open-source โดย 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])
นางประธานสภา นายกรัฐมนตรีรอง ภริยาแรกและผู้ชายอำนวยการ สมาชิกสภาผู้แทนและคณะรัฐมนตรี ตัวแทนศาลสูงสุด พี่เหลืองสหรัฐฯ พี่เมืองผมเสียเปล่า ปีที่แล้วโควิด 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 = "ลอเรม "
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 ได้ดังนั้น
- วิธีการแบ่งข้อความ: ใช้ตัวแบ่งข้อความของ 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 Tokenizer (ฮักกิง เฟซ โทโคไนเซอร์)
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])