โปรแกรมแปลงเอกสาร

โปรแกรมแปลงเอกสารของ LangChain ทำหน้าที่แยกเนื้อหาของข้อความ โดยแบ่งบทความขนาดใหญ่เป็นส่วนย่อยหลายๆ ส่วน เราทำเช่นนี้เพราะโมเดลขนาดใหญ่มักจะมีข้อจำกัดในการยืดคำพูดและไม่สามารถให้ข้อมูลทั้งหมดไปยัง AI ได้ แม้ว่าบางโมเดลขนาดใหญ่อาจยินยอมให้ยาวมากเท่าไหร่ก็ตาม จากมุมมองของค่าใช้จ่าย มันไม่คุ้มค่าที่จะส่งเนื้อหาที่ยาวขึ้นไปยัง AI ทั้งนี้ หลังจากทั้งหมด เนื้อหายิ่งยาว ราคาการเรียก API ยิ่งสูง (แม้ว่าสำหรับโมเดลโอเพนซอร์สที่ถูกติดตั้งในท้องถิ่น การส่งเนื้อหาที่ยาวก็ต้องใช้หน่วยความจำ GPU มากขึ้นและการทำนายช้าลง) วิธีที่เหมาะสมคือ สร้างเนื้อหาที่เกี่ยวข้องเข้าด้วยกันเป็นส่วนเบื้องหลังและคำพูดเมื่อขอข้อมูลจากโมเดล AI

LangChain มีฟังก์ชันแปลงเอกสารหลายประการซึ่งสามารถแยก ผสม และกรองเนื้อหาของเอกสารได้อย่างง่ายดาย

โปรแกรมแบ่งข้อความ

เมื่อต้องการจัดการกับบล็อกข้อความขนาดใหญ่ คุณจำเป็นต้องแบ่งข้อความเป็นชิ้นๆ แม้ว่าดูเหมือนจะง่าย แต่มันมีความซับซ้อนมาก คุณต้องการที่จะเก็บบล็อกข้อความที่เกี่ยวข้องกับคำ คำว่า "ที่เกี่ยวข้องบรรยาย" ที่นี่อาจขึ้นอยู่กับประเภทของข้อความ

ในระดับสูง โปรแกรมแบ่งข้อความทำงานตามวิธีดังนี้:

  1. แบ่งข้อความเป็นบล็อคข้อความเล็กๆที่มีความหมาย (โดยทั่วไปคือประโยค)
  2. เริ่มต้นการผสมบล็อคเล็กๆเหล่านี้ให้กลายเป็นขนาดใหญ่ขึ้นจนกระทั่งไปสู่ขนาดที่เฉพาะเจาะจง (ตามฟังก์ชันบางตัว)
  3. หลังจากที่ได้ขนาดเฉพาะเจาะจงแล้ว จะถือว่าบล็อคเองเป็นบรรทัดข้อความตัวเองและเริ่มสร้างบล็อคข้อความใหม่โดยมีส่วนซ้อน (เพื่อรักษาบริบทระหว่างบล็อค)

นี้แสดงให้เห็นว่าคุณสามารถปรับแต่งโปรแกรมแบ่งข้อความตามแกนที่แตกต่างกันสองอย่างได้พร้อมๆกัน:

  1. วิธีการแบ่งข้อความ
  2. วิธีการวัดขนาดของบล็อค

ตัวอย่าง

โปรแกรมแบ่งข้อความที่แนะนำเป็นค่าตั้งต้นคือ 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 และสกัดคุณสมบัติที่ต้องการแล้วเพิ่มไปยังเมตาดาต้าแล้วแปลงคำพูดให้เป็นคำถามและคำตอบ และอื่นๆ