หน่วย 3 / 11

การแยกส่วนและการเตรียมเอกสาร

กำไร:

  • ประเมินขนาดก้อน การทับซ้อนกัน และการแลกเปลี่ยนเชิงความหมายเชิงตัวเลข
  • การเลือกกลยุทธ์การแบ่งส่วนที่เหมาะสมสำหรับเอกสารประเภทต่างๆ (PDF, ตาราง, รหัส, บันทึกการสนทนา)
  • ปรับปรุงคุณภาพการดึงข้อมูลและการกรองโดยการเพิ่มข้อมูลเมตาลงในแต่ละส่วน

นี่เป็นขั้นตอนที่ถูกมองข้ามมากที่สุดแต่มีความสำคัญที่สุดใน RAG: วิธีแยกย่อยเอกสาร สิ่งนี้เรียกว่าเป็นก้อน แม้ว่าคุณจะมอบเอกสารเดียวกันให้กับโมเดลเดียวกัน แต่เนื่องจากการแบ่งส่วนที่ไม่ดี การดึงข้อมูลจึงส่งคืนเอกสารที่ไม่ถูกต้อง และโมเดลจะไม่ให้คำตอบที่ดีนัก ในหน่วยนี้ เราครอบคลุมถึงกลยุทธ์การแยกส่วน วิธีปรับใช้ตามประเภทเอกสาร และวิธีการเพิ่มเมตาดาต้าที่มีความหมายลงในแต่ละส่วน

ทำไมเราถึงฉีก?

มีสามเหตุผล ขั้นแรก โมเดลการฝังจะแปลงข้อความที่มีความยาวสูงสุดที่กำหนดให้เป็นเวกเตอร์ที่มีความหมาย หากบททั้ง 40 หน้าถูกอัดแน่นเป็นเวกเตอร์เดียว ความหมายจะกลายเป็น "เบลอ" ประการที่สอง เราต้องการให้แบบจำลองเฉพาะส่วนที่จำเป็นตามบริบทเท่านั้น การส่งมอบเอกสารทั้งหมดมีราคาแพงและเสียสมาธิ ประการที่สาม เพื่อให้ดึงข้อมูลได้แม่นยำ หน่วยค้นหาจะต้องมีขนาดเล็กและเน้นเฉพาะจุด

ดังนั้นก้อนจึงเป็นหน่วยที่เล็กที่สุดในการดึงข้อมูล ไม่ควรใหญ่หรือเล็กเกินไป - กำลังพอดี

ขนาดก้อนและความสมดุลที่ทับซ้อนกัน

มีการตั้งค่าหลักสองแบบ: ขนาดก้อน (จำนวนโทเค็น/คำที่จะอยู่ในก้อน) และการทับซ้อนกัน (ส่วนที่แชร์โดยชิ้นใกล้เคียง)

ชิ้นเล็กๆ มาก (เช่น 100 โทเค็น): เน้นแต่ถูกตัดขาดจากบริบท เขาพูดว่า "เป็นเวลา 14 วัน" แต่ประโยคก่อนหน้าเหลืออีก 14 วัน ชิ้นที่มีขนาดใหญ่มาก (เช่น 2,000 โทเค็น): คงบริบท แต่มีเธรดจำนวนมากผสมกัน การฝังทำให้สับสนและหัวข้อที่ไม่เกี่ยวข้องมารวมกัน

การทับซ้อนกันช่วยแก้ปัญหาขอบเขต หากประโยคหนึ่งอยู่บนขอบของสองส่วนพอดี ประโยคนั้นจะถูกแบ่งออกเป็นสองส่วนโดยไม่ทับซ้อนกันและความหมายของประโยคนั้นก็จะสูญหายไป การทับซ้อนกันของโทเค็น 50-100 รายการช่วยให้แน่ใจว่าข้อมูลที่อยู่ภายในขีดจำกัดยังคงไม่เสียหายในอย่างน้อยหนึ่งส่วน

ขนาดก้อน

ข้อได้เปรียบ

ข้อเสีย

เนื้อหาที่เหมาะสม

ขนาดเล็ก (โทเค็น 100-250)

ความไวสูง, เน้น

บริบทอาจแตก

คำถามที่พบบ่อย บทความสั้น คำจำกัดความ

ปานกลาง (โทเค็น 300-600)

ยอดคงเหลือ; สถานการณ์ส่วนใหญ่

ขั้นตอน ตำรานโยบาย

ใหญ่ (โทเค็น 800-1500)

ความสมบูรณ์ของบริบท

การฝังที่ไม่ชัดเจน

บรรยายกาศ อธิบายยาว

เคล็ดลับ: หากคุณไม่รู้ว่าจะเริ่มต้นจากตรงไหน ให้เริ่มด้วยโทเค็น 400-500 ชิ้น และโทเค็น 50-80 ชิ้นซ้อนทับกัน จากนั้นวัดและปรับด้วยข้อมูลของคุณเอง ขนาดที่ "ถูกต้อง" ไม่เป็นสากล ขึ้นอยู่กับบริบท

กลยุทธ์การแบ่งส่วน

ขนาดคงที่: ตัดข้อความทุกโทเค็น N ง่ายและรวดเร็ว แต่สามารถขัดจังหวะประโยคกลางได้

ตามตัวคั่น (เรียกซ้ำ/ตัวคั่น): แบ่งตามย่อหน้าแล้วจึงแบ่งขอบเขตของประโยค มันคงรักษาความสมบูรณ์ของความหมายได้ดีขึ้น ระบบการผลิตส่วนใหญ่เริ่มต้นด้วยสิ่งนี้

การแบ่งส่วนความหมาย: จะพิจารณาการฝังประโยคและแบ่งส่วนที่มีการเปลี่ยนแปลงเรื่อง เป็นวิธีที่มีคุณภาพสูงสุดแต่มีราคาแพงที่สุด เมื่อมีปริมาณมาก ต้นทุนการทำธุรกรรมจะเพิ่มขึ้น

การรับรู้โครงสร้าง: ใช้โครงสร้างเอกสาร เช่น ส่วนหัว ส่วน ตาราง ตัวอย่างเช่น การแยกเอกสาร Markdown ตามส่วนหัวช่วยให้แน่ใจว่าแต่ละส่วนมีส่วนหัวของตัวเอง

การปรับเปลี่ยนตามประเภทเอกสาร

เอกสารแต่ละฉบับไม่เหมือนกัน กลยุทธ์แตกต่างกันไปตามประเภท:

  • PDF/ข้อความนโยบาย: ตามบุ๊กมาร์ก ขนาดกลาง ล้างหน้าซ้ำด้านบน/ล่าง (ส่วนหัว/ส่วนท้าย)
  • ตาราง: อย่าแยกบรรทัดออกจากบริบท เก็บแต่ละแถวด้วยข้อมูลส่วนหัว ("รายการ: X, ราคา: Y, หุ้น: Z") การแปลงตารางดิบเป็นข้อความธรรมดามักเป็นสิ่งจำเป็น
  • รหัส: แบ่งตามขอบเขตฟังก์ชัน/คลาส อย่าตัดฟังก์ชั่นออกไป
  • การบันทึกแชท/ตั๋ว: แยกตามข้อความหรือรอบการสนทนา รักษาความรู้ว่าใครพูดอะไร

# การแบ่งส่วนตามวงเล็บเหลี่ยม (แนวความคิด) chunks = bol( text, target_size=450, # token overlap=70, # tokenวงเล็บ=["\n\n", "\n", ". ", " "] # ย่อหน้าแรก, คำสุดท้าย)

เพิ่มข้อมูลเมตาลงในแต่ละแทร็ก

การแบ่งส่วนไม่ได้เป็นเพียง "การแบ่งแยก"; คือการเพิ่มคุณค่าให้กับแต่ละชิ้น ทุกแท็กที่คุณแนบไปกับแทร็กจะมีมูลค่าเป็นทองคำสำหรับการกรองและการอ้างอิงแหล่งที่มาในอนาคต

# ส่วนที่เพิ่มคุณค่า (แนวความคิด){ "text": "การลาโดยได้รับค่าจ้างรายปีคือ 14 วันโดยทำงาน 1-5 ปี...", "ข้อมูลเมตา": { "แหล่งที่มา": "ik_el_kitabi_v7.pdf", "section": "5.2 การลาประจำปี", "page": 23, "date": "2025-06", "department": "IK", "ความเป็นส่วนตัว": "ภายใน" }}

เทคนิคอันทรงพลังอีกประการหนึ่งคือการเพิ่มส่วนหัวตามบริบท: การเขียนชื่อบทที่ตอนต้นของแต่ละชิ้น ดังนั้น แม้แต่ส่วนที่ไม่ปะติดปะต่อกัน เช่น "สำหรับ 14 วัน" ก็ยังฝังไว้ดีกว่าและมีความหมายมากกว่าเป็น "การลาประจำปี - 14 วัน"

ก้อนที่อ่อนแอ / ก้อนที่แข็งแกร่ง

อ่อนแอ (ฮาร์ดคัทตาบอด ไม่มีข้อมูลเมตา):

ตัดข้อความทุกๆ 1,000 ตัวอักษร เก็บเฉพาะข้อความเท่านั้น# ผลลัพธ์: ตารางถูกแบ่งตรงกลาง "14 วัน" ยังคงอยู่โดยไม่มีบริบท# ไม่ทราบว่ามาจากเอกสารใด ไม่สามารถกรองได้

มีประสิทธิภาพ (ทราบโครงสร้าง + ส่วนหัว + ข้อมูลเมตา):

แบ่งเอกสารตามหัวข้อ เพิ่มชื่อส่วนลงในแต่ละส่วน แนบแหล่งที่มา หน้า วันที่ และข้อมูลเมตาความเป็นส่วนตัว แปลงตารางตารางเป็นข้อความธรรมดาด้วยส่วนหัว # ผลลัพธ์: เน้น บริบท กรองได้ แหล่งที่มาได้

มินิเคสสามอัน

กรณีที่ 1 — ภัยพิบัติจากการวาดภาพ ทีมการเงินแบ่งรายการราคา 200 หน้าออกด้วยการตัดอย่างไม่ตั้งใจ แถวของตารางถูกแบ่งแบบสุ่ม “สินค้า X ราคาเท่าไหร่?” โมเดลอ่านผิดบรรทัดแล้วให้ราคาผิด (ผิด 9 ใน 12 กรณี) เมื่อฉันแปลงแถวของตารางเป็นข้อความธรรมดาในรูปแบบ "ผลิตภัณฑ์: … | ราคา: … | หน่วย: …" ข้อผิดพลาดลดลงเหลือ 0 จาก 12

กรณีที่ 2 — ชิ้นใหญ่มาก ในวิกิ แต่ละหน้าประกอบด้วยส่วนเดียว (บางหน้าบอกว่ามีโทเค็น 3,000 โทเค็น) การฝังไม่ชัดเจนเนื่องจากมี "การลา" "ค่าล่วงเวลา" และ "เงินเดือน" อยู่ในหน้าเดียว ส่วนชั่วโมงทำงานก็เข้ามามีบทบาทเกี่ยวกับคำถามเรื่องการลาด้วย เมื่อแบ่งหน้าต่างๆ เป็นขนาดกลางตามชื่อเรื่องcall@5 เพิ่มขึ้นจาก 64% เป็น 91%

กรณีที่ 3 — ประโยคที่ถูกตัดทอนโดยไม่ทับซ้อนกัน โทเค็นคงที่ 250 เหรียญสำหรับทีมกฎหมาย ไม่มีการทับซ้อนกัน คำจำกัดความที่สำคัญตกอยู่บนขอบเขตของสองส่วนและแบ่งออกเป็นสองส่วน ไม่มีคำตอบใดคำตอบหนึ่งที่สมบูรณ์ เมื่อมีการเพิ่มโทเค็น 60 อันทับซ้อนกัน คำจำกัดความเดียวกันนั้นยังคงเหมือนเดิมและคำตอบที่ถูกต้องก็ถูกส่งกลับ

ข้อผิดพลาดทั่วไป

  • Blind FIXED CUT: แยกประโยคและตารางที่อยู่ตรงกลาง ความหมายหายไป
  • ปล่อยให้การทับซ้อนอยู่ที่ศูนย์: ข้อมูลที่อยู่บนขอบเขตจะถูกแบ่งและสูญหาย
  • ไม่เพิ่มข้อมูลเมตา: การกรองและการแสดงแหล่งที่มากลายเป็นไปไม่ได้
  • ปล่อยให้ตารางเป็นข้อมูลดิบ: โมเดลไม่สามารถแก้ไขโครงสร้างตารางได้ แปลงบรรทัดเป็นข้อความธรรมดา
  • การกำหนดกลยุทธ์เดียว: PDF, โค้ดและตารางจะไม่ถูกแยกออกด้วยวิธีเดียวกัน ปรับให้เข้ากับประเภท
ข้อควรระวัง: อย่าตั้งค่า Chunking เพียงครั้งเดียวแล้วลืมมันไปซะ วัดคุณภาพการดึงข้อมูลอีกครั้งเมื่อมีเอกสารประเภทใหม่มาถึง (ตั๋วจากระบบใหม่ PDF ที่สแกน) ข้อมูลอินพุตไม่ถูกต้องหมายถึงการตอบสนองที่ไม่ดี ("ขยะเข้า, ขยะออก")

โดยสรุป

  • Chunk เป็นหน่วยที่เล็กที่สุดในการดึงข้อมูล ไม่ใหญ่หรือเล็กเกินไป – ควรมีความสมดุลตามเนื้อหา
  • ขนาดก้อนแสดงถึงความสมดุลของโฟกัสและบริบท คาบเกี่ยวกันจัดการการสูญเสียขอบเขต
  • การแบ่งส่วนตามวงเล็บและการรับรู้โครงสร้างเป็นจุดเริ่มต้นของระบบเจนเนอเรชั่นส่วนใหญ่ semantic chunking มีคุณภาพดี แต่มีราคาแพง
  • ประเภทต่างๆ เช่น ตาราง สคริปต์ และการแชทจำเป็นต้องมีกลยุทธ์ของตัวเอง แปลงตารางเป็นข้อความธรรมดา
  • เพิ่มข้อมูลเมตาแหล่งที่มา/วันที่/บท/ความเป็นส่วนตัว และชื่อส่วนลงในแต่ละแทร็ก นี่คือพื้นฐานของการกรองและการอ้างอิง

งานสมัคร

แบ่งส่วนของเอกสารที่คุณเลือกออกเป็นสามวิธี: (1) ชิ้นเล็กจำนวน 200 โทเค็น (2) ชิ้นกลางจำนวน 500 โทเค็น (โทเค็น 70 ชิ้นซ้อนทับกัน) (3) ชิ้นใหญ่ชิ้นเดียว ถามคำถามเดียวกัน 3 ข้อสำหรับแต่ละกลยุทธ์ ทำเครื่องหมายด้วยตนเองว่าจะนำส่วนใดเข้ามา และจดเหตุผลว่ากลยุทธ์ใดทำงานได้ดีที่สุดสำหรับเอกสารนั้น จากนั้นเพิ่มช่องข้อมูลเมตาอย่างน้อยสี่ช่องและ "ชื่อบท" ลงในแต่ละแทร็ก หากเอกสารมีตาราง ให้แปลงแถวของตารางเป็นข้อความธรรมดาในรูปแบบ "field:value"

รายการตรวจสอบ

  • [ ] ฉันสามารถบอกได้ว่าก้อนนั้นเป็นหน่วยที่เล็กที่สุดในการดึงข้อมูล และขนาดคือความสมดุลของโฟกัสและบริบท
  • [ ] ฉันรู้ว่าทำไมการทับซ้อนจึงป้องกันการสูญเสียขอบเขต
  • [ ] ฉันสามารถแยกแยะระหว่างการแบ่งส่วนแบบยึดตามวงเล็บ ความหมาย และแบบรับรู้โครงสร้างได้
  • [ ] ฉันสามารถปรับกลยุทธ์สำหรับโต๊ะ โค้ด และแชทได้
  • [ ] ฉันเสริมการดึงข้อมูลโดยเพิ่มข้อมูลเมตาและชื่อบทลงในแต่ละแทร็ก