SSD Nodes Learn Hosting plans →
Hướng dẫn Matt ConnorBởi Matt Connor · Cập nhật ngày 2026-08-24

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.md và 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, nên hãy giữ file này gọn

CLAUDE.md của bạn được nạp vào context khi bắt đầu session và giữ nguyên trong đó. Nếu file này chứa quy trình triển khai chi tiết, các token đó vẫn hiện diện khi bạn chỉ sửa một lỗi đánh máy 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.

Đưa các quy trình vào skills. Skill chỉ được nạp khi bạn gọi, nên một workflow chạy 2 lần mỗi tuần không tốn gì trong 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 trước. Khi bị cắt ngắn, phần đầu file được giữ lại, vì vậy hãy đặt các chỉ 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í phù hợp của một chỉ dẫn.

  • System prompt và output style không thay đổi vì chúng không thuộc message history.
  • CLAUDE.md ở project root, 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ẽ mất cho đến khi file tương ứng được đọc lại.
  • CLAUDE.md lồng trong một thư mục con sẽ mất cho đến khi một file trong thư mục con đó được đọc lại.
  • Hooks không bị ảnh hưởng vì hook chạy dưới dạng code và không bao giờ đi vào context.

Vì vậy, rule mà bạn phụ thuộc vào nên nằm trong CLAUDE.md ở project root: Claude Code sẽ xóa các tool output cũ trước rồi mới tóm tắt, nên các chỉ dẫn 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 đã nạp khi bắt đầu session, nên việc cắt bớt 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 lý do khiến rule không còn được tuân thủ. Vì vậy, khi rule vẫn rõ ràng còn trong cửa sổ context 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 task, /compact trong một task

Hai lệnh này trông có vẻ có thể thay thế cho nhau, nhưng chi phí rất khác nhau.

/clear [name] bắt đầu một conversation mới với context trống. Lệnh này không gửi request nào nên không tốn phí. Truyền một name để đặt nhãn cho conversation trước trong bộ chọn /resume; /reset/new là các alias. Hãy dùng lệnh này ngay khi chuyển sang một task không liên quan, vì nếu không task cũ sẽ được gửi lại và tính phí lại trong mọi message của task mới.

/compact [instructions] giải phóng context nhưng vẫn tiếp tục cùng conversation: 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ử đó. Hãy dùng trong một task dài khi bạn vẫn cần giữ continuity.

Luôn truyền instruction cho /compact. Một /compact không có tham số sẽ tóm tắt theo prompt mặc định, không biết phần nào của công việc vẫn cần giữ lại. 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 diff

Nếu lần nào bạn cũng compact vì cùng một lý do, hãy thêm instruction cố định vào CLAUDE.md của project, dưới một heading # Compact instructions. Trong session mới, /compact in ra Not enough messages to compact., nghĩa là hiện chưa có history.

Có 2 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 history; phần lớn thời gian của request nằm ở việc tạo summary. Compact một context lớn vẫn là một request lớn, vì conversation cần tóm tắt chính là input. Turn sau khi compact không phải phần chậm: nó xây dựng lại cache cho một prompt ngắn hơn nhiều.

Có 2 command rẻ hơn. /rewind [description] rollback code và conversation 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 history về một prefix đã có trong cache. /recap thêm summary dưới dạng command output thay vì thay thế history, nên cached prefix vẫn được giữ nguyên.

Khi automatic compaction liên tục được kích hoạt, output sẽ có dạng sau:

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 window 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 line range, 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 conversation trước đã hoàn tất.

Các 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 cả session. Bạn vẫn trả chi phí dù không gọi server đó.

Claude Code giảm tác động này. Theo mặc định, các đị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 các server thực sự tiêu 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 chạy MCP server của riêng bạn trên VPS, cùng phép tính này cũng 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 server chỉ thêm nội dung vào cuộc hội thoại và 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 đang tắt hoặc server không áp dụng cơ chế trì hoãn, 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 -40

Bả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 đợt

Prompt caching giúp việc gửi lại trở nên tiết kiệm: đọc prefix chỉ bằng 0.1x giá input cơ bản, trong khi ghi prefix có giá 1.25x; ghi với thời hạn một giờ có giá 2x. Mỗi lần sử dụng sẽ làm mới entry mà không phát sinh thêm chi phí, nên thời hạn được tính lại từ lần sử dụng cuối. Các hệ số này cho biết dạng của hóa đơn nhưng không cho biết tổng chi phí, 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 một con số tính bằng đô la.

Thời hạn bạn nhận được phụ 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 gói thuê bao Claude, Claude Code tự động yêu cầu thời hạn một giờ.
  • Sau khi vượt giới hạn của gói và bắt đầu dùng usage credits, bạn sẽ bị tính phí cho phần usage đó, nên thời hạn quay về năm phút.
  • Với API key hoặc cloud provider, thời hạn vẫn là năm phút. ENABLE_PROMPT_CACHING_1H=1 bật thời hạn một giờ, còn FORCE_PROMPT_CACHING_5M=1 buộc thời hạn trở lại năm phút.

Dù trong trường hợp nào, cách làm việc vẫn giống nhau: làm việc liên tục theo từng đợt, vì một khoảng nghỉ dài hơn thời hạn sẽ khiến lượt tiếp theo phải ghi lại toàn bộ prefix đã tích lũy. Một phiên Claude Code chạy tách khỏi terminal trong tmux không tốn chi phí khi idle, nhưng cache warm sẽ mất tác dụng trong khoảng thời gian idle đó.

Một số thao tác sẽ xóa cache dù bạn vẫn đang làm việc: đổi model, thay đổi effort level, bật fast mode, kết nối hoặc ngắt kết nối MCP server, bật hoặc tắt plugin, từ chối toàn bộ một tool, compact và upgrade Claude Code. /model thường là nguyên nhân gây bất ngờ nhất, vì mỗi model có cache riêng. Do đó, request tiếp theo phải đọc toàn bộ history mà không có cache hit, dù nội dung giống hệt. Lần đọc lại này được tính theo mức giá của model đích, nên việc chuyển sang Fable giữa phiên sẽ tính toàn bộ history đã tích lũy theo mức giá input được công bố của Fable 5.

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ữ nguyên cache. Cache chỉ áp dụng cho một máy và một thư mục, nên hai phiên ở các thư mục khác nhau sẽ không dùng được cache của nhau. Phạm vi này gắn với CLI thay vì account, nên cache không được chia sẻ sang ứng dụng Claude desktop. 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 mức giá ghi cache; cache_read_input_tokens được phục vụ với mức giá xấp xỉ một phần mười mức giá input tiêu chuẩn. Tỷ lệ đọc trên số lần tạo cao là dấu hiệu bình thường. Nếu số lần tạo vẫn cao qua từng lượt, nghĩa là có 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ột số model hiện nay hỗ trợ context window lên đến 1 million token, và cơ chế compaction vẫn hoạt động như cũ ở 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 được 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 thay vì giới hạn context, gói Claude 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.

Chỉnh sửa context và compaction trong API là hai việc khác nhau

Nếu bạn tự xây dựng agent trên Messages API, sẽ không có slash command và bạn phải tự triển khai chức năng này. Hãy tính phần công việc đó ngay từ đầu, vì API không có free tier ngoài một khoản credit nhỏ khi đăng ký, nên mỗi lượt gửi history chưa được cắt gọn đều bị tính phí đầy đủ. Provider bạn chọn sẽ quyết định cách tính này trước khi có bất kỳ thao tác cắt gọn nào. 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 theo từng token. Có hai tính năng phía server giúp xử lý việc này, và chúng không phải là cùng một tính năng.

Chỉnh sửa context sẽ chọn lọc và xóa nội dung cụ thể khỏi conversation history khi history tăng lên, rồi thay mỗi kết quả đã xóa bằng placeholder text để Claude biết nội dung đã bị gỡ. Đâ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. Giá trị mặc định của trigger là 100,000 input token, của keep là 3 lần sử dụng tool gần nhất, còn clear_tool_inputsfalse. Vì vậy, input đượ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ộ conversation history bằng bản tóm tắt đó. Đây cũng là tính năng 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 bàn giao dễ âm thầm 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 gửi lại block này trong các request sau. API sẽ loại bỏ mọi content block đứng trước nó. Khi triển khai thực tế, hãy thêm toàn bộ response.content, không chỉ phần text.

Tài liệu của Anthropic gọi server-side compaction là strategy chính để quản lý context trong các conversation chạy dài, còn context editing là lựa chọn cho phép kiểm soát chi tiết hơn nội dung bị xóa. Trước tiên, hãy kiểm tra model có được hỗ trợ hay không. Các model Opus, Sonnet và Fable hiện tại hỗ trợ compaction; claude-haiku-4-5 thì không, và trang compaction có danh sách được cập nhật mới nhất. Không beta nào trong hai beta này điều khiển /compact của Claude Code. Tài liệu của Claude Code mô tả đây là một request tóm tắt một lần do client gửi.

FAQ

Vì sao phiên Claude Code của tôi chạy 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 chỉ có một dòng trong phiên đã mở suốt cả ngày vẫn mang theo toàn bộ nội dung của ngày đó. Prompt caching giúp giảm chi phí khi cache còn hiệu lực: lượt đọc chỉ tính ở mức 0.1x đơn giá input cơ bản. Khi một lượt không trúng cache, cùng prefix đó sẽ được ghi lại ở mức 1.25x. Chạy /context để xem nội dung nào đang chiếm context window, và đọc cơ chế tính phí của phiên Claude Code.

/clear khác /compact trong Claude Code như thế nào?

/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 khi chuyển giữa các tác vụ 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 làm một tác vụ dài. Hãy chỉ rõ trọng tâm, như trong /compact keep only the plan and the diff, vì instruction này quyết định nội dung nào được giữ lại.

Làm cách nào để biết nội dung nào đang chiếm Claude Code context window?

Chạy /context, hoặc /context all để xem phân tích đầy đủ theo từng mục. Lệnh này hiển thị system prompt, định nghĩa tool, MCP server, memory file và lịch sử dưới dạng lưới màu, kèm đề xuất về các tool ngốn 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ột số model hiện tại chạy với context window 1 million token, trong đó có Opus 4.8 và Sonnet 5, 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 bị tính phí, 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 để xóa nội dung cũ, chủ yếu là kết quả của tool, đồng thời để lại placeholder text cho từng mục để 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à lựa chọn tinh chỉnh chi tiết. Cả hai đều đang ở trạng thái beta với header riêng, và đều tách biệt với /compact của Claude Code.