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

| หมายเลข | ชั้น | ชื่อกลยุทธ์ | เงื่อนไขการทริกเกอร์ | วิธีการจัดการ |
|---|---|---|---|---|
| ① | 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]
ค่าคงที่สำคัญ:
SINGLE_TOOL_RESULT_CONTEXT_SHARE = 0.5(สัดส่วนขีดจำกัดของเครื่องมือเดี่ยว)
กลยุทธ์ ② — การบีบอัดผลลัพธ์เครื่องมือเก่า
เมื่ออินพุตรวมเกิน 75% ของหน้าต่างบริบท จะเริ่มบีบอัดจากผลลัพธ์เครื่องมือที่เก่าที่สุด:
ประวัติการเรียกใช้เครื่องมือ (ลำดับตามเวลา)
│
├── ผลลัพธ์เครื่องมือล่าสุด → เก็บเนื้อหาทั้งหมดไว้
├── ผลลัพธ์เครื่องมือที่ใหม่กว่า → เก็บเนื้อหาทั้งหมดไว้
├── ผลลัพธ์เครื่องมือที่เก่ากว่า → [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⌋))
└── ข้อความปัจจุบัน ← เก็บไว้
หลังการตัดแต่งจะซ่อมแซมคู่เครื่องมือที่โดดเดี่ยวโดยอัตโนมัติ (tool_use ที่ไม่มี tool_result ที่สอดคล้อง หรือในทางกลับกัน) เพื่อให้แน่ใจว่ารูปแบบข้อความถูกต้อง
Layer 3: การสรุปอัจฉริยะด้วย LLM
จังหวะการทริกเกอร์: ทริกเกอร์เมื่อการตัดแต่ง Layer 2 แล้วยังไม่เพียงพอที่จะบรรเทาแรงกดดันของบริบท
กลยุทธ์ ④ — การสรุปทั้งหมด
ใช้การเรียกใช้ LLM แยกต่างหากเพื่อสรุปข้อความประวัติแบบมีโครงสร้าง:
รูปแบบการสรุป 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 ครั้ง)
มีความหมายอย่างไรต่อผู้ใช้
การบีบอัดบริบทคือสาเหตุของปรากฏการณ์ "Agent ลืมเนื้อหาก่อนหน้า" ที่คุณอาจรู้สึกได้ในการสนทนาที่ยาวนาน มันไม่ใช่ bug แต่เป็นกลไกที่ระบบใช้จัดการข้อมูลอย่างชาญฉลาดภายในหน้าต่างบริบทที่จำกัด
ปรากฏการณ์ที่คุณอาจสังเกตเห็น:
- ในการสนทนาที่ยาวนาน Agent จู่ ๆ "จำไม่ได้" ถึงความต้องการที่คุณกล่าวถึงในตอนต้น → นี่คือ Layer 2/3 ได้บีบอัดข้อความช่วงต้นแล้ว
- Agent พูดว่า "จากการอภิปรายก่อนหน้านี้..." แต่รายละเอียดอาจไม่ถูกต้องทั้งหมด → หลังการบีบอัดจะเก็บไว้เพียงบทสรุปเท่านั้น
- ผลลัพธ์ประวัติของการเรียกใช้เครื่องมือกลายเป็น
[compacted]→ นี่คือ Layer 1 ได้บีบอัดเอาต์พุตเครื่องมือเก่าแล้ว
คุณสามารถรับมือได้ดังนี้:
- บอกข้อมูลสำคัญว่า "โปรดจำไว้": จะทริกเกอร์ให้ระบบความจำจัดเก็บ ไม่ได้รับผลกระทบจากการบีบอัดบริบท
- กล่าวความต้องการสำคัญซ้ำ: ในการสนทนาที่ยาวนาน ให้กล่าวความต้องการหลักของคุณซ้ำเป็นระยะ
- เลือกโมเดลที่มีบริบทขนาดใหญ่: GPT-4.1 (1M) หรือ Claude (200K) สามารถรักษาบริบทได้มากกว่า DeepSeek (64K)
- เริ่มการสนทนาใหม่: หากการสนทนายาวและวุ่นวายมากแล้ว การเริ่มการสนทนาใหม่อาจมีประสิทธิภาพมากกว่าการดำเนินต่อ
เอกสารที่เกี่ยวข้อง
- เอนจินลูป Agent — ตำแหน่งของการจัดการบริบทในลูป
- การกำหนดค่าโมเดล — ขนาดหน้าต่างบริบทของแต่ละโมเดล
- รายการโมเดลที่รองรับ — เมทริกซ์ความสามารถของโมเดล
