ข้ามไปยังเนื้อหา

ประวัติการสนทนา

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

สิ่งเหล่านี้ไม่ใช่ตัวเลือกที่แทนกันได้เสียทีเดียว หากเป็นบันไดที่เรียงจากวิธีที่ถูกที่สุดก่อน

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

การตัดทอนและการทิ้งภาพทำงานก่อน เพราะไม่มีต้นทุนและไม่สูญเสียในแบบที่สำคัญ นั่นคือมันตัดทิ้งปริมาณมากที่ไม่มีใครตั้งใจจะกลับมาอ่านซ้ำ

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

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

การย่อแบบสแนปช็อตเรนเดอร์ประวัติที่ถูกทิ้งลงบนหน้าหนาแน่นด้วยอักขระพิกเซล แล้วส่งกลับคืนมาเป็นรูปภาพ

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

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

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

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

ในอดีต ทุกครั้งที่ฮาร์เนสรันจะเริ่มจากประวัติว่างเปล่า และสร้างความต่อเนื่องขึ้นใหม่จากบล็อก <context> ในพรอมต์ — ซึ่งเป็น บทสรุป ของบทสนทนา ไม่ใช่ตัวบทสนทนาเอง สามสิ่งตามมาจากการออกแบบนั้น

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

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

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

ทุกข้อความบันทึกว่ามันต่อจากข้อความใด และทุกบทสนทนาระบุ ปลายสาขา ปัจจุบันของตัวเอง การตัดสินใจเพียงข้อเดียวนี้คือคุณสมบัติทั้งหมด

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

ถ้าไม่มีมัน การย้อนกลับทุกรูปแบบต้องซ่อนหรือลบข้อความ และการซ่อนคือคำโกหกที่ผู้อ่านคนถัดไปมองไม่ออก

สาขา การแยก
สิ่งที่เกิดขึ้น ตัวชี้เลื่อน เส้นทางถูกคัดลอก
ไปที่ไหน บทสนทนาเดิม บทสนทนาใหม่
ต้นทุน ไม่มี สำเนาสาขาหนึ่งชุด

การแยกคัดลอกด้วย id ใหม่ แทนที่จะใช้แถวร่วมกัน บทสนทนาสองอันที่ใช้แถวร่วมกันจะเห็นข้อความถัด ๆ ไปของกันและกัน ซึ่งเป็นสิ่งเดียวที่การแยกต้องไม่ทำ

คู่ checkpoint / rewind ระหว่างการรันทำเครื่องหมายขอบเขตเทิร์นที่สะอาดไว้ แล้วกลับมาที่จุดนั้นหลังการสำรวจ โดยเก็บไดเจสต์ไว้ เพราะ checkpoint ถูกเก็บลงดิสก์เคียงข้างทรานสคริปต์ ป้ายที่โมเดลตั้งไว้ก่อนรีสตาร์ตจึงยังลงตรงจุดที่ตั้งไว้จริง checkpoint ที่เป้าหมายไม่รอดจากการตัดจะถูก ทิ้ง ไม่ใช่ถูกปรับเข้าหาจุดใกล้เคียง — การย้อนกลับ “ไปที่ป้าย” แล้วไปลงที่อื่นคือความล้มเหลวแบบเดียวกับที่การมีป้ายอยู่มีไว้เพื่อป้องกัน