---
read_when:
    - คุณต้องการทำความเข้าใจ Compaction อัตโนมัติและ /compact
    - คุณกำลังดีบักเซสชันที่ใช้เวลานานซึ่งมีขนาดถึงขีดจำกัดของบริบท
summary: วิธีที่ OpenClaw สรุปบทสนทนาที่ยาวเพื่อให้อยู่ภายในขีดจำกัดของโมเดล
title: Compaction
x-i18n:
    generated_at: "2026-07-16T19:08:31Z"
    model: gpt-5.6
    postprocess_version: locale-links-v1
    prompt_version: 32
    provider: openai
    source_hash: f00fb0cf59184ef450f1fc4d39a21a40ee4e8327d872766bca7f3642c0145514
    source_path: concepts/compaction.md
    workflow: 16
---

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

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

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

OpenClaw จะเก็บการเรียกใช้เครื่องมือของผู้ช่วยไว้คู่กับรายการ `toolResult` ที่ตรงกันเมื่อเลือกจุดแบ่งสำหรับ Compaction หากจุดดังกล่าวอยู่ภายในบล็อกเครื่องมือ OpenClaw จะเลื่อนขอบเขตเพื่อให้คู่นั้นยังอยู่ด้วยกันและคงส่วนท้ายปัจจุบันที่ยังไม่ได้สรุปไว้

ประวัติการสนทนาทั้งหมดยังคงอยู่บนดิสก์ Compaction เปลี่ยนเฉพาะสิ่งที่โมเดลเห็นในรอบถัดไป

<Note>
การกำหนดค่าใหม่จะใช้ค่าเริ่มต้นของ `agents.defaults.compaction.mode` เป็น `"safeguard"` (มาตรการป้องกันที่เข้มงวดยิ่งขึ้นและการตรวจสอบคุณภาพบทสรุป) ตั้งค่า `mode: "default"` อย่างชัดเจนเพื่อปฏิเสธการใช้งาน
</Note>

## Compaction อัตโนมัติ

Compaction อัตโนมัติเปิดใช้งานโดยค่าเริ่มต้น โดยจะทำงานเมื่อเซสชันใกล้ถึงขีดจำกัดบริบท หรือเมื่อโมเดลส่งคืนข้อผิดพลาดบริบทล้น (ในกรณีนี้ OpenClaw จะทำ Compaction แล้วลองอีกครั้ง)

คุณจะเห็น:

- `embedded run auto-compaction start` / `complete` ในบันทึก Gateway ปกติ
- `🧹 Auto-compaction complete` ในโหมดแสดงรายละเอียด
- `/status` ที่แสดง `🧹 Compactions: <count>`

<Info>
ก่อนทำ Compaction OpenClaw จะเตือนเอเจนต์โดยอัตโนมัติให้บันทึกโน้ตสำคัญลงในไฟล์ [หน่วยความจำ](/th/concepts/memory) ซึ่งช่วยป้องกันการสูญเสียบริบท
</Info>

<AccordionGroup>
  <Accordion title="รูปแบบข้อผิดพลาดบริบทล้นที่ 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`

  </Accordion>
</AccordionGroup>

## Compaction ด้วยตนเอง

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

```text
/compact เน้นการตัดสินใจด้านการออกแบบ API
```

เมื่อตั้งค่า `agents.defaults.compaction.keepRecentTokens` (ค่าเริ่มต้น: 20,000) การทำ Compaction ด้วยตนเองจะใช้จุดตัดดังกล่าวและเก็บส่วนท้ายล่าสุดไว้ในบริบทที่สร้างใหม่ หากไม่มีงบประมาณการเก็บรักษาที่ระบุอย่างชัดเจน การทำ Compaction ด้วยตนเองจะทำงานเสมือนจุดตรวจแบบตายตัวและดำเนินต่อโดยใช้เฉพาะบทสรุปใหม่

## การกำหนดค่า

กำหนดค่า Compaction ภายใต้ `agents.defaults.compaction` ใน `openclaw.json` ของคุณ ตัวเลือกที่ใช้บ่อยที่สุดแสดงไว้ด้านล่าง สำหรับข้อมูลอ้างอิงฉบับเต็ม โปรดดู [เจาะลึกการจัดการเซสชัน](/th/reference/session-management-compaction)

### การใช้โมเดลอื่น

โดยค่าเริ่มต้น 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
ตามปกติสร้างบทสรุปเชิงความหมาย

<Warning>
ตัวป้องกันขนาดไบต์มีผลกับประวัติทรานสคริปต์ SQLite ที่ใช้งานอยู่ อาร์ติแฟกต์
จุดตรวจ JSONL แบบเดิมไม่ใช่เป้าหมาย Compaction ที่ใช้งานอยู่
</Warning>

### ทรานสคริปต์สืบทอด

เมื่อเปิดใช้งาน `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"
        }
      }
    }
  }
}
```

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

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

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

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

```json
{
  "agents": {
    "defaults": {
      "compaction": {
        "provider": "my-provider"
      }
    }
  }
}
```

การตั้งค่า `provider` จะบังคับใช้ `mode: "safeguard"` โดยอัตโนมัติ ผู้ให้บริการจะได้รับคำสั่งสำหรับ Compaction และนโยบายการรักษาตัวระบุแบบเดียวกับเส้นทางในตัว และ OpenClaw ยังคงรักษาบริบทส่วนต่อท้ายของรอบล่าสุดและรอบที่ถูกแบ่งไว้หลังจากได้รับเอาต์พุตจากผู้ให้บริการ

<Note>
หากผู้ให้บริการล้มเหลวหรือส่งคืนผลลัพธ์ว่าง OpenClaw จะย้อนกลับไปใช้การสรุปด้วย LLM ในตัว
</Note>

## Compaction เทียบกับการตัดทอน

|                  | Compaction                    | การตัดทอน                          |
| ---------------- | ----------------------------- | -------------------------------- |
| **ทำอะไร** | สรุปการสนทนาเก่า | ตัดผลลัพธ์เครื่องมือเก่า           |
| **บันทึกหรือไม่**       | ใช่ (ในทรานสคริปต์ของเซสชัน)   | ไม่ (อยู่ในหน่วยความจำเท่านั้น ต่อคำขอ) |
| **ขอบเขต**        | การสนทนาทั้งหมด           | เฉพาะผลลัพธ์เครื่องมือ                |

[การตัดทอนเซสชัน](/th/concepts/session-pruning) เป็นส่วนเสริมที่เบากว่า ซึ่งตัดเอาต์พุตของเครื่องมือโดยไม่สรุป

## การแก้ไขปัญหา

**ทำ Compaction บ่อยเกินไปหรือไม่** หน้าต่างบริบทของโมเดลอาจมีขนาดเล็ก หรือเอาต์พุตของเครื่องมืออาจมีขนาดใหญ่ ลองเปิดใช้งาน [การตัดทอนเซสชัน](/th/concepts/session-pruning)

**บริบทรู้สึกล้าสมัยหลังทำ Compaction หรือไม่** ใช้ `/compact Focus on <topic>` เพื่อกำหนดแนวทางให้บทสรุป หรือเปิดใช้งาน [การล้างข้อมูลหน่วยความจำ](/th/concepts/memory) เพื่อให้โน้ตยังคงอยู่

**ต้องการเริ่มใหม่ทั้งหมดหรือไม่** `/new` จะเริ่มเซสชันใหม่โดยไม่ทำ Compaction

สำหรับการกำหนดค่าขั้นสูง (โทเค็นสำรอง การรักษาตัวระบุ เอนจินบริบทแบบกำหนดเอง และ Compaction ฝั่งเซิร์ฟเวอร์ OpenAI) โปรดดู [เจาะลึกการจัดการเซสชัน](/th/reference/session-management-compaction)

## เนื้อหาที่เกี่ยวข้อง

- [เซสชัน](/th/concepts/session): การจัดการและวงจรชีวิตของเซสชัน
- [การตัดทอนเซสชัน](/th/concepts/session-pruning): การตัดผลลัพธ์เครื่องมือ
- [บริบท](/th/concepts/context): วิธีสร้างบริบทสำหรับรอบการทำงานของเอเจนต์
- [Hooks](/th/automation/hooks): Hooks ของวงจรชีวิต Compaction (`before_compaction`, `after_compaction`)
