Claude: Blog (Web)
85

Thủ thuật

Tối ưu hóa chi phí token khi sử dụng Claude Code

(giờ Việt Nam)

Tóm tắt AI

Bài viết hướng dẫn cách kiểm soát chi phí Claude Code bằng cách quản lý ngữ cảnh, sử dụng lệnh /clear và tránh thay đổi cấu hình mô hình giữa chừng để tận dụng tối đa bộ nhớ đệm.

Bản dịch AI

Maximizing the value of your Claude Code sessions

Input tokens và output tokens

Một yêu cầu được xử lý qua GPU theo hai giai đoạn, và mỗi giai đoạn có mức chi phí khác nhau.

Đầu tiên, trong quá trình prefill (tiền xử lý), mô hình sẽ đọc yêu cầu và ngữ cảnh của bạn: system prompt, tệp CLAUDE.md, tin nhắn của bạn và mọi thứ đã được thêm vào cuộc trò chuyện kể từ đó (các tệp mà Claude đã đọc và kết quả đầu ra của các lệnh mà nó đã chạy). Đó chính là các input tokens của bạn.

Sau đó, trong quá trình decode (giải mã), mô hình sẽ viết các output tokens: suy nghĩ của nó, các công cụ mà nó gọi và văn bản mà bạn nhìn thấy. Quá trình này diễn ra từng token một; một phản hồi dài 200 token đồng nghĩa với việc mô hình phải chạy 200 lần, nối tiếp nhau. Với mỗi token, quá trình decode khiến GPU phải hoạt động lâu hơn nhiều, đó là lý do tại sao giá của output cao gấp khoảng 5 lần so với input.

Phần lớn các output tokens trong một phiên làm việc là các "thinking tokens" (token suy nghĩ), và mức độ suy nghĩ mà mô hình thực hiện trong mỗi lượt chính là điều mà effort level (mức độ nỗ lực) kiểm soát. Giống như mô hình, mức độ bạn chọn với /effort cũng sẽ được lưu lại làm mặc định cho phiên làm việc tiếp theo.

Prompt caching

Nếu một yêu cầu bắt đầu bằng chính xác các token giống như một yêu cầu mà máy chủ vừa xử lý, thì trạng thái cho phần khởi đầu được chia sẻ đó sẽ giống hệt nhau. Do đó, máy chủ có thể giữ lại trạng thái từ lần trước và chỉ cần prefill phần nội dung xuất hiện sau đó. Đây được gọi là prompt caching.

Việc đọc từ bộ nhớ đệm (cache) chỉ tốn 0,1 lần giá input, vì máy chủ tải trạng thái thay vì phải tính toán lại. Việc ghi các token vào cache tốn kém hơn một chút so với input thông thường, lên tới 2 lần, vì máy chủ cũng phải lưu giữ trạng thái đó sau đó. Tuy nhiên, việc ghi chỉ diễn ra một lần cho mỗi token, trong khi các lần đọc 0,1x sẽ xảy ra ở mọi lượt sau đó.

Claude Code tự động quản lý prompt cache cho mọi yêu cầu, bạn không cần phải bật tính năng này. Tuy nhiên, bạn vẫn có thể làm gián đoạn nó, vì vậy điều quan trọng là phải biết cách tránh những đợt tăng chi phí đột biến này.

Giả sử chúng ta nhập "fix the failing test in utils.test.ts". Đây là những gì Claude Code gửi đi cho yêu cầu đó:

Đó là năm yêu cầu cho một bản sửa lỗi nhỏ, và mỗi yêu cầu đều chứa toàn bộ cuộc trò chuyện tính đến thời điểm đó. Một lượt thông thường thường bị lệch: hàng chục nghìn token được gửi vào, nhưng chỉ vài trăm token được trả ra. Tuy nhiên, chỉ những gì mới trong lượt đó mới được prefill với giá đầy đủ.

Đó là toàn bộ hóa đơn cho mỗi lượt: phí đọc cache cho lịch sử, giá input đầy đủ cho những gì mới, và giá output cho phản hồi.

Bộ nhớ đệm phải khớp từ ngay đầu yêu cầu trở đi, và các yêu cầu luôn được gửi đi theo cùng một thứ tự: định nghĩa công cụ, sau đó là system prompt, rồi đến cuộc trò chuyện (với CLAUDE.md ở đầu).

Nếu bất kỳ thứ gì trong phần tiền tố đó thay đổi, mọi thứ phía sau nó sẽ bị prefill lại từ đầu. Kết quả của một công cụ được thêm vào cuối cuộc trò chuyện là trường hợp lý tưởng nhất, vì không có gì nằm phía sau nó. Điều làm mất hiệu lực của cache là bất kỳ thay đổi nào đối với yêu cầu ở phía trước, hoặc thay đổi khóa (key) của cache:

Điều này không có nghĩa là bạn không bao giờ nên chuyển đổi mô hình hoặc mức độ effort. Nó có nghĩa là có những thời điểm rẻ để thực hiện việc đó, như lúc bắt đầu phiên làm việc hoặc ngay sau lệnh /clear, và những thời điểm đắt đỏ, như khi đang ở giữa một cuộc trò chuyện dài.

Điều gì quyết định số lượng token mà một phiên làm việc gửi đi

Điều chính cần biết ở đây là không có gì được gửi chỉ một lần. Mọi thứ xuất hiện trong cuộc trò chuyện, một tệp Claude đã đọc hoặc kết quả đầu ra của một lệnh mà nó đã chạy, đều được gửi lại trong mọi lượt sau đó, cho đến hết phiên làm việc.

Vì nó đã được lưu vào cache nên mỗi lần gửi lại như vậy đều rẻ, nhưng rẻ không có nghĩa là miễn phí, và nó cũng chiếm không gian trong ngữ cảnh mà mô hình phải xử lý trong mỗi lượt.

Đó thực sự là toàn bộ mô hình chi phí của một phiên làm việc: có bao nhiêu token nằm trong ngữ cảnh, chúng tồn tại trong bao nhiêu lượt, và bạn đang chạy bao nhiêu ngữ cảnh cùng một lúc.

Những gì kết thúc trong ngữ cảnh

Một phần những gì có trong ngữ cảnh đã tồn tại trước khi bạn nhập bất cứ thứ gì: các định nghĩa công cụ, system prompt, CLAUDE.md và bất kỳ thứ gì khác được tải khi khởi động.

Hầu như mọi thứ khác được thêm vào trong phiên làm việc đều là kết quả của công cụ: các tệp Claude đọc và kết quả đầu ra của các lệnh nó chạy.

Việc Claude đọc bao nhiêu phần lớn phụ thuộc vào việc nó phải tự tìm hiểu bao nhiêu. Nếu bạn nói "các bài kiểm tra đang thất bại", trước tiên nó phải tìm ra bài kiểm tra nào: một hoặc hai lệnh grep, một vài tệp được mở để xem tệp nào liên quan, và tất cả các kết quả đó vẫn nằm trong ngữ cảnh rất lâu sau khi chúng không còn hữu ích nữa.

"Fix the failing test in utils.test.ts" giúp bỏ qua việc tìm kiếm và chỉ tốn một lệnh Read cho tệp đó, còn "Fix the failing test in @utils.test.ts" thậm chí không tốn lệnh Read nào.

Một thứ khác làm đầy ngữ cảnh là kết quả đầu ra của các lệnh Claude chạy. Mỗi khi nó chạy các bài kiểm tra, bản build hoặc git log của bạn, bất cứ thứ gì được in ra đều được thêm vào cuộc trò chuyện giống như một tệp nó đã đọc, và nằm ở đó trong cùng số lượt.

Các kết quả đầu ra thực sự lớn thì không sao: sau 30.000 ký tự, Claude Code sẽ ghi kết quả đầu ra vào một tệp và chỉ đưa một bản xem trước ngắn cùng đường dẫn vào cuộc trò chuyện (bạn có thể thay đổi thông qua BASH_MAX_OUTPUT_LENGTH).

Vấn đề nằm ở mọi thứ dưới mức đó. Một trình chạy kiểm tra in ra 400 bài kiểm tra thành công, mỗi bài một dòng, sẽ nằm dưới giới hạn này, và 400 dòng đó giờ đây trở thành một phần của mọi lượt còn lại.

Claude thường sẽ tự xử lý việc này cho bạn bằng các cờ (flags) và lệnh tail. Nếu bạn không muốn để Claude tự quyết định, trong tài liệu có một hook nhỏ giúp viết lại các lệnh gây nhiễu trước khi chúng chạy để chỉ những dòng quan trọng mới được trả về.

Nó tồn tại trong bao nhiêu lượt

Một phiên làm việc dài tốn kém hơn so với việc chia nhỏ công việc đó ra vài phiên ngắn, và tốn hơn bạn nghĩ, bởi vì lượt thứ 40 cũng đang đọc lại 39 lượt trước đó. Bạn muốn ngữ cảnh trong phiên làm việc của mình ngắn gọn và phù hợp, vì vậy đừng mang ngữ cảnh của tác vụ này sang tác vụ khác: hãy dùng /clear khi bạn bắt đầu một việc mới, và /compact khi phần trước của cùng một tác vụ đã hoàn thành.

Hãy chú ý đến các lượt xảy ra khi bạn không nhập liệu. Một lệnh /loop sẽ kích hoạt như một lượt đầy đủ trong phiên làm việc mà bạn thiết lập, mang theo toàn bộ cuộc trò chuyện đó mỗi lần, và nếu đã hơn một giờ kể từ lượt cuối cùng, nó sẽ bị tính là cache miss. Hãy bắt đầu một phiên làm việc mới trong một terminal khác và chạy vòng lặp từ đó.

Subagents (Tác nhân phụ)

Một cách khác để giữ cho nội dung không bị đầy trong ngữ cảnh của bạn là để nó diễn ra trong một ngữ cảnh khác, đó chính là mục đích của subagents. Một subagent có cửa sổ ngữ cảnh riêng, với system prompt, các công cụ và tệp CLAUDE.md riêng, nhưng không bao gồm cuộc trò chuyện của bạn. Nó chạy các lượt riêng và thứ duy nhất trả về phiên làm việc chính là câu trả lời của nó. Mọi thứ khác đều bị loại bỏ sau khi nó hoàn thành.

Nhược điểm của việc không có cuộc trò chuyện của bạn là đôi khi subagent phải đọc lại những thứ mà phiên chính đã có, và nó phải trả phí cho các lượt của riêng nó trong khi làm việc đó. Đối với một công việc nhỏ, đây chỉ là chi phí phụ.

Nó sẽ hiệu quả khi một công việc tạo ra nhiều kết quả đầu ra mà bạn không cần giữ lại, chẳng hạn như xem qua một tệp log. Claude thường sẽ tự chọn sử dụng subagent cho những việc như vậy, và bạn có thể yêu cầu trực tiếp khi nó không làm thế ("go through this log in a subagent"). Chỉ cần lưu ý rằng phiên chính chỉ nhận lại những gì subagent chọn báo cáo.

Đọc bài gốc

Bài viết được AI dịch và tổng hợp tự động từ Claude: Blog (Web). Liên kết bài gốc ở phía trên. Dữ liệu đồng bộ qua API công khai được ghi nguồn tại AI HOT (canonical) ↗. AIHOT.vn luôn dẫn nguồn đầy đủ — nếu bạn thấy điểm cần chỉnh sửa, hãy gửi ý kiến tại trang phản hồi.