Lệnh /compact trong Claude Code cho phép bạn chủ động cô đọng lịch sử hội thoại thành một bản tóm tắt duy nhất — giải phóng bộ nhớ mà vẫn giữ được các quyết định logic cốt lõi.
Thay vì để hệ thống tự ý cắt bỏ dữ liệu khi chạm trần bộ nhớ, lệnh này trao quyền kiểm soát cho bạn: chọn thời điểm nén, và chọn thứ cần giữ lại.
Vấn đề mà /compact trực tiếp xử lý chính là context rot (sự thối rữa ngữ cảnh) — hiện tượng
chất lượng phản hồi suy giảm nghiêm trọng khi cửa sổ ngữ cảnh (context window) đầy dần. Bạn sẽ nhận
thấy Claude bắt đầu quên các quyết định kiến trúc đã thống nhất trước đó, nhầm lẫn logic xử lý, hoặc
đề xuất code mâu thuẫn trực tiếp với các pattern đã thiết lập. Khi "nhiễu" (noise) từ log lỗi và
output dư thừa tích tụ, "tín hiệu" (signal) quan trọng bị loãng và biến mất khỏi sự chú ý của mô hình.
Nén ngữ cảnh giúp Claude Code quay lại trạng thái "sạch", giảm gánh nặng tính toán trên mỗi lượt tương tác. Nhưng nếu không biết cách điều khiển quá trình này, bạn sẽ đối mặt với rủi ro mất mát thông tin kỹ thuật tinh vi. Là một kỹ sư, bạn cần hiểu cơ chế nén để giữ cho "cộng sự" AI của mình luôn ở trạng thái tỉnh táo nhất.

"Context rot" là gì và vì sao ngữ cảnh càng dài mô hình càng kém?
Context rot không phải một lỗi lập trình, mà là một giới hạn cố hữu của các mô hình ngôn ngữ lớn (LLM). Khi một phiên kéo dài, Claude bắt đầu xuất hiện những triệu chứng "mệt mỏi kỹ thuật": nó hỏi lại những câu bạn đã trả lời, quên cấu trúc thư mục vừa refactor, hoặc đưa ra các đoạn code phá vỡ pattern logic đã dày công xây dựng.

Nguyên nhân nằm ở cách mô hình xử lý sự chú ý (attention). Hiệu suất của LLM thường đi theo đường cong chữ U (lost-in-the-middle): nó ghi nhớ tốt thông tin ở đầu và cuối ngữ cảnh, nhưng lơ đãng với thông tin ở giữa. Theo dữ liệu từ OpenAI và Chroma, độ chính xác có thể giảm từ 84% xuống chỉ còn khoảng 50% khi cửa sổ ngữ cảnh tiến gần mốc 1M token. Các dòng mô hình Claude suy giảm chậm hơn, nhưng không hề miễn nhiễm.
Trong quá trình làm việc, cửa sổ ngữ cảnh tích tụ hàng ngàn token từ log lỗi terminal, output của công cụ, các nỗ lực thử nghiệm thất bại và những đoạn hội thoại chắp nối. Tất cả tạo thành "nhiễu". Khi nhiễu chiếm ưu thế, các chỉ dẫn quan trọng ban đầu bị đẩy vào "vùng mù" của mô hình, dẫn đến việc Claude ra quyết định thiếu nhất quán và sai sót tăng dần theo số lượng tin nhắn.
Lệnh /compact thực chất làm gì với cuộc hội thoại?
Khi bạn chạy /compact, Claude đọc lại toàn bộ lịch sử hội thoại từ đầu phiên và tạo ra một khối
tóm tắt (<summary>) duy nhất. Khối này sau đó thay thế toàn bộ các tin nhắn cũ trong lịch sử.

Kết quả là payload gửi lên API giảm trung bình khoảng 85%. Một phiên đang nặng nề với khoảng 167K token có thể được thu gọn xuống còn khoảng 25K token. Toàn bộ không gian trống được giải phóng trở thành vùng nhớ ngắn hạn mới cho các logic phức tạp tiếp theo.
Điểm khác biệt quan trọng giữa việc bạn tự chạy /compact và để hệ thống tự động nén (auto-compact)
nằm ở quyền kiểm soát. Khi chủ động nén, bạn có thể đưa ra "chính sách giữ lại dữ liệu" (retention
policy). Ngược lại, khi hệ thống tự kích hoạt vì tràn bộ nhớ, nó tóm tắt một cách "mù quáng", thường
ưu tiên các tin nhắn gần nhất và bỏ qua những ràng buộc kiến trúc quan trọng được thiết lập ở đầu
phiên.
Khi nào Claude nén: tự động (~83%) và chủ động nén sớm (~60%)?
Mặc định, Claude Code tự động nén khi ngưỡng sử dụng đạt khoảng 83.5% (tương đương 167K/200K token). Nhưng nếu đợi đến ngưỡng này, bạn đã rơi vào "vùng tối" của hiệu suất. Tại 83%, khả năng suy luận của Claude đã bắt đầu suy giảm do áp lực ngữ cảnh, nên bản tóm tắt nó tự tạo ra có thể thiếu sót hoặc sai lệch thông tin quan trọng.

Hãy áp dụng "quy tắc 60%". Tại mốc này, Claude vẫn còn đủ sắc bén để quan sát lại toàn bộ quá trình làm việc và tạo ra bản tóm tắt chính xác nhất. Để quản lý, bạn nên phân chia trạng thái phiên theo các mốc:
- Xanh (0–30%): phiên còn mới, cứ để nó hoạt động tự nhiên.
- Vàng (30–50%): bắt đầu quan sát các điểm dừng nhiệm vụ (task boundary).
- Cam (50–60%): ngưỡng lý tưởng để chạy
/compact. Dừng việc bắt đầu feature mới để chuẩn bị nén. - Đỏ (>60%): vùng nguy hiểm. Đừng bắt đầu bất kỳ đợt refactor phức tạp nào nếu chưa nén.
Nếu bạn dùng model với cửa sổ 1M token, con số phần trăm cần được nhìn lại: 20% của 1 triệu đã là 200K token — đủ để làm loãng mọi logic tinh vi. Đừng để con số 1 triệu đánh lừa; mật độ tín hiệu quan trọng hơn tổng dung lượng.
Nén làm mất những gì — và bẫy "nén dồn" (tóm tắt của tóm tắt)?
Nén là một quá trình "lossy" (có mất mát). Những chi tiết kỹ thuật siêu nhỏ thường là nạn nhân đầu tiên: các thông số chính xác như timeout (30s), kích thước payload tối đa (512KB), hay tên biến cụ thể trong các module phụ. Claude thay thế chúng bằng những cụm từ chung chung như "đã thảo luận về các ràng buộc API".
Rủi ro lớn nhất là "cascading compression" (nén dồn). Nếu bạn nén một phiên lần thứ hai hay thứ ba, Claude thực hiện tóm tắt trên một bản tóm tắt cũ. Thông tin mờ nhạt dần theo lũy kế, giống như photocopy một bản photocopy nhiều lần. Sau vài lần nén dồn, Claude vẫn biết bạn đang làm dự án gì, nhưng những nguyên tắc ngầm định có thể biến mất hoàn toàn.
Ngoài ra, hãy cẩn trọng với các file cấu hình. Có một lỗi hệ thống khiến việc nén đôi khi không bảo
toàn tốt nội dung project-context.md hoặc các file CLAUDE.md nằm ở thư mục con (nested). Sau khi
nén, các path-scoped rule (quy tắc theo đường dẫn) thường biến mất cho đến khi file đó được đọc lại.
Viết lệnh /compact hiệu quả: KEEP/SUMMARIZE/DROP
Đừng bao giờ chỉ gõ /compact trống không. Hãy biến nó thành một "chính sách giữ lại" bằng cấu trúc
KEEP/SUMMARIZE/DROP.

Ví dụ 1: khi đang debug sâu
/compact
KEEP: Log lỗi 500 hiện tại ở middleware/auth.ts, giả thuyết về race condition, các bước tái hiện lỗi.
SUMMARIZE: Các nỗ lực fix đã thử nhưng thất bại (không cần chi tiết code cũ).
DROP: Output của npm install, các thảo luận về UI/UX không liên quan đến lỗi server.Ví dụ 2: khi phát triển feature mới
/compact
KEEP: Quyết định dùng JWT cho auth, cấu trúc schema trong database.ts, ràng buộc Node 18.
SUMMARIZE: Danh sách các module đã refactor xong, tiến độ task hiện tại.
DROP: Toàn bộ error log cũ đã fix, các phương án kiến trúc đã bị loại bỏ.Chủ động quản lý ngữ cảnh: công cụ thực chiến
Nén chỉ là một mảnh trong bức tranh lớn hơn về context engineering — nghệ thuật kiểm soát những gì được đưa vào cửa sổ ngữ cảnh. Dưới đây là vài công cụ thực chiến giúp bạn chủ động giữ ngữ cảnh gọn gàng.
Context meter (status line)
Đừng đoán bộ nhớ còn bao nhiêu. Hãy cài script hiển thị % ngữ cảnh trực tiếp trên terminal. Lưu
script dưới đây vào ~/.claude/statusline.sh:
#!/bin/bash
# Lấy mức sử dụng ngữ cảnh từ Claude Code
ctx=$(claude /context | grep "Context used" | awk '{print $3}')
echo "ctx:$ctx"Sau đó thêm cấu hình vào ~/.claude/settings.json để script chạy liên tục trên status line. Nhìn
thấy con số ctx: 58% sẽ giúp bạn dừng lại đúng lúc, trước khi rơi vào "vùng đỏ".
Chọn đúng công cụ reset ngữ cảnh
Dùng bảng sau để chọn công cụ khi phiên bắt đầu nặng nề (xem thêm cheatsheet lệnh Claude Code để nắm trọn bộ lệnh):
| Tình huống | Lệnh nên dùng | Lý do |
|---|---|---|
| Cùng một task, vừa xong một milestone | /compact [instructions] | Giữ lại các quyết định, xóa log rác |
| Chuyển sang một task hoàn toàn mới | /clear | Tránh lây nhiễm ngữ cảnh cũ sang task mới |
| Hướng đi vừa rồi bị sai, cần làm lại | /rewind | Xóa hoàn toàn các thử nghiệm lỗi thay vì tóm tắt chúng |
| Cần đọc đống tài liệu dày đặc | Subagent (song song) | Giữ việc đọc tài liệu ra khỏi ngữ cảnh chính của phiên |
CLAUDE.md và hỗ trợ nén
Bạn có thể thêm phần Compact Instructions vào file CLAUDE.md
ở gốc dự án. Khi Claude thực hiện nén (dù tự động hay thủ công), nó sẽ tham chiếu đến đây. Một mẹo:
thêm yêu cầu "Sau khi nén, hãy nhắc tôi nếu có quy tắc nào trong CLAUDE.md bị mờ nhạt" vào phần này.
Thói quen HANDOFF.md và rehydration
Trước khi nén hoặc xóa phiên, hãy yêu cầu Claude viết trạng thái hiện tại vào file HANDOFF.md trên
đĩa cứng. Đây là cách bảo hiểm tốt nhất cho dữ liệu của bạn.
Sau khi nén, ngữ cảnh của Claude sẽ bị "khô": nó biết file đó tồn tại nhưng nội dung chi tiết trong bộ nhớ tạm đã bị xóa. Hãy thực hiện rehydration (tái cấp ẩm): yêu cầu Claude đọc lại các file logic chính bạn đang sửa. Điều này nạp lại các chi tiết tươi mới vào vùng nhớ ngắn hạn vừa được giải phóng, đảm bảo Claude không "nói mò" dựa trên bản tóm tắt cũ.