Sessions and memory
Compaction
ทุกโมเดลมีหน้าต่างบริบท ซึ่งคือจำนวนโทเค็นสูงสุดที่โมเดลสามารถประมวลผลได้ เมื่อการสนทนาใกล้ถึงขีดจำกัดนั้น OpenClaw จะ ย่อ ข้อความเก่าเป็นบทสรุปเพื่อให้สนทนาต่อได้
วิธีการทำงาน
- รอบการสนทนาเก่าจะถูกสรุปเป็นรายการแบบย่อ
- บทสรุปจะถูกบันทึกไว้ในทรานสคริปต์ของเซสชัน
- ข้อความล่าสุดจะถูกเก็บไว้อย่างครบถ้วน
OpenClaw จะเก็บการเรียกใช้เครื่องมือของผู้ช่วยไว้คู่กับรายการ toolResult ที่ตรงกันเมื่อเลือกจุดแบ่งสำหรับ Compaction หากจุดดังกล่าวอยู่ภายในบล็อกเครื่องมือ OpenClaw จะเลื่อนขอบเขตเพื่อให้คู่นั้นยังอยู่ด้วยกันและคงส่วนท้ายปัจจุบันที่ยังไม่ได้สรุปไว้
ประวัติการสนทนาทั้งหมดยังคงอยู่บนดิสก์ Compaction เปลี่ยนเฉพาะสิ่งที่โมเดลเห็นในรอบถัดไป
Compaction อัตโนมัติ
Compaction อัตโนมัติเปิดใช้งานโดยค่าเริ่มต้น โดยจะทำงานเมื่อเซสชันใกล้ถึงขีดจำกัดบริบท หรือเมื่อโมเดลส่งคืนข้อผิดพลาดบริบทล้น (ในกรณีนี้ OpenClaw จะทำ Compaction แล้วลองอีกครั้ง)
คุณจะเห็น:
embedded run auto-compaction start/completeในบันทึก Gateway ปกติ🧹 Auto-compaction completeในโหมดแสดงรายละเอียด/statusที่แสดง🧹 Compactions: <count>
รูปแบบข้อผิดพลาดบริบทล้นที่ OpenClaw รู้จัก
OpenClaw ตรวจจับสตริงข้อผิดพลาดบริบทล้นเฉพาะผู้ให้บริการหลายสิบรูปแบบ (Anthropic, OpenAI, Bedrock, Gemini, Ollama, OpenRouter และอื่นๆ) ตัวอย่างทั่วไป:
request_too_largecontext length exceededinput exceeds the maximum number of tokensinput token count exceeds the maximum number of input tokens(Bedrock)input is too long for the modelollama error: context length exceeded
Compaction ด้วยตนเอง
พิมพ์ /compact ในแชตใดก็ได้เพื่อบังคับทำ Compaction เพิ่มคำสั่งเพื่อกำหนดแนวทางให้บทสรุป:
/compact เน้นการตัดสินใจด้านการออกแบบ APIเมื่อตั้งค่า agents.defaults.compaction.keepRecentTokens (ค่าเริ่มต้น: 20,000) การทำ Compaction ด้วยตนเองจะใช้จุดตัดดังกล่าวและเก็บส่วนท้ายล่าสุดไว้ในบริบทที่สร้างใหม่ หากไม่มีงบประมาณการเก็บรักษาที่ระบุอย่างชัดเจน การทำ Compaction ด้วยตนเองจะทำงานเสมือนจุดตรวจแบบตายตัวและดำเนินต่อโดยใช้เฉพาะบทสรุปใหม่
การกำหนดค่า
กำหนดค่า Compaction ภายใต้ agents.defaults.compaction ใน openclaw.json ของคุณ ตัวเลือกที่ใช้บ่อยที่สุดแสดงไว้ด้านล่าง สำหรับข้อมูลอ้างอิงฉบับเต็ม โปรดดู เจาะลึกการจัดการเซสชัน
การใช้โมเดลอื่น
โดยค่าเริ่มต้น Compaction จะใช้โมเดลหลักของเอเจนต์ ตั้งค่า agents.defaults.compaction.model เพื่อมอบหมายการสรุปให้โมเดลที่มีความสามารถสูงกว่าหรือเชี่ยวชาญเฉพาะทาง ค่าที่กำหนดทับรับสตริง provider/model-id หรือนามแฝงเปล่าที่กำหนดค่าไว้ภายใต้ agents.defaults.models:
{ "agents": { "defaults": { "compaction": { "model": "openrouter/anthropic/claude-sonnet-4-6" } } }}นามแฝงเปล่าที่กำหนดค่าไว้จะถูกแปลงเป็นผู้ให้บริการและโมเดลมาตรฐานก่อนเริ่ม Compaction หากค่าเปล่าตรงกับทั้งนามแฝงและ ID โมเดลแบบตรงตัวที่กำหนดค่าไว้ ID โมเดลแบบตรงตัวจะมีลำดับความสำคัญกว่า ค่าเปล่าที่ไม่ตรงกับรายการใดจะยังคงเป็น ID โมเดลของผู้ให้บริการที่ใช้งานอยู่
วิธีนี้ใช้กับโมเดลภายในเครื่องได้เช่นกัน ตัวอย่างเช่น โมเดล Ollama ตัวที่สองซึ่งใช้สำหรับการสรุปโดยเฉพาะ:
{ "agents": { "defaults": { "compaction": { "model": "ollama/llama3.1:8b" } } }}เมื่อไม่ได้ตั้งค่า Compaction จะเริ่มด้วยโมเดลของเซสชันที่ใช้งานอยู่ หากการสรุปล้มเหลวด้วยข้อผิดพลาดจากผู้ให้บริการที่มีสิทธิ์ใช้โมเดลสำรอง OpenClaw จะลองทำ Compaction ครั้งนั้นอีกครั้งผ่านลำดับโมเดลสำรองที่มีอยู่ของเซสชัน การเลือกโมเดลสำรองเป็นเพียงชั่วคราวและจะไม่ถูกเขียนกลับไปยังสถานะเซสชัน ค่ากำหนดทับ agents.defaults.compaction.model ที่ระบุอย่างชัดเจนจะยังคงใช้ค่าตรงตัวและไม่สืบทอดลำดับโมเดลสำรองของเซสชัน
การรักษาตัวระบุ
โดยค่าเริ่มต้น การสรุปสำหรับ Compaction จะรักษาตัวระบุแบบทึบแสงไว้ (identifierPolicy: "strict") กำหนดทับด้วย identifierPolicy: "off" เพื่อปิดใช้งาน หรือใช้ identifierPolicy: "custom" ร่วมกับ identifierInstructions เพื่อระบุแนวทางแบบกำหนดเอง
ตัวป้องกันขนาดไบต์ของทรานสคริปต์ที่ใช้งานอยู่
เมื่อตั้งค่า agents.defaults.compaction.maxActiveTranscriptBytes OpenClaw
จะเรียกใช้ Compaction ภายในเครื่องตามปกติก่อนเริ่มการทำงาน หากประวัติทรานสคริปต์มีขนาดถึง
ค่าดังกล่าว วิธีนี้มีประโยชน์สำหรับเซสชันที่ทำงานเป็นเวลานาน ซึ่งการจัดการบริบท
ฝั่งผู้ให้บริการอาจช่วยให้บริบทของโมเดลยังอยู่ในสภาพดี ขณะที่ประวัติทรานสคริปต์ที่จัดเก็บถาวร
เพิ่มขึ้นอย่างต่อเนื่อง ระบบจะไม่แบ่งข้อมูลตามไบต์ดิบ แต่จะขอให้ไปป์ไลน์ Compaction
ตามปกติสร้างบทสรุปเชิงความหมาย
ทรานสคริปต์สืบทอด
เมื่อเปิดใช้งาน agents.defaults.compaction.truncateAfterCompaction OpenClaw จะไม่เขียนทรานสคริปต์เดิมทับในตำแหน่งเดิม แต่จะสร้างทรานสคริปต์สืบทอดที่ใช้งานอยู่ใหม่จากบทสรุป Compaction สถานะที่เก็บรักษาไว้ และส่วนท้ายที่ยังไม่ได้สรุป จากนั้นบันทึกข้อมูลเมตาของจุดตรวจซึ่งชี้โฟลว์การแตกแขนง/กู้คืนไปยังทรานสคริปต์สืบทอดที่ผ่าน Compaction นั้น
ทรานสคริปต์สืบทอดยังจะตัดรอบข้อความยาวจากผู้ใช้ที่ซ้ำกันทุกประการ ซึ่งมาถึง
ภายในช่วงเวลาสั้นๆ ของการลองอีกครั้ง เพื่อไม่ให้พายุการลองอีกครั้งของช่องทางถูกนำไปยัง
ทรานสคริปต์ที่ใช้งานอยู่ถัดไปหลังทำ Compaction
OpenClaw จะไม่เขียนสำเนา .checkpoint.*.jsonl แยกต่างหากสำหรับ
Compaction ใหม่อีกต่อไป ไฟล์จุดตรวจแบบเดิมที่มีอยู่ยังสามารถใช้ได้ตราบใดที่ยังมีการอ้างอิง
และจะถูกลบโดยกระบวนการล้างเซสชันตามปกติ
การแจ้งเตือน Compaction
โดยค่าเริ่มต้น Compaction จะทำงานโดยไม่แสดงข้อความ ตั้งค่า notifyUser เพื่อแสดงข้อความสถานะสั้นๆ เมื่อ Compaction เริ่มต้นและเสร็จสิ้น และแสดงการแจ้งเตือนสถานะเสื่อมลงเมื่อการล้างข้อมูลหน่วยความจำก่อนทำ Compaction ใช้ความพยายามจนหมดแล้ว แต่การตอบกลับยังดำเนินต่อ:
{ agents: { defaults: { compaction: { notifyUser: true, }, }, },}การล้างข้อมูลหน่วยความจำ
ก่อนทำ Compaction OpenClaw สามารถเรียกใช้รอบ การล้างข้อมูลหน่วยความจำแบบเงียบ เพื่อจัดเก็บโน้ตถาวรลงในดิสก์ ตั้งค่า agents.defaults.compaction.memoryFlush.model เมื่อรอบการดูแลระบบนี้ควรใช้โมเดลภายในเครื่องแทนโมเดลของการสนทนาที่ใช้งานอยู่:
{ "agents": { "defaults": { "compaction": { "memoryFlush": { "model": "ollama/qwen3:8b" } } } }}ค่ากำหนดทับโมเดลสำหรับการล้างข้อมูลหน่วยความจำเป็นค่าตรงตัวและไม่สืบทอดลำดับโมเดลสำรองของเซสชันที่ใช้งานอยู่ ดูรายละเอียดและการกำหนดค่าได้ที่ หน่วยความจำ
ผู้ให้บริการ Compaction แบบเสียบเปลี่ยนได้
Plugins สามารถลงทะเบียนผู้ให้บริการ Compaction แบบกำหนดเองผ่าน registerCompactionProvider() บน API ของ Plugin เมื่อมีการลงทะเบียนและกำหนดค่าผู้ให้บริการแล้ว OpenClaw จะมอบหมายการสรุปให้ผู้ให้บริการนั้นแทนไปป์ไลน์ LLM ในตัว
หากต้องการใช้ผู้ให้บริการที่ลงทะเบียนแล้ว ให้ตั้งค่า ID ของผู้ให้บริการในไฟล์การกำหนดค่า:
{ "agents": { "defaults": { "compaction": { "provider": "my-provider" } } }}การตั้งค่า provider จะบังคับใช้ mode: "safeguard" โดยอัตโนมัติ ผู้ให้บริการจะได้รับคำสั่งสำหรับ Compaction และนโยบายการรักษาตัวระบุแบบเดียวกับเส้นทางในตัว และ OpenClaw ยังคงรักษาบริบทส่วนต่อท้ายของรอบล่าสุดและรอบที่ถูกแบ่งไว้หลังจากได้รับเอาต์พุตจากผู้ให้บริการ
Compaction เทียบกับการตัดทอน
| Compaction | การตัดทอน | |
|---|---|---|
| ทำอะไร | สรุปการสนทนาเก่า | ตัดผลลัพธ์เครื่องมือเก่า |
| บันทึกหรือไม่ | ใช่ (ในทรานสคริปต์ของเซสชัน) | ไม่ (อยู่ในหน่วยความจำเท่านั้น ต่อคำขอ) |
| ขอบเขต | การสนทนาทั้งหมด | เฉพาะผลลัพธ์เครื่องมือ |
การตัดทอนเซสชัน เป็นส่วนเสริมที่เบากว่า ซึ่งตัดเอาต์พุตของเครื่องมือโดยไม่สรุป
การแก้ไขปัญหา
ทำ Compaction บ่อยเกินไปหรือไม่ หน้าต่างบริบทของโมเดลอาจมีขนาดเล็ก หรือเอาต์พุตของเครื่องมืออาจมีขนาดใหญ่ ลองเปิดใช้งาน การตัดทอนเซสชัน
บริบทรู้สึกล้าสมัยหลังทำ Compaction หรือไม่ ใช้ /compact Focus on <topic> เพื่อกำหนดแนวทางให้บทสรุป หรือเปิดใช้งาน การล้างข้อมูลหน่วยความจำ เพื่อให้โน้ตยังคงอยู่
ต้องการเริ่มใหม่ทั้งหมดหรือไม่ /new จะเริ่มเซสชันใหม่โดยไม่ทำ Compaction
สำหรับการกำหนดค่าขั้นสูง (โทเค็นสำรอง การรักษาตัวระบุ เอนจินบริบทแบบกำหนดเอง และ Compaction ฝั่งเซิร์ฟเวอร์ OpenAI) โปรดดู เจาะลึกการจัดการเซสชัน
เนื้อหาที่เกี่ยวข้อง
- เซสชัน: การจัดการและวงจรชีวิตของเซสชัน
- การตัดทอนเซสชัน: การตัดผลลัพธ์เครื่องมือ
- บริบท: วิธีสร้างบริบทสำหรับรอบการทำงานของเอเจนต์
- Hooks: Hooks ของวงจรชีวิต Compaction (
before_compaction,after_compaction)