โปรแกรมแปลงเอกสาร
โปรแกรมแปลงเอกสารของ LangChain ทำหน้าที่แยกเนื้อหาของข้อความ โดยแบ่งบทความขนาดใหญ่เป็นส่วนย่อยหลายๆ ส่วน เราทำเช่นนี้เพราะโมเดลขนาดใหญ่มักจะมีข้อจำกัดในการยืดคำพูดและไม่สามารถให้ข้อมูลทั้งหมดไปยัง AI ได้ แม้ว่าบางโมเดลขนาดใหญ่อาจยินยอมให้ยาวมากเท่าไหร่ก็ตาม จากมุมมองของค่าใช้จ่าย มันไม่คุ้มค่าที่จะส่งเนื้อหาที่ยาวขึ้นไปยัง AI ทั้งนี้ หลังจากทั้งหมด เนื้อหายิ่งยาว ราคาการเรียก API ยิ่งสูง (แม้ว่าสำหรับโมเดลโอเพนซอร์สที่ถูกติดตั้งในท้องถิ่น การส่งเนื้อหาที่ยาวก็ต้องใช้หน่วยความจำ GPU มากขึ้นและการทำนายช้าลง) วิธีที่เหมาะสมคือ สร้างเนื้อหาที่เกี่ยวข้องเข้าด้วยกันเป็นส่วนเบื้องหลังและคำพูดเมื่อขอข้อมูลจากโมเดล AI
LangChain มีฟังก์ชันแปลงเอกสารหลายประการซึ่งสามารถแยก ผสม และกรองเนื้อหาของเอกสารได้อย่างง่ายดาย
โปรแกรมแบ่งข้อความ
เมื่อต้องการจัดการกับบล็อกข้อความขนาดใหญ่ คุณจำเป็นต้องแบ่งข้อความเป็นชิ้นๆ แม้ว่าดูเหมือนจะง่าย แต่มันมีความซับซ้อนมาก คุณต้องการที่จะเก็บบล็อกข้อความที่เกี่ยวข้องกับคำ คำว่า "ที่เกี่ยวข้องบรรยาย" ที่นี่อาจขึ้นอยู่กับประเภทของข้อความ
ในระดับสูง โปรแกรมแบ่งข้อความทำงานตามวิธีดังนี้:
- แบ่งข้อความเป็นบล็อคข้อความเล็กๆที่มีความหมาย (โดยทั่วไปคือประโยค)
- เริ่มต้นการผสมบล็อคเล็กๆเหล่านี้ให้กลายเป็นขนาดใหญ่ขึ้นจนกระทั่งไปสู่ขนาดที่เฉพาะเจาะจง (ตามฟังก์ชันบางตัว)
- หลังจากที่ได้ขนาดเฉพาะเจาะจงแล้ว จะถือว่าบล็อคเองเป็นบรรทัดข้อความตัวเองและเริ่มสร้างบล็อคข้อความใหม่โดยมีส่วนซ้อน (เพื่อรักษาบริบทระหว่างบล็อค)
นี้แสดงให้เห็นว่าคุณสามารถปรับแต่งโปรแกรมแบ่งข้อความตามแกนที่แตกต่างกันสองอย่างได้พร้อมๆกัน:
- วิธีการแบ่งข้อความ
- วิธีการวัดขนาดของบล็อค
ตัวอย่าง
โปรแกรมแบ่งข้อความที่แนะนำเป็นค่าตั้งต้นคือ RecursiveCharacterTextSplitter โปรแกรมแบ่งข้อความนี้รับรายการของตัวอักษร มันพยายามสร้างบล็อคขึ้นมาจากตัวอักษรตัวแรก แต่ถ้าบล็อคไหนมากเกินไป มันจะพยายามหาตัวอักษรตัวถัดไป และต่อมาต่อไปนี้ โดยค่าตั้งต้นที่มันพยายามแบ่งมีดังนี้ ["\\\\n\\\\n", "\\\\n", " ", ""]
นอกจากการควบคุมตัวอักษรที่สามารถแบ่งได้คุณยังสามารถควบคุมเรื่องอื่นๆได้เช่นกัน:
-
length_function
: วิธีคำนวณความยาวของบล็อค โดยค่าตั้งต้นจะนับเฉพาะจำนวนตัวอักษร แต่บางครั้งอาจต้องการนับโทเก็นไว้ด้วย -
chunk_size
: ขนาดสูงสุดของบล็อคของคุณ (เที่ยบเทียบด้วยฟังก์ชันความยาว) -
chunk_overlap
: การซ้อนทับสูงสุดระหว่างบล็อค การจัดเก็บส่วนทีทับไว้สามารถช่วยให้ความต่อเนื่องระหว่างบล็อคอยู่ (เช่น การทำหน้าต่างเลื่อนไหล) -
add_start_index
: ระบุว่าจะรวมตำแหน่งเริ่มต้นของแต่ละบล็อคในเอกสารเดิมไว้ในเมตาดาต้า
with open('../../state_of_the_union.txt') as f:
state_of_the_union = f.read()
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size = 100,
chunk_overlap = 20,
length_function = len,
add_start_index = True,
)
texts = text_splitter.create_documents([state_of_the_union])
print(texts[0])
print(texts[1])
page_content='.. ตัวอย่างข้อความที่ถูกละเว้นไป..' metadata={'start_index': 0}
page_content='.. ตัวอย่างข้อความที่ถูกละเว้นไป..' metadata={'start_index': 82}
การแปลงอื่นๆ อีกมากมาย
กรองเอกสารที่ซ้ำซ้อน, แปลเอกสาร, สกัดข้อมูลเมตาดาต้า และอื่นๆ
นอกจากการแบ่งเอกสาร เรายังสามารถทำการแปลงอื่นๆกับเนื้อหาของเอกสารได้ด้วย ผ่านทาง EmbeddingsRedundantFilter
เราสามารถระบุเอกสารที่คล้ายกันและกรองเนื้อหาที่ซ้ำซ้อนออกได้ ผ่านการรวม doctran เราสามารถทำการแปลงเอกสารจากภาษาหนึ่งเป็นอีกภาษาหนึ่งextract และสกัดคุณสมบัติที่ต้องการแล้วเพิ่มไปยังเมตาดาต้าแล้วแปลงคำพูดให้เป็นคำถามและคำตอบ และอื่นๆ