Cách tối ưu Claude Code để bớt tốn token
Mỗi turn Claude Code đều gửi lại toàn bộ context gây chậm và tốn phí. Bạn hãy dùng lệnh /context để kiểm tra và dọn dẹp để tránh lãng phí token vô ích.
Cách để ngăn Claude Code session chạy lâu bị chậm và tốn kém
Một Claude Code session chạy lâu sẽ bị chậm và tốn kém vì mỗi turn đều gửi lại toàn bộ context, và context đó chỉ có tăng lên. Cách khắc phục là giữ vệ sinh hệ thống theo một thứ tự cố định. Chạy /context để xem cái gì đang làm đầy window, cắt bỏ các item mà bạn phải trả phí cho mỗi request, sau đó dùng /clear giữa các task không liên quan và /compact kèm theo một instruction trong một task dài. Hãy làm việc theo từng đợt liên tục, vì một prompt cache bị nguội sẽ biến một lượt read rẻ tiền thành một lượt re-write toàn bộ những gì bạn đã nói.
Lý do tại sao đồng hồ tính phí lại chạy được giải thích tại cơ chế tính token đằng sau một agent session.
Đọc /context trước khi bạn thay đổi bất cứ thứ gì
Đừng đoán cái gì đang làm đầy window. Claude Code sẽ cho bạn biết.
/context [all] vẽ usage context hiện tại dưới dạng một lưới màu, kèm theo các gợi ý tối ưu hóa cho các tool nặng về context và memory bloat; all mở rộng bảng phân tích chi tiết từng item ở chế độ fullscreen. Hãy đọc kết quả theo năm nhóm (buckets).
- The system prompt. Các instruction framework của chính Claude Code. Cố định cho suốt session.
- Tool definitions. Schema cho mọi tool mà agent có thể gọi, bao gồm mọi MCP (Model Context Protocol) server đã kết nối.
- Memory files.
CLAUDE.mdvà auto memory, được load khi bắt đầu session. - Files and tool results. Mọi file đã đọc, và mọi thứ mà command của bạn in ra.
- Message history. Các turn của bạn và các phản hồi của nó.
Ba nhóm đầu tiên là một loại thuế cố định, phải trả cho mỗi request trong suốt vòng đời của session. Hai nhóm cuối cùng thì tăng dần. Hãy cắt bỏ phần thuế cố định một lần duy nhất ở lúc bắt đầu; và quản lý phần tăng dần một cách liên tục.
Có hai chuỗi ký tự cho bạn biết 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 thứ nhất là một giới hạn cứng, và request sẽ bị từ chối; lỗi API tương ứng là Prompt is too long. Chuỗi thứ hai là một compaction window, có thể nằm dưới context window thực tế của model trên một model 1 million token. Các request vẫn thành công sau mức đó, nên cái thứ hai là một cảnh báo thay vì là một sự từ chối.
Trên gói trả phí, /usage bổ sung nửa còn lại, gắn thẻ các hành vi như long context hoặc cache misses và quy trách nhiệm sử dụng gần đây cho từng skill, subagent và MCP server riêng biệt.
CLAUDE.md là một loại thuế vĩnh viễn, vì vậy hãy giữ nó gọn nhẹ
CLAUDE.md của bạn được load vào context khi bắt đầu session và nằm ở đó. Nếu nó chứa một quy trình deployment chi tiết, những token đó sẽ luôn hiện diện ngay cả khi bạn chỉ đang sửa một lỗi typo trong một file test. Hướng dẫn của Anthropic là chỉ bao gồm những thứ thiết yếu và giữ file dưới 200 dòng.
Chuyển các quy trình vào các skills. Một skill chỉ load khi được gọi, vì vậy một workflow bạn chạy hai lần một tuần sẽ không tốn gì vào những ngày còn lại. Skills có budget riêng sau khi compaction: các body được re-inject, giới hạn ở 5,000 tokens mỗi skill và 25,000 tokens tổng cộng, item cũ nhất sẽ bị loại bỏ trước. Việc truncation giữ lại phần đầu của file, vì vậy hãy đặt các instruction quan trọng nhất ở gần đầu file SKILL.md.
Những gì còn sót lại sau một đợt compaction sẽ quyết định một instruction thuộc về đâu.
- The system prompt và output style không đổi, vì chúng không phải là một phần của message history.
- Project-root
CLAUDE.md, các unscoped rules, và auto memory được re-inject từ disk. - Một rule có frontmatter
paths:sẽ bị mất cho đến khi file tương ứng được đọc lại. - Một
CLAUDE.mdlồng nhau trong một subdirectory sẽ bị mất cho đến khi một file trong subdirectory đó được đọc lại. - Các hooks không bị ảnh hưởng, vì một hook chạy như code và không bao giờ đi vào context.
Vì vậy, một rule mà bạn phụ thuộc vào nên nằm trong project-root CLAUDE.md: Claude Code xóa các tool outputs cũ trước rồi mới summarize, nên các instruction từ đầu cuộc hội thoại có thể bị mất. Chỉnh sửa memory bằng /memory. Claude Code giữ bản copy mà nó đã load khi bắt đầu session, nên việc trim giữa session sẽ giữ được prompt cache và không có hiệu lực cho đến /clear, /compact, hoặc khi restart.
/clear giữa các task, /compact bên trong một task
Hai lệnh này trông có vẻ có thể dùng thay thế cho nhau nhưng chi phí lại rất khác nhau.
/clear [name] bắt đầu một cuộc hội thoại mới với context trống. Nó không gửi request nào, nên không tốn chi phí. Truyền một cái tên để dá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 nó ngay khi bạn chuyển sang một task không liên quan, vì nếu không thì task cũ sẽ bị gửi lại, và bị tính phí lại, trong mỗi message của task mới.
/compact [instructions] giải phóng context trong khi vẫn tiếp tục cùng một cuộc hội thoại: nó summarize lịch sử cho đến thời điểm hiện tại và thay thế nó. Hãy dùng nó bên trong một task dài, nơi bạn vẫn cần sự liên tục.
Luôn đưa cho /compact một instruction. Một lệnh /compact trống rỗng sẽ summarize dựa trên một prompt mặc định mà không biết phần việc nào bạn vẫn cần. Một lệnh có instruction sẽ giữ lại nó:
/compact focus on the auth bug fix
/compact keep only the plan and the diffNếu bạn compact vì cùng một lý do mỗi lần, hãy đặt một standing instruction trong CLAUDE.md của project bạn dưới một heading # Compact instructions. Trong một session mới, /compact sẽ in ra Not enough messages to compact., điều này chỉ có nghĩa là chưa có lịch sử.
Có hai loại chi phí dễ bị nhầm lẫn ở đây. Request summarization dùng chung prefix của bạn, nên nó đọc cache hiện có thay vì xử lý lại lịch sử, và phần lớn thời gian của nó dành cho việc generate summary. Việc compact một context lớn vẫn là một request lớn, vì cuộc hội thoại đang được summarize chính là input. Turn sau khi compaction không phải là phần chậm: nó rebuild cache cho một prompt ngắn hơn nhiều.
Có hai lệnh rẻ hơn. /rewind [description] rollback code và conversation về một checkpoint; đối với một path mà bạn muốn bỏ hẳn thì nó tốt hơn compact, vì nó truncation về một prefix đã được cache sẵn. /recap append một summary như là command output thay vì thay thế history, nên prefix đã cache vẫn còn nguyên.
Việc automatic compaction chạy lặp đi lặp lại sẽ in ra thế này:
Autocompact is thrashing: the context refilled to the limit...Compaction thành công, nhưng một file hoặc tool output đã làm đầy lại window nhiều lần liên tiếp, nên Claude Code đã ngừng thử lại. Hãy khôi phục bằng cách đọc file quá khổ theo các line ranges, chạy /compact với một focus để loại bỏ output lớn, chuyển công việc đó sang một subagent, hoặc dùng /clear nếu cuộc hội thoại trước đó đã xong.
MCP servers là overhead cố định
Mỗi MCP server bạn kết nối sẽ cộng thêm vào mỗi request cho toàn bộ session. Bạn phải trả phí bất kể bạn có gọi nó hay không.
Claude Code làm nhẹ bớt việc này. Các MCP tool definitions được trì hoãn (deferred) theo mặc định, nên chỉ có tên tool đi vào context cho đến khi Claude sử dụng một tool cụ thể. Chạy /context để xem các server của bạn thực sự tốn bao nhiêu, và /mcp disable <name> để loại bỏ một server mà bạn sẽ không dùng hôm nay. Nếu bạn chạy các MCP server riêng trên VPS của bạn, cùng một phép toán đó sẽ giới hạn số lượng tool mà một server nên expose.
Hãy làm việc này ở đầu session. Trong khi các definitions vẫn được trì hoãn, việc kết nối hoặc ngắt kết nối một server chỉ là append thêm vào cuộc hội thoại, và cache vẫn còn đó. Ở nơi mà các definitions được load vào prefix (do tắt tool search hoặc một server được miễn trừ khỏi việc trì hoãn), thì cùng một thay đổi đó sẽ khiến request tiếp theo phải re-read mọi thứ.
Filter output verbose của tool trước khi nó đi vào context
Một tool result là input, và input sẽ được gửi lại trong mỗi turn sau đó. Một lượt chạy test dump ra 20,000 tokens output không phải là chi phí một lần: bạn phải trả phí cho nó một lần nữa trong mỗi turn cho đến khi nó rời khỏi window.
Hãy filter ngay tại nguồn. Một hook giúp giảm một lượt chạy test chỉ còn lại các lỗi trước khi Claude thấy nó sẽ biến cả một bức tường output đó thành vài trăm tokens, trong turn này và trong mọi lần resend nó:
npm test 2>&1 | grep -E "FAIL|Error:" | head -40Các hooks không bao giờ tự đi vào context, vì chúng chạy như code. Hãy làm điều này cho bất kỳ tool nào có output chạy quá màn hình. Logic tương tự cũng áp dụng cho một file 3,000 dòng: hãy yêu cầu line range bạn cần, vì toàn bộ file sẽ nằm trong window một khi nó đã đến.
Giới hạn phạm vi những gì agent đọc, và delegate các việc ồn ào
Một prompt nêu tên file và triệu chứng sẽ đọc file đó. Một request mở để dọn dẹp project sẽ đọc bất cứ thứ gì agent quyết định là liên quan, và mỗi lần đọc đó đều nằm trong window.
Hãy delegate các việc verbose cho một subagent. Test runs và log processing đều tiêu tốn context thực; một subagent giữ output đó trong window riêng của nó và chỉ trả về một summary. Sự đánh đổi là: một subagent sẽ build cache riêng của nó và không có hit nào ở call đầu tiên, và nó sử dụng lifetime cache 5 phút ngay cả khi bạn có subscription. Delegation bảo vệ context chính của bạn một cách đáng tin cậy. Nó không phải lúc nào cũng làm giảm tổng số token.
Đồng hồ cache: làm việc theo từng đợt
Prompt caching là thứ giúp việc resend trở nên rẻ tiền: 0.1x tốc độ input cơ bản để read prefix, so với 1.25x để write nó, hoặc 2x để write nó với lifetime một giờ. Mỗi lần sử dụng sẽ refresh entry mà không tốn thêm chi phí, nên đồng hồ chạy từ lần sử dụng cuối cùng.
Bạn nhận được lifetime nào tùy thuộc vào cách bạn authenticate, đây là chỗ mà câu nói chung chung "cache của bạn hết hạn sau 5 phút" bị sai.
- Với Claude subscription, Claude Code tự động request lifetime một giờ.
- Khi bạn vượt quá limit của plan và dùng credit sử dụng, bạn sẽ bị tính phí cho usage đó, nên nó quay về 5 phút.
- Với API key hoặc cloud provider, nó giữ ở mức 5 phút.
ENABLE_PROMPT_CACHING_1H=1cho phép dùng lifetime một giờ, vàFORCE_PROMPT_CACHING_5M=1ép nó quay về mức cũ.
Lời khuyên về nhịp độ làm việc là giống nhau dù theo cách nào: hãy làm việc theo các đợt liên tục, vì một khoảng nghỉ idle quá lifetime sẽ khiến turn tiếp theo của bạn phải re-write toàn bộ prefix đã tích lũy. Một Claude Code session tách biệt trong tmux không tốn gì khi idle, và cache ấm (warm cache) chính là thứ mà thời gian idle đánh đổi được.
Một số hành động sẽ vứt bỏ cache khi bạn vẫn đang làm việc: switching models, thay đổi effort level, bật fast mode, kết nối hoặc ngắt kết nối một MCP server, enable hoặc disable một plugin, deny một tool hoàn toàn, compacting, và upgrade Claude Code. /model là một sự ngạc nhiên thường gặp, vì mỗi model có cache riêng, nên request tiếp theo sẽ đọc toàn bộ lịch sử mà không có cache hits dù nội dung hoàn toàn giống nhau.
Editing files, editing CLAUDE.md, invoking skills và commands, running /recap, rewinding, và spawning một subagent đều giữ được cache. Nó được giới hạn trong một máy và một directory, nên hai session ở hai directory khác nhau sẽ không dùng chung cache của nhau.
Để xem liệu caching có hoạt động không, hãy đọc current_usage. cache_creation_input_tokens được viết ở tốc độ cache write; cache_read_input_tokens được phục vụ ở khoảng 1/10 tốc độ input tiêu chuẩn. Tỷ lệ read-to-creation cao là dấu hiệu tốt. Nếu creation vẫn cao liên tục qua các turn, có gì đó trong prefix của bạn đang thay đổi liên tục.
Một context window lớn hơn có giải quyết được việc này không?
Một phần. Một vài model hiện tại hỗ trợ context window 1 million token, và compaction hoạt động tương tự ở giới hạn lớn hơn. Kinh tế học không thay đổi, vì full prompt vẫn được gửi lại và vẫn bị tính phí trên mỗi turn. Một window lớn hơn quyết định khi nào bạn bị buộc phải hành động; hygiene quyết định chi phí. Nếu hóa đơn là vấn đề chứ không phải là trần (ceiling), thì Claude plan nào phù hợp với cách bạn làm việc sẽ quyết định bạn đang tiêu tiền đô hay tiêu hạn mức của plan.
Context editing và compaction trong API là hai thứ khác nhau
Nếu bạn đang build agent riêng trên Messages API, sẽ không có slash commands và bạn phải tự implement chúng. 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à một.
Context editing xóa chọn lọc nội dung cụ thể từ conversation history khi nó tăng lên, thay thế mỗi result đã xóa bằng một placeholder text để Claude biết thứ gì đó đã bị xóa. Đây là bản beta: gửi anthropic-beta: context-management-2025-06-27 và cấu hình các strategies dưới context_management.edits. clear_tool_uses_20250919 xóa tool results, và clear_thinking_20251015 quản lý các thinking blocks. trigger của nó mặc định là 100,000 input tokens, keep là 3 tool uses cuối cùng, và clear_tool_inputs là false, để các inputs được giữ lại và chỉ có results bị xóa.
Compaction tạo ra một summary và thay thế toàn bộ conversation history bằng nó. Đây cũng là bản beta: 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.
Compaction có một quy tắc handoff làm hỏng các agent một cách âm thầm. Response bắt đầu bằng một compaction content block chứa summary, theo sau là text block bình thường. Bạn phải gửi lại block đó trong các request sau, và API sau đó sẽ xóa mọi content block trước nó. Trong thực tế: hãy append toàn bộ response.content, chứ không chỉ mỗi text.
Tài liệu của Anthropic gọi server-side compaction là chiến lược chính để quản lý context trong các cuộc hội thoại chạy lâu, và context editing là tùy chọn để kiểm soát chi tiết hơn những gì bị xóa. Hãy kiểm tra hỗ trợ của model trước. Các model Opus, Sonnet và Fable hiện tại đều hỗ trợ compaction; claude-haiku-4-5 thì không, và trang compaction sẽ có danh sách cập nhật nhất. Cả hai bản beta này đều không điều khiển /compact của chính Claude Code, thứ mà tài liệu mô tả là một request summarize một lần mà client gửi đi.
FAQ
Tại sao Claude Code session của tôi càng chạy lâu càng chậm và tốn kém?
Vì toàn bộ cuộc hội thoại được gửi lại ở mỗi turn, nên một câu hỏi một dòng trong một session đã mở cả ngày sẽ mang theo toàn bộ dữ liệu của cả ngày đó. Prompt caching giữ cho nó rẻ khi cache còn ấm, ở mức 0.1x tốc độ input cơ bản để read; một khi một turn bị cache miss, cùng một prefix đó sẽ bị re-write ở mức 1.25x. Chạy /context để xem cái gì đang làm đầy window, và đọc Claude Code session tính phí bạn như thế nào để biết cơ chế.
Sự khác biệt giữa /clear và /compact trong Claude Code là gì?
/clear bắt đầu một cuộc hội thoại mới với context trống. Nó không gửi request nào, nên không tốn gì, và là lựa chọn đúng đắn giữa các task không liên quan. /compact giữ nguyên cuộc hội thoại và thay thế history bằng một summary, nên là lựa chọn đúng đắn bên trong một task dài. Hãy đưa cho nó một focus, như trong /compact keep only the plan and the diff, vì instruction sẽ quyết định cái gì được giữ lại.
Làm thế nào để tôi thấy cái gì đang dùng hết context window của Claude Code?
Chạy /context, hoặc /context all để xem bảng phân tích chi tiết từng item. Nó hiển thị system prompt, tool definitions, MCP servers, memory files, và history dưới dạng một lưới màu, kèm theo các gợi ý cho các tool nặng về context và memory bloat. Trên gói trả phí, /usage cũng gắn thẻ 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ì dùng compact không?
Một window lớn hơn chỉ trì hoãn vấn đề chứ không giải quyết nó. Một vài model hiện tại chạy context window 1 million token, bao gồm Opus 4.8 và Sonnet 5, và compaction hoạt động tương tự ở đó. Mỗi turn vẫn gửi lại full prompt và vẫn tính phí cho nó, nên một cuộc hội thoại 400,000-token vẫn đắt đỏ bất kể nó có vừa window hay không.
Sự khác biệt giữa context editing và compaction trong Claude API là gì?
Context editing xóa chọn lọc nội dung cũ, chủ yếu là tool results, để lại placeholder text tại nơi mỗi cái từng tồn tại để Claude biết nó đã bị xóa. Compaction tạo ra một summary và thay thế toàn bộ history bằng nó. Tài liệu của Anthropic gọi compaction là chiến lược chính cho các cuộc hội thoại chạy lâu, và đặt context editing là tùy chọn kiểm soát chi tiết. Cả hai đều là bản beta với các header riêng, và cả hai đều tách biệt với /compact của Claude Code.