Sessions and memory

Compaction

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

วิธีการทำงาน

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

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_large
  • context length exceeded
  • input exceeds the maximum number of tokens
  • input token count exceeds the maximum number of input tokens (Bedrock)
  • input is too long for the model
  • ollama error: context length exceeded

Compaction ด้วยตนเอง

พิมพ์ /compact ในแชตใดก็ได้เพื่อบังคับทำ Compaction เพิ่มคำสั่งเพื่อกำหนดแนวทางให้บทสรุป:

text
/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:

json
{  "agents": {    "defaults": {      "compaction": {        "model": "openrouter/anthropic/claude-sonnet-4-6"      }    }  }}

นามแฝงเปล่าที่กำหนดค่าไว้จะถูกแปลงเป็นผู้ให้บริการและโมเดลมาตรฐานก่อนเริ่ม Compaction หากค่าเปล่าตรงกับทั้งนามแฝงและ ID โมเดลแบบตรงตัวที่กำหนดค่าไว้ ID โมเดลแบบตรงตัวจะมีลำดับความสำคัญกว่า ค่าเปล่าที่ไม่ตรงกับรายการใดจะยังคงเป็น ID โมเดลของผู้ให้บริการที่ใช้งานอยู่

วิธีนี้ใช้กับโมเดลภายในเครื่องได้เช่นกัน ตัวอย่างเช่น โมเดล Ollama ตัวที่สองซึ่งใช้สำหรับการสรุปโดยเฉพาะ:

json
{  "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 ใช้ความพยายามจนหมดแล้ว แต่การตอบกลับยังดำเนินต่อ:

json5
{  agents: {    defaults: {      compaction: {        notifyUser: true,      },    },  },}

การล้างข้อมูลหน่วยความจำ

ก่อนทำ Compaction OpenClaw สามารถเรียกใช้รอบ การล้างข้อมูลหน่วยความจำแบบเงียบ เพื่อจัดเก็บโน้ตถาวรลงในดิสก์ ตั้งค่า agents.defaults.compaction.memoryFlush.model เมื่อรอบการดูแลระบบนี้ควรใช้โมเดลภายในเครื่องแทนโมเดลของการสนทนาที่ใช้งานอยู่:

json
{  "agents": {    "defaults": {      "compaction": {        "memoryFlush": {          "model": "ollama/qwen3:8b"        }      }    }  }}

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

ผู้ให้บริการ Compaction แบบเสียบเปลี่ยนได้

Plugins สามารถลงทะเบียนผู้ให้บริการ Compaction แบบกำหนดเองผ่าน registerCompactionProvider() บน API ของ Plugin เมื่อมีการลงทะเบียนและกำหนดค่าผู้ให้บริการแล้ว OpenClaw จะมอบหมายการสรุปให้ผู้ให้บริการนั้นแทนไปป์ไลน์ LLM ในตัว

หากต้องการใช้ผู้ให้บริการที่ลงทะเบียนแล้ว ให้ตั้งค่า ID ของผู้ให้บริการในไฟล์การกำหนดค่า:

json
{  "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)
Was this useful?
On this page

On this page