Cách giảm context Claude Code chậm và tốn kém
Mỗi lượt Claude Code gửi lại toàn bộ context nên session dài sẽ chậm và tốn hơn. Dùng /context, cắt phần cố định, rồi clear hoặc compact đúng lúc.
Cách ngăn một session Claude Code dài trở nên chậm và tốn kém
Một session Claude Code dài trở nên chậm và tốn kém vì mỗi lượt đều gửi lại toàn bộ context, trong khi context chỉ tăng lên. Cách khắc phục là dọn dẹp theo một thứ tự cố định. Chạy /context để xem nội dung nào đang chiếm cửa sổ context, loại bỏ những nội dung mà bạn phải trả phí trong mỗi request, sau đó dùng /clear giữa các tác vụ không liên quan và dùng /compact kèm một instruction bên trong một tác vụ dài. Hãy làm việc theo từng đợt liên tục, vì prompt cache lạnh biến một lần đọc rẻ thành việc ghi lại toàn bộ nội dung bạn đã nói.
Cơ chế đo token phía sau một session agent giải thích vì sao meter vẫn hoạt động.
Đọc /context trước khi thay đổi bất cứ thứ gì
Đừng đoán nội dung đang chiếm context window. Claude Code sẽ cho bạn biết.
/context [all] hiển thị mức sử dụng context hiện tại dưới dạng lưới màu, kèm đề xuất tối ưu cho các công cụ dùng nhiều context và tình trạng memory phình to; all mở rộng phần phân tích theo từng mục ở chế độ toàn màn hình. Đọc kết quả theo 5 nhóm.
- System prompt. Các chỉ thị của chính Claude Code. Cố định trong suốt session.
- Định nghĩa tool. Schema của mọi tool mà agent có thể gọi, bao gồm mọi MCP (Model Context Protocol) server được kết nối.
- File memory.
CLAUDE.mdvà auto memory, được tải khi session bắt đầu. - File và kết quả tool. Mọi file đã đọc và mọi nội dung mà các command của bạn in ra.
- Lịch sử message. Các lượt gửi của bạn và phản hồi của Claude Code.
Ba nhóm đầu là chi phí cố định, được tính trong mọi request suốt vòng đời của session. Hai nhóm cuối sẽ tăng dần. Hãy giảm chi phí cố định một lần ngay từ đầu; liên tục quản lý phần tăng dần.
Hai chuỗi cho biết context window đã đầy:
Context exceeds the 200k-token limit by 94k tokens — run /compact or /clear to continue.
Context is 94k tokens past the 200k-token compaction window — run /compact to reduce usage.Chuỗi đầu là giới hạn cứng. Request sẽ bị từ chối và lỗi API (application programming interface) tương ứng là Prompt is too long. Chuỗi thứ hai là cửa sổ compaction, có thể thấp hơn context window thực tế của model 1 million token. Request vẫn thành công sau ngưỡng này, vì vậy đây là cảnh báo chứ không phải lỗi từ chối.
Trong paid plan, /usage bổ sung phần còn lại bằng cách đánh dấu các hành vi như context dài hoặc cache miss, đồng thời phân bổ mức sử dụng gần đây cho từng skill, subagent và MCP server. Nếu nó cho biết allowance đã được dùng hết, cửa sổ giới hạn nào đang chặn bạn sẽ quyết định việc cắt giảm context có giúp bạn tiếp tục ngay hay bạn cần một hướng khác để làm việc trở lại.
CLAUDE.md là chi phí cố định, vì vậy hãy giữ file này gọn
CLAUDE.md của bạn được nạp vào context khi session bắt đầu và tiếp tục nằm ở đó. Nếu file chứa quy trình triển khai chi tiết, các token đó vẫn hiện diện trong khi bạn sửa một typo trong file test. Hướng dẫn của Anthropic là chỉ đưa các nội dung thiết yếu vào file và giữ file dưới 200 dòng.
Chuyển các quy trình vào skills. Một skill chỉ được nạp khi được gọi, nên workflow bạn chạy 2 lần mỗi tuần không tốn gì vào những ngày còn lại. Sau khi compaction, mỗi skill có ngân sách riêng: nội dung được chèn lại, tối đa 5,000 token cho mỗi skill và 25,000 token tổng cộng; các skill cũ nhất bị loại bỏ trước. Khi bị cắt ngắn, hệ thống giữ phần đầu file, vì vậy hãy đặt các hướng dẫn quan trọng nhất gần đầu SKILL.md.
Nội dung còn lại sau compaction quyết định vị trí của một hướng dẫn.
- System prompt và output style không thay đổi vì chúng không thuộc message history.
- Project-root
CLAUDE.md, các rule không giới hạn phạm vi và auto memory được nạp lại từ disk. - Rule có frontmatter
paths:sẽ bị mất cho đến khi một file khớp được đọc lại. CLAUDE.mdlồng trong một subdirectory sẽ bị mất cho đến khi một file trong subdirectory đó được đọc lại.- Hooks vẫn tiếp tục chạy vì hook chạy dưới dạng code; chỉ phần context mà hook đã thêm trước đó mới được tóm tắt cùng phần còn lại của conversation.
Vì vậy, rule mà bạn phụ thuộc phải nằm trong project-root CLAUDE.md: Claude Code sẽ xóa các tool output cũ trước, rồi mới tóm tắt; do đó, các hướng dẫn xuất hiện sớm trong conversation có thể bị mất. Chỉnh sửa memory bằng /memory. Claude Code giữ bản copy đã nạp khi session bắt đầu, nên việc trim giữa session vẫn giữ prompt cache và chưa có hiệu lực cho đến /clear, /compact tiếp theo hoặc lần restart tiếp theo. Mất context chỉ là một trong các lý do khiến rule không còn được tuân thủ. Vì vậy, khi rule rõ ràng vẫn còn trong window nhưng vẫn bị bỏ qua, hãy kiểm tra các nguyên nhân khác trước khi viết lại rule.
Xóa giữa các tác vụ, /compact trong một tác vụ
Hai lệnh này trông giống nhau nhưng chi phí khác nhau rất nhiều.
/clear [name] bắt đầu một cuộc hội thoại mới với context trống. Lệnh này không gửi request nên không tốn chi phí. Truyền một tên để gắn nhãn cuộc hội thoại trước trong bộ chọn /resume; /reset và /new là các alias. Hãy dùng lệnh này ngay khi chuyển sang một tác vụ không liên quan, vì nếu không, tác vụ cũ sẽ được gửi lại và tính phí lại trong mỗi message của tác vụ mới.
/compact [instructions] giải phóng context nhưng vẫn tiếp tục cùng cuộc hội thoại: lệnh này tóm tắt lịch sử đến thời điểm hiện tại rồi thay thế lịch sử bằng bản tóm tắt đó. Hãy dùng lệnh này trong một tác vụ dài mà bạn vẫn cần duy trì tính liên tục.
Luôn truyền một instruction cho /compact. /compact không có đối số sẽ tóm tắt theo một prompt mặc định, không biết bạn vẫn cần phần nào của công việc. Khi có instruction, lệnh sẽ giữ lại phần đó:
/compact focus on the auth bug fix
/compact keep only the plan and the diffNếu lần nào bạn cũng compact vì cùng một lý do, hãy đặt instruction cố định trong CLAUDE.md của project, dưới một heading # Compact instructions. Trong session mới, /compact in ra Not enough messages to compact.. Điều này có nghĩa là cuộc hội thoại có quá ít lượt để tóm tắt. Trường hợp này vẫn có thể xảy ra dù context còn đầy đủ, nếu một lần paste lớn đã lấp đầy context.
Hai loại chi phí thường bị nhầm lẫn ở đây. Request tóm tắt dùng chung prefix của bạn, nên đọc cache hiện có thay vì xử lý lại lịch sử; phần lớn thời gian của request được dùng để tạo bản tóm tắt. Compact một context lớn vẫn là một request lớn, vì cuộc hội thoại được tóm tắt chính là input. Lượt ngay sau khi compact không phải phần chậm: lượt đó chỉ xây dựng lại cache cho một prompt ngắn hơn nhiều.
Có hai command rẻ hơn. /rewind rollback code và cuộc hội thoại về một checkpoint; với một path bạn muốn bỏ hoàn toàn, lệnh này tốt hơn compact vì nó cắt về một prefix đã có trong cache. /recap thêm bản tóm tắt dưới dạng command output thay vì thay thế lịch sử, nên prefix đã cache vẫn được giữ nguyên.
Khi automatic compaction liên tục chạy lại, nó in ra:
Autocompact is thrashing: the context refilled to the limit...Compaction đã thành công, nhưng một file hoặc tool output đã nạp đầy cửa sổ context nhiều lần liên tiếp, nên Claude Code dừng retry. Để khôi phục, hãy đọc file quá lớn theo từng khoảng dòng, chạy /compact với focus loại bỏ output lớn, chuyển phần việc đó sang một subagent, hoặc dùng /clear nếu cuộc hội thoại trước đó đã hoàn tất.
MCP server tạo ra chi phí cố định
Mỗi MCP server bạn kết nối sẽ được tính vào mọi request trong toàn bộ session. Bạn vẫn phải trả chi phí dù không gọi server đó.
Claude Code giảm tác động này. Theo mặc định, định nghĩa MCP tool được trì hoãn, nên chỉ tên tool được đưa vào context cho đến khi Claude sử dụng một tool cụ thể. Chạy /context để xem chính xác các server của bạn đang tốn bao nhiêu, và chạy /mcp disable <name> để gỡ server bạn sẽ không dùng hôm nay. Nếu bạn tự chạy MCP server trên VPS, cùng phép tính này giới hạn số tool mà một server nên expose.
Hãy thực hiện việc này khi bắt đầu session. Khi các định nghĩa vẫn được trì hoãn, việc kết nối hoặc ngắt kết nối một server chỉ thêm nội dung vào conversation, còn cache vẫn được giữ lại. Ngược lại, nếu các định nghĩa được nạp vào prefix vì tool search bị tắt, không khả dụng hoặc thấp hơn ngưỡng auto, thay đổi tương tự sẽ khiến request tiếp theo đọc lại toàn bộ nội dung.
Lọc output dài dòng của tool trước khi đưa vào context
Kết quả từ tool là input và sẽ được gửi lại trong mọi lượt sau. Một lần chạy test tạo ra 20,000 token output không chỉ tốn chi phí một lần: bạn phải trả chi phí đó ở mọi lượt tiếp theo cho đến khi output rời khỏi cửa sổ context.
Hãy lọc ngay tại nguồn. Một hook rút gọn kết quả chạy test thành các lỗi trước khi Claude nhìn thấy sẽ biến lượng output dài đó thành vài trăm token, cả ở lượt này lẫn mọi lần gửi lại sau đó:
npm test 2>&1 | grep -E "FAIL|Error:" | head -40Bản thân hook không đi vào context vì chúng chạy dưới dạng code. Hãy áp dụng cách này cho mọi tool có output dài quá một màn hình. Logic tương tự cũng áp dụng cho file dài 3,000 dòng: chỉ yêu cầu khoảng dòng bạn cần, vì toàn bộ file sẽ tiếp tục nằm trong cửa sổ context sau khi được đưa vào.
Giới hạn phạm vi file agent đọc và giao phần việc nhiều đầu ra
Prompt nêu rõ file và triệu chứng sẽ khiến agent đọc file đó. Một yêu cầu mở như dọn dẹp project khiến agent đọc mọi thứ mà nó cho là có liên quan, và toàn bộ các lần đọc đó vẫn chiếm chỗ trong context window.
Hãy giao phần việc có nhiều đầu ra cho subagent. Các lần chạy test và xử lý log đều tiêu tốn context thực; subagent giữ đầu ra đó trong window riêng và chỉ trả về bản tóm tắt. Đổi lại, subagent phải tạo cache riêng, không có cache hit ở lần gọi đầu tiên, và vẫn dùng thời hạn cache năm phút ngay cả khi dùng subscription. Việc giao phần việc giúp bảo vệ context chính một cách đáng tin cậy. Tuy nhiên, cách này không phải lúc nào cũng giảm tổng số token.
Đồng hồ cache: làm việc theo từng phiên
Prompt caching giúp việc gửi lại trở nên tiết kiệm. Ghi phần prefix có chi phí bằng 1.25x giá input cơ bản, hoặc 2x nếu dùng lifetime một giờ. Đọc lại cache có chi phí bằng 0.1x trên Haiku 5.5, 0.05x trên Opus 5.5 và Sonnet 5.5 ($0.20 và $0.10 trên mỗi triệu token), và 0.025x trên Fable 5.1 ($0.25 trên mỗi triệu token). Mỗi lần sử dụng sẽ gia hạn entry mà không phát sinh thêm chi phí, nên đồng hồ được tính lại từ lần sử dụng gần nhất. Các hệ số này cho biết hình dạng của hóa đơn nhưng không cho biết số tiền cụ thể, vì vậy hãy kết hợp chúng với chi phí thực tế của một triệu token để quy đổi toàn bộ context window thành số tiền bằng dollar.
Bạn nhận được lifetime nào tùy thuộc vào cách xác thực. Đây là lý do nhận định chung rằng "cache của bạn hết hạn sau năm phút" là không chính xác.
- Với Claude subscription, Claude Code tự động yêu cầu lifetime một giờ.
- Khi vượt quá giới hạn của plan và bắt đầu dùng usage credits, bạn sẽ bị tính phí cho phần usage đó, nên lifetime quay lại năm phút.
- Với API key hoặc cloud provider, lifetime vẫn là năm phút. Đặt
promptCacheTtlthành1hhoặcENABLE_PROMPT_CACHING_1H=1sẽ chọn lifetime một giờ, cònFORCE_PROMPT_CACHING_5M=1buộc lifetime quay lại năm phút.
Dù dùng cách nào, nguyên tắc về nhịp làm việc vẫn giống nhau: hãy làm việc theo các phiên liên tục, vì một khoảng idle dài hơn lifetime sẽ khiến lượt tiếp theo phải ghi lại toàn bộ prefix đã tích lũy. Một Claude Code session chạy detached trong tmux không tốn phí khi idle, và cache warm là thứ bị mất trong thời gian idle đó.
Một số thao tác sẽ xóa cache ngay cả khi bạn vẫn đang làm việc: chuyển model, thay đổi effort level trên các model cũ, bật fast mode, kết nối hoặc ngắt kết nối MCP server, từ chối toàn bộ một tool khi tool definitions được load upfront, bật hoặc tắt plugin thêm tool, compact, xóa các image cũ khi conversation chứa quá nhiều image, và upgrade Claude Code. Trên Opus 5.5, Sonnet 5.5, Haiku 5.5 và Fable 5.1 khi dùng API key hoặc subscription, thay đổi effort hiện đã giữ lại cache. /model thường gây bất ngờ vì mỗi model có cache riêng. Vì vậy request tiếp theo phải đọc toàn bộ history mà không có cache hit, dù nội dung không thay đổi. Lần đọc lại này được tính theo rate của model đích như một lần ghi cache mới. Do đó, chuyển sang Fable giữa session sẽ tính phí toàn bộ history đã tích lũy theo cache-write rate được công bố của Fable: $12.50 trên mỗi triệu token với lifetime năm phút hoặc $20 với lifetime một giờ, giống nhau trên Fable 5 và Fable 5.1.
Chỉnh sửa file, chỉnh sửa CLAUDE.md, gọi skill và command, chạy /recap, rewind và tạo subagent đều giữ lại cache. Cache chỉ có phạm vi một machine và một directory, nên hai session ở các directory khác nhau sẽ không dùng được cache của nhau. Phạm vi này gắn với CLI chứ không gắn với account, nên cache không được chuyển sang Claude desktop app. Trên Linux, ứng dụng này là một bản beta được cài riêng bên cạnh CLI.
Để kiểm tra caching có hoạt động hay không, hãy đọc current_usage. cache_creation_input_tokens được ghi theo cache write rate; cache_read_input_tokens được phục vụ theo cache read rate của model, trong khoảng từ 2.5% đến 10% standard input rate tùy model. Tỷ lệ read-to-creation cao là dấu hiệu tốt. Nếu creation vẫn cao qua từng turn, nghĩa là có thành phần nào đó trong prefix liên tục thay đổi.
Cửa sổ context lớn hơn có khắc phục được vấn đề này không?
Một phần. Mọi model hiện tại (Fable 5.1, Opus 5.5, Sonnet 5.5 và Haiku 5.5) đều chạy với cửa sổ context 1 million token, và cơ chế compaction hoạt động giống nhau ở giới hạn lớn hơn. Chi phí không thay đổi, vì toàn bộ prompt vẫn được gửi lại và vẫn bị tính phí ở mỗi lượt. Cửa sổ lớn hơn quyết định thời điểm bạn buộc phải xử lý; việc giữ context gọn gàng quyết định chi phí. Nếu vấn đề là hóa đơn chứ không phải giới hạn, Claude plan nào phù hợp với cách bạn làm việc sẽ quyết định bạn đang chi tiền hay dùng hạn mức của plan.
Context editing và compaction trong API là hai việc khác nhau
Nếu bạn đang xây dựng agent của riêng mình trên Messages API, không có slash command và bạn phải tự triển khai phần này. Hãy dự trù công việc đó ngay từ đầu, vì các hạn mức miễn phí của API sẽ không trả chi phí cho token của bạn. User mới nhận được một lượng free credit nhỏ để thử API. Hạn mức miễn phí cố định mà Anthropic công bố (50 giờ miễn phí mỗi ngày cho mỗi organization trên trang pricing, 1,550 giờ mỗi tháng trong tài liệu) áp dụng cho thời gian chạy code execution container, được tính phí riêng với token. Mỗi lượt đều gửi lại toàn bộ history chưa được cắt và tính phí cho toàn bộ phần đó: theo mức cache read khi prefix còn trong cache, và theo mức input đầy đủ hoặc mức cộng thêm khi ghi cache nếu prefix không còn trong cache. Provider bạn chọn sẽ quyết định phép tính này trước khi bất kỳ thao tác cắt nào diễn ra. Vì vậy, nếu vẫn chưa chốt lựa chọn, hãy tính chi phí cùng một workload trên cả hai API thay vì chỉ so sánh mức giá headline trên mỗi token. Có hai tính năng phía server thực hiện việc này, và chúng không phải là cùng một tính năng.
Context editing chọn lọc và xóa nội dung cụ thể khỏi history của cuộc hội thoại khi history tăng lên, rồi thay mỗi phần đã xóa bằng placeholder text để Claude biết rằng có nội dung đã bị xóa. Đây là tính năng beta: gửi anthropic-beta: context-management-2025-06-27 và cấu hình các strategy trong context_management.edits. clear_tool_uses_20250919 xóa tool result, còn clear_thinking_20251015 quản lý thinking block. trigger mặc định là 100,000 input token, keep mặc định là 3 lần dùng tool gần nhất, còn clear_tool_inputs mặc định là false. Vì vậy input vẫn được giữ lại và chỉ result bị xóa.
Compaction tạo một bản tóm tắt rồi thay toàn bộ history của cuộc hội thoại bằng bản tóm tắt đó. Có hai beta. Threshold compaction chạy trong các request thông thường của bạn: gửi anthropic-beta: compact-2026-01-12 và dùng edit type compact_20260112. Trigger mặc định là {"type": "input_tokens", "value": 150000} và giá trị phải ít nhất là 50,000. On-demand compaction cho phép code của bạn quyết định thời điểm chạy: gửi anthropic-beta: compact-2026-09-04 với "compaction": {"type": "summarize"} ở cấp cao nhất, rồi response chỉ chứa summary block. Tổng quan compaction của Anthropic khuyến nghị dùng on-demand compaction ở mọi nơi có hỗ trợ.
Threshold compaction có một quy tắc bàn giao dễ bị bỏ qua nhưng có thể làm agent hỏng. Response bắt đầu bằng một content block compaction chứa bản tóm tắt, sau đó là text block thông thường. Bạn phải truyền block này lại trong các request sau; API sẽ tự loại bỏ mọi content block đứng trước nó. Trên thực tế, hãy thêm toàn bộ response.content, không chỉ phần text. On-demand compaction hoạt động ngược lại: bạn tự xóa các message đã được tóm tắt, đặt block được trả về ở đầu messages và gửi lại nguyên trạng, bao gồm cả signature.
Tài liệu của Anthropic gọi server-side compaction là strategy chính để quản lý context trong các cuộc hội thoại chạy dài, còn context editing là lựa chọn cho việc kiểm soát chi tiết hơn nội dung cần xóa. Trước tiên hãy kiểm tra model có được hỗ trợ hay không. Mọi model hiện tại đều hỗ trợ cả hai loại compaction, bao gồm Haiku 5.5; claude-haiku-4-5 cũ hơn thì không. Mỗi trang về compaction đều có danh sách được cập nhật. Không beta nào trong số này điều khiển /compact riêng của Claude Code. Tài liệu của Claude Code mô tả tính năng đó là một request tóm tắt riêng mà client gửi cùng history của bạn.
FAQ
Vì sao session Claude Code của tôi chậm hơn và tốn kém hơn khi chạy càng lâu?
Vì toàn bộ cuộc trò chuyện được gửi lại ở mỗi lượt, nên một câu hỏi một dòng trong session đã mở cả ngày sẽ mang theo toàn bộ nội dung của ngày đó. Prompt caching giúp giảm chi phí khi cache còn warm: mỗi lần đọc có giá bằng 0.1x mức giá input cơ bản trên Haiku 5.5, 0.05x trên Opus 5.5 và Sonnet 5.5, và 0.025x trên Fable 5.1. Khi một lượt không còn cache hit, cùng prefix đó sẽ được ghi lại với giá 1.25x, hoặc 2x nếu dùng lifetime một giờ. Chạy /context để xem nội dung nào đang chiếm context window, rồi đọc Claude Code tính phí cho session dựa trên những gì để hiểu cơ chế.
Sự khác nhau giữa /clear và /compact trong Claude Code là gì?
/clear bắt đầu một cuộc trò chuyện mới với context trống. Lệnh này không gửi request nên không tốn phí, và phù hợp để chuyển giữa các task không liên quan. /compact giữ nguyên cuộc trò chuyện hiện tại và thay lịch sử bằng một bản tóm tắt, nên phù hợp khi vẫn đang xử lý một task dài. Hãy chỉ định trọng tâm cho lệnh, như trong /compact keep only the plan and the diff, vì instruction quyết định nội dung nào được giữ lại.
Làm thế nào để biết nội dung nào đang chiếm context window của Claude Code?
Chạy /context, hoặc /context all để xem breakdown đầy đủ theo từng mục. Lệnh này hiển thị system prompt, tool definitions, MCP servers, memory files và lịch sử dưới dạng lưới màu, kèm đề xuất về các tool dùng nhiều context và memory bị phình to. Với paid plan, /usage cũng phân bổ usage gần đây cho từng skill, subagent và MCP server.
Tôi có nên dùng context window 1 million token thay vì compact không?
Context window lớn hơn chỉ trì hoãn vấn đề chứ không giải quyết vấn đề. Mọi model hiện tại (Fable 5.1, Opus 5.5, Sonnet 5.5 và Haiku 5.5) đều chạy với context window 1 million token, và compaction hoạt động theo cùng cách ở đó. Mỗi lượt vẫn gửi lại toàn bộ prompt và vẫn tính phí theo đó, nên một cuộc trò chuyện 400,000 token vẫn tốn kém dù có vừa trong context window hay không.
Context editing khác compaction trong Claude API như thế nào?
Context editing chọn lọc nội dung cũ để xóa, chủ yếu là kết quả của tool, đồng thời để lại placeholder tại vị trí của từng kết quả để Claude biết nội dung đó đã bị xóa. Compaction tạo một bản tóm tắt rồi thay toàn bộ lịch sử bằng bản tóm tắt đó. Tài liệu của Anthropic gọi compaction là chiến lược chính cho các cuộc trò chuyện chạy lâu và xem context editing là tùy chọn tinh chỉnh chi tiết. Cả hai đều là beta với header riêng, và đều tách biệt với /compact của Claude Code.