กลยุทธ์การบีบอัดบริบท 5 ชั้น

กลยุทธ์การบีบอัดบริบท 5 ชั้น

ภาพรวม

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


ภาพรวมกลยุทธ์

กลยุทธ์การบีบอัดบริบท-CN

หมายเลข ชั้น ชื่อกลยุทธ์ เงื่อนไขการทริกเกอร์ วิธีการจัดการ
Layer 1 การตัดผลลัพธ์เครื่องมือเดี่ยว ผลลัพธ์เครื่องมือเดี่ยวเกิน 50% ของบริบท ตัดให้อยู่ในงบประมาณ ตัดที่ขอบเขตการขึ้นบรรทัดใหม่
Layer 1 การบีบอัดผลลัพธ์เครื่องมือเก่า อินพุตรวมเกิน 75% ของบริบท แทนที่ผลลัพธ์เครื่องมือในไวต์ลิสต์ด้วยตัวยึดตำแหน่ง
Layer 2 การตัดแต่งประวัติข้อความ LLM คืนค่าข้อผิดพลาดบริบทล้น เก็บข้อความสำคัญไว้ ตัดประวัติตรงกลางออก
Layer 3 การสรุปทั้งหมดด้วย LLM Layer 2 ไม่เพียงพอที่จะบรรเทา การสรุปแบบแบ่งบล็อก + การรวม รูปแบบมีโครงสร้าง 9 ส่วน
Layer 3 การลดระดับการสรุปบางส่วน การสรุปด้วย LLM ล้มเหลว ลองใหม่หลังจากยกเว้นข้อความขนาดใหญ่ ท้ายที่สุดลดระดับเป็นการแจ้งเตือนแบบข้อความล้วน

Layer 1: การตัดผลลัพธ์เครื่องมือเชิงป้องกัน

จังหวะการทริกเกอร์: ดำเนินการอัตโนมัติก่อนการเรียกใช้ LLM แต่ละครั้ง (เชิงป้องกัน ไม่รอให้เกิดบริบทล้น)

กลยุทธ์ ① — การตัดผลลัพธ์เครื่องมือเดี่ยว

เมื่อผลลัพธ์เครื่องมือเดี่ยวเกิน 50% ของหน้าต่างบริบท จะตัดให้อยู่ในงบประมาณ:

เอาต์พุตเครื่องมือดั้งเดิม (ยาวเกินไป) │ ├── เก็บอักขระ N ตัวแรกไว้ (ตัดที่ขอบเขตการขึ้นบรรทัดใหม่) └── เพิ่มเครื่องหมาย: [truncated: output exceeded context limit]
                      
                      เอาต์พุตเครื่องมือดั้งเดิม (ยาวเกินไป)
│
├── เก็บอักขระ N ตัวแรกไว้ (ตัดที่ขอบเขตการขึ้นบรรทัดใหม่)
└── เพิ่มเครื่องหมาย: [truncated: output exceeded context limit]

                    
บล็อกโค้ดนี้ในหน้าต่างลอย

ค่าคงที่สำคัญ:

  • SINGLE_TOOL_RESULT_CONTEXT_SHARE = 0.5 (สัดส่วนขีดจำกัดของเครื่องมือเดี่ยว)

กลยุทธ์ ② — การบีบอัดผลลัพธ์เครื่องมือเก่า

เมื่ออินพุตรวมเกิน 75% ของหน้าต่างบริบท จะเริ่มบีบอัดจากผลลัพธ์เครื่องมือที่เก่าที่สุด:

ประวัติการเรียกใช้เครื่องมือ (ลำดับตามเวลา) │ ├── ผลลัพธ์เครื่องมือล่าสุด → เก็บเนื้อหาทั้งหมดไว้ ├── ผลลัพธ์เครื่องมือที่ใหม่กว่า → เก็บเนื้อหาทั้งหมดไว้ ├── ผลลัพธ์เครื่องมือที่เก่ากว่า → [compacted: tool output removed to free context] └── ผลลัพธ์เครื่องมือเก่าสุด → [compacted: tool output removed to free context]
                      
                      ประวัติการเรียกใช้เครื่องมือ (ลำดับตามเวลา)
│
├── ผลลัพธ์เครื่องมือล่าสุด → เก็บเนื้อหาทั้งหมดไว้
├── ผลลัพธ์เครื่องมือที่ใหม่กว่า → เก็บเนื้อหาทั้งหมดไว้
├── ผลลัพธ์เครื่องมือที่เก่ากว่า → [compacted: tool output removed to free context]
└── ผลลัพธ์เครื่องมือเก่าสุด → [compacted: tool output removed to free context]

                    
บล็อกโค้ดนี้ในหน้าต่างลอย

กลไกไวต์ลิสต์: ดำเนินการบีบอัดเฉพาะเครื่องมือที่มีเอาต์พุตสูงต่อไปนี้เท่านั้น:

  • Read File, Bash, Grep, Glob, Search Files, Web Fetch, Edit

เอาต์พุตของเครื่องมือประเภท Write/Create จะเก็บไว้เสมอ เนื่องจากเอาต์พุตของมันเป็นพื้นฐานสำหรับการดำเนินการต่อไป

ค่าคงที่สำคัญ:

  • CONTEXT_INPUT_HEADROOM_RATIO = 0.75 (สัดส่วนขีดจำกัดของอินพุตรวม)

Layer 2: การตรวจจับบริบทล้นและการตัดแต่งประวัติข้อความ

จังหวะการทริกเกอร์: ทริกเกอร์แบบพาสซีฟเมื่อ LLM คืนค่าข้อผิดพลาดบริบทล้น

กลยุทธ์ ③ — การตัดแต่งประวัติข้อความ

ตัดข้อความประวัติตรงกลางออก เก็บข้อความสำคัญไว้:

ประวัติข้อความ │ ├── System Prompt ← เก็บไว้เสมอ ├── ข้อความแรกของผู้ใช้ ← เก็บไว้เสมอ ├── ข้อความที่ _pin: true ← เก็บไว้เสมอ ├── ........ ประวัติตรงกลาง ........ ← ตัดออก (แทนที่ด้วยการแจ้งเตือน) ├── [context compacted: X earlier messages removed] ├── ข้อความ N ข้อความล่าสุด ← เก็บไว้ (N = min(6, ⌊จำนวนทั้งหมด/3⌋)) └── ข้อความปัจจุบัน ← เก็บไว้
                      
                      ประวัติข้อความ
│
├── System Prompt                    ← เก็บไว้เสมอ
├── ข้อความแรกของผู้ใช้                ← เก็บไว้เสมอ
├── ข้อความที่ _pin: true             ← เก็บไว้เสมอ
├── ........ ประวัติตรงกลาง ........   ← ตัดออก (แทนที่ด้วยการแจ้งเตือน)
├── [context compacted: X earlier messages removed]
├── ข้อความ N ข้อความล่าสุด           ← เก็บไว้ (N = min(6, ⌊จำนวนทั้งหมด/3⌋))
└── ข้อความปัจจุบัน                    ← เก็บไว้

                    
บล็อกโค้ดนี้ในหน้าต่างลอย

หลังการตัดแต่งจะซ่อมแซมคู่เครื่องมือที่โดดเดี่ยวโดยอัตโนมัติ (tool_use ที่ไม่มี tool_result ที่สอดคล้อง หรือในทางกลับกัน) เพื่อให้แน่ใจว่ารูปแบบข้อความถูกต้อง


Layer 3: การสรุปอัจฉริยะด้วย LLM

จังหวะการทริกเกอร์: ทริกเกอร์เมื่อการตัดแต่ง Layer 2 แล้วยังไม่เพียงพอที่จะบรรเทาแรงกดดันของบริบท

กลยุทธ์ ④ — การสรุปทั้งหมด

ใช้การเรียกใช้ LLM แยกต่างหากเพื่อสรุปข้อความประวัติแบบมีโครงสร้าง:

รูปแบบการสรุป 9 ส่วน:

  1. เจตนาและเป้าหมายของผู้ใช้
  2. แนวคิดและคำศัพท์สำคัญ
  3. ไฟล์และพาธที่เกี่ยวข้อง
  4. ข้อผิดพลาดที่พบและแนวทางแก้ไข
  5. แนวคิดในการแก้ปัญหา
  6. ข้อความสำคัญของผู้ใช้
  7. งานที่รอดำเนินการให้เสร็จ
  8. ความคืบหน้าของงานปัจจุบัน
  9. แผนขั้นตอนถัดไป

กลยุทธ์การแบ่งบล็อก: เมื่อข้อความเกิน 50,000 อักขระ จะแบ่งเป็นบล็อกสูงสุด 4 บล็อกเพื่อสรุปแยกกัน จากนั้นรวมเป็นการสรุปสุดท้าย

กลยุทธ์ ⑤ — การลดระดับการสรุปบางส่วน

เมื่อการสรุปทั้งหมดล้มเหลว จะดำเนินการลดระดับ 3 ระดับ:

ระดับการลดระดับ วิธีการจัดการ
Level 1 ยกเว้นข้อความขนาดใหญ่ (>50,000 อักขระ) แล้วลองสรุปข้อความที่เหลืออีกครั้ง
Level 2 เพิ่มหมายเหตุ [Note: X oversized message(s) were excluded]
Level 3 คืนค่าการแจ้งเตือนแบบข้อความล้วน [Summary unavailable — X messages could not be summarized]

สรุปค่าคงที่สำคัญ

ค่าคงที่ ค่า คำอธิบาย
CONTEXT_INPUT_HEADROOM_RATIO 0.75 สัดส่วนขีดจำกัดอินพุตรวมของ Layer 1
SINGLE_TOOL_RESULT_CONTEXT_SHARE 0.5 สัดส่วนขีดจำกัดเครื่องมือเดี่ยวของ Layer 1
MAX_OVERFLOW_COMPACTION_ATTEMPTS 5 จำนวนครั้งสูงสุดในการลองบีบอัดใหม่
COMPACT_MAX_OUTPUT_TOKENS 20,000 ขีดจำกัดเอาต์พุตของการเรียกใช้ LLM เพื่อสรุป
COMPACT_BUFFER_TOKENS 13,000 บัฟเฟอร์ของเกณฑ์การบีบอัด
CHARS_PER_TOKEN 4 จำนวนอักขระต่อ token ของข้อความทั่วไป
TOOL_RESULT_CHARS_PER_TOKEN 2 จำนวนอักขระต่อ token ของผลลัพธ์เครื่องมือ (หนาแน่นกว่า)

การปรับเทียบ EMA Token

ระบบใช้ค่าเฉลี่ยเคลื่อนที่แบบเอกซ์โพเนนเชียลเพื่อปรับเทียบการประมาณ chars-per-token แบบไดนามิก:

ขั้นตอน วิธีการปรับเทียบ
เริ่มต้น 3.0 chars/token (อนุรักษ์นิยม รองรับภาษาจีน+โค้ด)
การเรียกใช้ LLM 3 ครั้งแรก ลู่เข้าสู่ค่าเฉลี่ย
หลังจากนั้น EMA α=0.15 ติดตามแบบเรียบ
การกรองค่าผิดปกติ ละเว้นค่าที่อยู่นอกช่วง 0.5 < observed < 8

แผนผังกระบวนการบีบอัด

ก่อนการเรียกใช้ LLM แต่ละครั้ง │ ├── Layer 1: enforceToolResultBudget() │ ├── ตัดผลลัพธ์เครื่องมือเดี่ยว (>50% ของบริบท) │ └── บีบอัดผลลัพธ์เครื่องมือเก่า (อินพุตรวม >75% ของบริบท) │ ├── shouldPreemptiveCompact() ? │ └── ใช่ → compact() (การตัดแต่ง Layer 2) │ └── การเรียกใช้ LLM │ ├── สำเร็จ → ดำเนินการต่อ └── ข้อผิดพลาดบริบทล้น → getRetryStrategy() │ ├── compact() (Layer 2) │ │ │ └── ยังไม่เพียงพอ → compactWithSummary() (Layer 3) │ ├── summarizeMessagesFull() (กลยุทธ์ ④) │ ├── ล้มเหลว → summarizeMessagesPartial() (กลยุทธ์ ⑤ Level 1-2) │ └── ล้มเหลวทั้งหมด → bare notice (กลยุทธ์ ⑤ Level 3) │ └── ลองเรียกใช้ LLM อีกครั้ง (สูงสุด 5 ครั้ง)
                      
                      ก่อนการเรียกใช้ LLM แต่ละครั้ง
    │
    ├── Layer 1: enforceToolResultBudget()
    │   ├── ตัดผลลัพธ์เครื่องมือเดี่ยว (>50% ของบริบท)
    │   └── บีบอัดผลลัพธ์เครื่องมือเก่า (อินพุตรวม >75% ของบริบท)
    │
    ├── shouldPreemptiveCompact() ?
    │   └── ใช่ → compact() (การตัดแต่ง Layer 2)
    │
    └── การเรียกใช้ LLM
        │
        ├── สำเร็จ → ดำเนินการต่อ
        └── ข้อผิดพลาดบริบทล้น → getRetryStrategy()
            │
            ├── compact() (Layer 2)
            │   │
            │   └── ยังไม่เพียงพอ → compactWithSummary() (Layer 3)
            │       ├── summarizeMessagesFull() (กลยุทธ์ ④)
            │       ├── ล้มเหลว → summarizeMessagesPartial() (กลยุทธ์ ⑤ Level 1-2)
            │       └── ล้มเหลวทั้งหมด → bare notice (กลยุทธ์ ⑤ Level 3)
            │
            └── ลองเรียกใช้ LLM อีกครั้ง (สูงสุด 5 ครั้ง)

                    
บล็อกโค้ดนี้ในหน้าต่างลอย


มีความหมายอย่างไรต่อผู้ใช้

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

ปรากฏการณ์ที่คุณอาจสังเกตเห็น:

  • ในการสนทนาที่ยาวนาน Agent จู่ ๆ "จำไม่ได้" ถึงความต้องการที่คุณกล่าวถึงในตอนต้น → นี่คือ Layer 2/3 ได้บีบอัดข้อความช่วงต้นแล้ว
  • Agent พูดว่า "จากการอภิปรายก่อนหน้านี้..." แต่รายละเอียดอาจไม่ถูกต้องทั้งหมด → หลังการบีบอัดจะเก็บไว้เพียงบทสรุปเท่านั้น
  • ผลลัพธ์ประวัติของการเรียกใช้เครื่องมือกลายเป็น [compacted] → นี่คือ Layer 1 ได้บีบอัดเอาต์พุตเครื่องมือเก่าแล้ว

คุณสามารถรับมือได้ดังนี้:

  • บอกข้อมูลสำคัญว่า "โปรดจำไว้": จะทริกเกอร์ให้ระบบความจำจัดเก็บ ไม่ได้รับผลกระทบจากการบีบอัดบริบท
  • กล่าวความต้องการสำคัญซ้ำ: ในการสนทนาที่ยาวนาน ให้กล่าวความต้องการหลักของคุณซ้ำเป็นระยะ
  • เลือกโมเดลที่มีบริบทขนาดใหญ่: GPT-4.1 (1M) หรือ Claude (200K) สามารถรักษาบริบทได้มากกว่า DeepSeek (64K)
  • เริ่มการสนทนาใหม่: หากการสนทนายาวและวุ่นวายมากแล้ว การเริ่มการสนทนาใหม่อาจมีประสิทธิภาพมากกว่าการดำเนินต่อ

เอกสารที่เกี่ยวข้อง