บริบท โทเคน และไบต์: จัดข้อความไทยให้ AI ใช้งานได้
ข้อความไทยหนึ่งหน้ามีกี่โทเคน ไม่มีอัตราตายตัวที่ใช้ได้กับทุกโมเดล การจัดงานให้ AI ควรแยกสามเรื่องก่อน: ปริมาณบริบทที่โมเดลรับได้ จำนวนโทเคนที่อนุญาตให้สร้าง และขนาดข้อมูลเป็นไบต์ที่ระบบยอมรับ บทความนี้สำหรับผู้เขียนและผู้พัฒนาแอปที่ต้องส่งเอกสารภาษาไทย โดยเน้นการแบ่งงานให้ตรวจได้ แทนการเพิ่มข้อความไปเรื่อย ๆ จนชนข้อจำกัด
ประเด็นสำคัญ
- จำนวนคำ ตัวอักษร โทเคน และไบต์ไม่ใช่หน่วยเดียวกัน
- หน้าต่างบริบทใหญ่ไม่ยกเลิกข้อจำกัดไฟล์หรือยอดคงเหลือ
- แบ่งเอกสารตามหัวข้อและเก็บหมายเลขอ้างอิง แทนการตัดกลางประโยคหรือกลางข้อมูล UTF-8
เริ่มจากระบุว่าข้อจำกัดนับอะไร
บริบทคือข้อมูลที่มีส่วนร่วมในคำขอ เช่น คำสั่ง ประวัติ และเนื้อหาที่แนบ ส่วนโทเคนเอาต์พุตเป็นงบสำหรับการสร้างคำตอบ และอาจรวมการให้เหตุผลตามโมเดล ขนาดคำขอหรือไฟล์เป็นอีกชั้นหนึ่งซึ่งมักวัดเป็นไบต์ การมีพื้นที่บริบทเหลือจึงไม่ได้แปลว่าอัปโหลดไฟล์ใหญ่เท่าไรก็ได้ หรือจะได้รับคำตอบยาวเท่ากับข้อมูลที่ส่งเข้าไป
ภาษาไทยไม่มีการเว้นวรรคระหว่างทุกคำ และมีสระหรือวรรณยุกต์ที่ประกอบกับอักษรอื่น การนับจากช่องว่างจึงไม่ใช่การนับคำที่เชื่อถือได้ ส่วนการนับตัวอักษรด้วยโค้ดก็อาจไม่ตรงกับจำนวนหน่วยที่คนมองเห็น อย่าใช้สูตรจากภาษาอังกฤษ เช่น หนึ่งคำเท่ากับจำนวนโทเคนคงที่ มาอ้างเป็นตัวเลขที่แน่นอนสำหรับภาษาไทย
วัดขนาด UTF-8 ก่อนส่งไฟล์
หากข้อจำกัดระบุเป็นไบต์ ให้วัดไบต์จริง ตัวอย่าง Python ด้านล่างอ่านไฟล์ notes.txt ด้วย UTF-8 และแสดงจำนวน code point กับขนาดเมื่อเข้ารหัสกลับเป็น UTF-8 โปรแกรมนี้ไม่ส่งข้อมูลไปยัง Dikaya และไม่ได้คำนวณโทเคนของโมเดล ผลลัพธ์ใช้ตอบคำถามเรื่องขนาดไฟล์เท่านั้น
หากอ่านไฟล์แล้วเกิดข้อผิดพลาดการถอดรหัส ให้ตรวจ encoding ของไฟล์ก่อน ไม่ควรใช้ errors="ignore" เพื่อลบส่วนที่อ่านไม่ได้เงียบ ๆ เพราะอาจทำให้ชื่อ ตัวเลข หรือข้อความสำคัญหายไป เก็บต้นฉบับไว้และตรวจไฟล์ที่แปลงแล้วก่อนใช้งาน
from pathlib import Path
raw = Path("notes.txt").read_bytes()
text = raw.decode("utf-8")
print("code points:", len(text))
print("UTF-8 bytes:", len(text.encode("utf-8")))
print("original file bytes:", len(raw))เลือกบริบทที่จำเป็น ไม่ใช่ประวัติทั้งหมด
สมมติว่าต้องให้ AI สรุปข้อสรุปการประชุมครั้งล่าสุด ข้อมูลที่จำเป็นคือบันทึกครั้งนั้น คำอธิบายคำย่อ และข้อตกลงก่อนหน้าที่เกี่ยวข้อง ไม่จำเป็นต้องส่งทุกการทดลองหรือบทสนทนาที่ถูกยกเลิก การใส่ข้อมูลมากอาจเพิ่มค่าใช้จ่ายและทำให้แยกฉบับที่ใช้จริงได้ยากขึ้น โดยไม่ได้รับประกันว่าคำตอบจะดีขึ้น
เขียนเป้าหมายก่อนเลือกข้อความ เช่น “ต้องการรายการการตัดสินใจ ผู้รับผิดชอบ และกำหนดเวลา โดยไม่เติมข้อมูลที่ไม่ได้ระบุ” จากนั้นเลือกเฉพาะส่วนที่ช่วยตอบเป้าหมายนี้ หากต้องสรุปบริบทเก่า ให้แยกสิ่งที่ยืนยันแล้ว สิ่งที่ยังไม่ชัดเจน และแนวคิดที่ยกเลิก เพื่อไม่ให้แบบร่างเก่ากลายเป็นข้อสรุปใหม่
แบ่งตามหัวข้อพร้อมหมายเลขอ้างอิง
ใช้หัวข้อหรือย่อหน้าเป็นขอบเขตของแต่ละส่วน และใส่ชื่อเอกสาร เวอร์ชัน และหมายเลขย่อหน้า เช่น M03-P01 หากต้องแบ่งหลายคำขอ ให้ขอผลลัพธ์ในรูปเดียวกันทุกส่วน แล้วรวมตารางก่อนเขียนสรุปสุดท้าย การแบ่งแบบนี้ตรวจย้อนกลับได้ง่ายกว่าการตัดทุกจำนวนไบต์เท่า ๆ กัน
อย่าตัดข้อมูล UTF-8 กลางลำดับไบต์ และอย่าถือว่าการตัด Python string ที่ตำแหน่งใดก็ได้จะรักษาหน่วยอักษรที่มองเห็นได้ครบ การแบ่งตามโครงสร้างต้นฉบับช่วยลดปัญหา แต่ถ้าย่อหน้ายาวมากก็ยังต้องตรวจจุดตัดด้วยตาและความหมาย เก็บหมายเลขเดิมเมื่อแก้คำขอ เพื่อให้แหล่งอ้างอิงไม่เปลี่ยนไปทุกครั้ง
งาน: ดึงเฉพาะการตัดสินใจจากส่วนเอกสารนี้
รูปแบบ: การตัดสินใจ | ผู้รับผิดชอบ | กำหนดเวลา | หมายเลขย่อหน้า
ถ้าไม่ระบุ ให้เขียนว่า “ไม่ระบุ”
อย่าคาดเดาผู้รับผิดชอบหรือวันส่งงาน
ยังไม่ต้องเขียนสรุปรวมจนกว่าจะได้รับตารางครบทุกส่วน
เอกสาร: บันทึกประชุม M03 ฉบับ 2
ย่อหน้าและข้อความ:
กันพื้นที่ให้คำตอบและตรวจสิ่งที่ยังไม่ครบ
หากขอทั้งบทวิเคราะห์ โค้ด และตัวอย่างทดสอบในครั้งเดียว แต่กำหนดเอาต์พุตสั้นมาก ผลลัพธ์อาจไม่ครบ แบ่งสิ่งส่งมอบเป็นหน่วยที่ใช้งานได้ เช่น ตารางหนึ่งชุดหรือฟังก์ชันหนึ่งตัว พร้อมเกณฑ์ว่าครบเมื่อไร ไม่ควรเพิ่มเพดานอย่างเดียวโดยไม่พิจารณาค่าใช้จ่ายและข้อจำกัดของบัญชี
หากคำตอบขาดช่วง ให้แยกว่าชนเพดานหรือการเชื่อมต่อขัดข้อง การกดส่งอีกครั้งอาจเริ่มคำขอใหม่ แม้คำขอเดิมยังทำงานอยู่ ตรวจสถานะก่อน และระบุส่วนที่ต้องการต่อจากจุดที่ยืนยันแล้ว ปุ่มหยุดหรือการปิดหน้าต่างไม่ใช่หลักฐานว่าค่าใช้จ่ายเป็นศูนย์
ตรวจข้อจำกัดของเครื่องมือที่ใช้จริง
Dikaya แชตแบบชำระเงินรองรับไฟล์ข้อความและโค้ด UTF-8 รวมถึงภาพ PNG, JPEG และ WebP ที่ผ่านการตรวจ โดยมีข้อจำกัดรายไฟล์และรวม ไม่ใช่ระบบอ่านเอกสารทุกชนิดโดยอัตโนมัติ หากเอกสารต้นทางเป็นรูปแบบอื่น ให้แปลงด้วยเครื่องมือของคุณและตรวจความครบถ้วนก่อน ส่วนเดโมเป็นงานข้อความที่มีเงื่อนไขแยกต่างหาก
เริ่มด้วยเอกสารสั้นที่ตรวจคำตอบได้ทั้งหมด วัดขนาดจริง บันทึกข้อจำกัดที่เกี่ยวข้อง และดูข้อมูลการใช้งานที่ได้รับเมื่อคำขอเสร็จ อย่าอ้างว่าได้จำนวนโทเคนที่แน่นอนจากขนาดไฟล์เพียงอย่างเดียว เมื่อเข้าใจหน่วยและเก็บบริบทเป็นระเบียบแล้ว คุณจึงเพิ่มขอบเขตงานโดยยังมองเห็นว่าข้อมูลและงบประมาณถูกใช้ตรงไหน
คำถามและคำตอบ
นับตัวอักษรแล้วหารด้วยค่าคงที่เพื่อหาโทเคนภาษาไทยได้ไหม?
ใช้เป็นเพียงสมมติฐานคร่าว ๆ ได้ แต่ไม่ใช่จำนวนโทเคนที่แน่นอน การแบ่งโทเคนขึ้นกับข้อความและโมเดล ส่วน code point หน่วยอักษรที่มองเห็น และ UTF-8 ไบต์ก็ต่างกัน ควรระบุว่ากำลังประมาณอะไรและตรวจข้อมูลการใช้งานเมื่อมี
บริบทใหญ่หมายถึงอัปโหลดไฟล์ขนาดใหญ่ได้เสมอหรือไม่?
ไม่ใช่ หน้าต่างบริบท ขนาดคำขอ ขีดจำกัดไฟล์ เอาต์พุต และยอดคงเหลือเป็นข้อจำกัดคนละชั้น ตรวจเงื่อนไขของแชตหรือ API ที่ใช้จริง ไม่ใช้ตัวเลขบริบทของโมเดลมาแทนขนาดไฟล์ที่ระบบรับได้
ควรส่งประวัติทั้งหมดเพื่อให้ AI ไม่ลืมหรือไม่?
ไม่จำเป็น เลือกข้อเท็จจริง การตัดสินใจ และข้อความล่าสุดที่เกี่ยวข้องกับงาน พร้อมแหล่งอ้างอิง แยกแนวคิดที่ยกเลิกและสิ่งที่ยังไม่ยืนยัน การส่งข้อมูลมากขึ้นเพิ่มภาระโดยไม่รับประกันว่าจะแยกข้อมูลสำคัญได้ถูกต้อง
แหล่งข้อมูล
เนื้อหาจัดทำโดยมี AI ช่วย ตัวอย่างมีไว้ประกอบคำอธิบาย ไม่ใช่คำตอบจริงหรือผลทดสอบเปรียบเทียบ แหล่งข้อมูลภายนอกไม่แทนข้อกำหนดของบริการ
- Python: การเข้ารหัสและถอดรหัสข้อความ
docs.python.org - MDN: TextEncoder และ UTF-8
developer.mozilla.org
นำงานนี้ไปที่แชต
ย้ายเฉพาะฉบับร่างคำถาม จะไม่ส่งคำขอจนกว่าคุณจะกดส่ง การสร้างคำตอบใหม่ใช้เงื่อนไขของบัญชีคุณ
นำงานนี้ไปที่แชต เอกสาร