Sau một giờ làm việc, agent bỗng đề xuất lại phương án mà bạn đã bác bỏ nửa tiếng trước. Hoặc thuật lại nội dung một tệp mà bạn đã tự tay sửa từ trước. Trông giống như đãng trí, nhưng thực ra đó là cách hệ thống hoạt động: agent nhìn vào một cửa sổ có giới hạn và chỉ thấy những gì được đưa vào đó, chứ không phải toàn bộ dự án.

Cùng xem cửa sổ chứa những gì, cách kiểm tra bằng lệnh /context và nên làm gì khi gần hết chỗ trống.

Ngữ cảnh và giới hạn của nó

Ngữ cảnh là thông tin mô hình có thể dùng ở bước tiếp theo: tin nhắn của bạn, câu trả lời của agent, mã đã đọc, đầu ra của lệnh và chỉ dẫn trong dự án. Cửa sổ ngữ cảnh đặt giới hạn cho lượng thông tin có thể chứa cùng lúc. Đây không phải dung lượng trống trên đĩa hay bộ nhớ RAM của máy tính.

Đây là điểm khác biệt thường gây nhầm lẫn nhất. Có ba thứ rất dễ bị xem là một:

  • tệp trên đĩa - nội dung dự án mà các công cụ có thể đọc;
  • lịch sử phiên đã lưu - bản ghi cuộc trò chuyện được lưu trên đĩa và có thể mở lại;
  • ngữ cảnh hiện tại - thông tin mô hình có thể truy cập ngay lúc này.

Ba tập hợp này có liên quan nhưng không trùng nhau. Một tệp có thể nằm trong thư mục mà chưa từng xuất hiện trong cuộc trò chuyện. Ngược lại, cuộc trò chuyện có thể vẫn chứa phiên bản tệp từ nửa tiếng trước. Vì thế, câu "mình đã nói chuyện này rồi mà" chưa có nghĩa là agent đang có thông tin mới nhất.

  • Tệp dự án
  • Công cụ đọc tệp
  • Thông tin để trả lời

Giữa việc tệp tồn tại và việc agent biết về nó là bước đọc. Claude Code tự thực hiện bước này: tìm trong dự án, mở những tệp cần thiết và lần theo mã liên quan. Bạn không cần liệt kê trước từng đường dẫn. Nhưng trước khi bước đọc diễn ra, tệp đó chưa hiện diện trong cuộc trò chuyện.

Lượng thông tin này được đo bằng token - những mảnh văn bản nhỏ mà mô hình tách ra khi xử lý cả yêu cầu của bạn lẫn mã đã đọc. Một token có thể là cả từ, cũng có thể chỉ là một phần của từ, nên không thể đếm token bằng cách đếm số từ.

Cửa sổ chứa gì trước câu hỏi đầu tiên

Cửa sổ đã có nội dung ngay cả trước khi bạn gõ từ đầu tiên. Lệnh /context cho biết cụ thể những gì đang chiếm chỗ:

Đầu ra của lệnh /context: đã dùng 4k trên tổng số 200k token, phân theo các mục System prompt, Memory files, Skills, Messages và dòng Free space.

Phiên vừa mở nhưng 4k trên tổng số 200k token đã được dùng, toàn bộ là phần phục vụ hệ thống: System prompt - chỉ dẫn của chính agent, Memory files - các tệp CLAUDE.md và quy tắc dự án được nạp vào, Skills - danh sách skill hiện có. Dòng Messages, tức phần hội thoại, vẫn đang trống.

Còn đây là cách phân bổ sau một giờ làm việc, với thêm vài MCP server được kết nối:

/context

  System prompt     3.2k   ( 2%)   chỉ dẫn hệ thống
  System tools     12.1k   ( 6%)   mô tả các công cụ tích hợp
  MCP tools        21.4k   (11%)   các server bên ngoài đã kết nối
  Memory files      1.8k   ( 1%)   CLAUDE.md, rules, auto memory
  Messages         45.2k   (22%)   hội thoại, tệp, nhật ký của bạn
  Free space      116.3k   (58%)

Đây là sơ đồ minh họa, không phải đầu ra của một phiên bản cụ thể: các dòng và cách hiển thị tùy thuộc vào phiên bản Claude Code cũng như những gì được kết nối trong dự án; kích thước cửa sổ thì tùy theo mô hình. Nhưng nhìn chung, bức tranh vẫn tương tự và có thể rút ra vài điều thiết thực:

  • phần tối thiểu dành cho hệ thống - chỉ dẫn của agent và mô tả các công cụ tích hợp - luôn có mặt, bạn không thể tác động đến phần này;
  • mỗi MCP server được kết nối sẽ thêm ít nhất danh sách công cụ của nó vào cửa sổ, kể cả khi bạn chưa dùng lần nào. Kết nối kiểu "cứ để đó" đồng nghĩa với việc tốn chỗ trong mọi phiên;
  • tệp CLAUDE.md phình to cũng chiếm chỗ lại từ đầu mỗi lần khởi chạy. Thêm một lý do để giữ tệp này ngắn gọn;
  • trong lúc làm việc, về cơ bản chỉ có một dòng tăng lên - Messages. Hãy theo dõi dòng đó.
Thử ngay trên dự án của bạn

Nếu đang dùng Claude Code, hãy chạy /context, nhờ agent đọc vài tệp rồi chạy lệnh thêm lần nữa. Dòng Messages sẽ tăng rõ rệt, và bạn sẽ thấy một lần đọc tốn bao nhiêu chỗ.

Những gì tích lũy trong lúc làm việc

Từ đây, chính bạn làm đầy cửa sổ - và không chỉ bằng lời nói. Ngữ cảnh sẽ nhận mọi thứ agent đọc hoặc nhận được theo yêu cầu của bạn:

NguồnThông tin chiếm chỗ
Hội thoạitin nhắn của bạn, câu trả lời của agent, kể cả các phương án đã bị bác bỏ
Tệp đã đọctoàn bộ nội dung hoặc những đoạn cần thiết
Kết quả từ công cụđầu ra của lệnh, các dòng tìm được, quan sát từ trình duyệt
Tài liệu của skill và MCPchỉ dẫn của skill được dùng, mô tả công cụ đã gọi

Yêu cầu và ngữ cảnh nhận được có thể chênh lệch rất nhiều. Câu "hiển thị toàn bộ nhật ký" chỉ có vài từ, nhưng kết quả có thể dài hàng nghìn dòng. Vì vậy, đầu ra lớn đôi khi còn có hại hơn cả một câu hỏi dài.

Do đó, hãy chỉ đưa vào đúng nguồn cần thiết. Ký hiệu @ trước đường dẫn sẽ thêm tệp vào cuộc trò chuyện; khi nhập đường dẫn, bạn cũng có thể chọn từ gợi ý: Đọc @src/reward-flow.js và giải thích nơi xác định số điểm. Nhắc đến một thư mục bằng @ cũng không có nghĩa là tải nội dung của mọi tệp bên trong: liên kết đến thư mục chỉ cung cấp danh sách tệp. Hãy chọn nguồn phù hợp với câu hỏi. Sự khác nhau giữa liên kết đến tệp và thư mục được mô tả trong tài liệu về cách tham chiếu tệp.

Còn một chi tiết nhỏ. Nếu sau đó bạn tự đổi mười thành hai mươi, câu trả lời cũ sẽ không tự cập nhật. Trước khi yêu cầu kết quả mới, hãy nhờ agent đọc nội dung hiện tại. Việc từng tham chiếu tệp một lần không biến đoạn văn bản cũ trong cuộc trò chuyện thành bản sao luôn cập nhật của tệp trên đĩa.

Khi cửa sổ sắp hết chỗ

Cửa sổ có giới hạn, nhưng phiên làm việc cũng không đột ngột dừng giữa chừng. Khi cửa sổ dần đầy, Claude Code sẽ nén ngữ cảnh: thay lịch sử chi tiết bằng bản tóm tắt ngắn hơn để giải phóng chỗ. Việc này diễn ra tự động, còn thời điểm tùy thuộc vào mô hình và cài đặt.

Bạn cũng có thể tự chạy lệnh /compact để nén. Chủ động chạy lệnh có ích ở chỗ bạn chọn được thời điểm - chẳng hạn trước một phần việc lớn mới - và có thể chỉ rõ điều gì cần được giữ lại:

/compact Hãy giữ lại mục tiêu nhiệm vụ và phạm vi chỉnh sửa,
phương án dùng handler riêng đã bị bác bỏ
và bước tiếp theo: kiểm tra việc xóa ô tìm kiếm.

Điều quan trọng cần nhớ về nén: cửa sổ giữ lại bản tóm tắt, không phải nguyên cuộc trò chuyện. Chi tiết nào không được đưa vào bản tóm tắt sẽ biến mất khỏi cửa sổ; sau khi nén, tranh luận kiểu "nhưng hai mươi phút trước bạn đã đồng ý" chẳng ích gì - tốt hơn hết là đọc lại thông tin cần thiết từ tệp. Chỉ dẫn dự án vẫn được giữ nguyên: tệp CLAUDE.md ở thư mục gốc sẽ được nạp lại.

Lệnh thứ hai, /clear, không nén gì cả. Lệnh này bắt đầu cuộc trò chuyện mới; phiên trước vẫn được lưu và có thể mở bằng /resume. Các tệp dự án không đổi, chỉ dẫn dự án vẫn được nạp như thường lệ.

LệnhTác dụngKhi nào nên dùng
/contextcho biết cửa sổ đang chứa những gìkhông rõ chỗ trống đã dùng vào đâu
/compactrút gọn lịch sử thành bản tóm tắtvẫn cùng một nhiệm vụ nhưng lịch sử đã dài
/clearbắt đầu cuộc trò chuyện mớiđã chuyển sang nhiệm vụ khác

Quy tắc chọn rất đơn giản: vẫn cùng nhiệm vụ thì nén, nhiệm vụ khác thì bắt đầu cuộc trò chuyện mới. Không cần dọn sạch cuộc trò chuyện sau mỗi lệnh; khi bạn đang xử lý một vấn đề, những gì đã quan sát và làm rõ vẫn có ích. Nhưng trước khi chuyển sang chủ đề mới, nên ghi lại kết luận cần dùng trong vài dòng: "phần thưởng được cấu hình trong src/reward-config.js, còn việc cộng điểm nằm trong src/reward-flow.js". Đây là gợi ý để quay lại đúng chỗ mà không phải chép lại cả cuộc trò chuyện.

Dùng cửa sổ ngữ cảnh tiết kiệm hơn

Bạn sẽ ít phải dùng cả ba lệnh hơn nếu ngay từ đầu cửa sổ không bị nhồi quá nhiều thứ. Một vài thói quen dưới đây thường hữu ích nhất:

  • Đặt câu hỏi cụ thể. Với yêu cầu mơ hồ, agent phải tự dò tìm: đọc thêm tệp và thử nhiều phương án. Nêu rõ tệp cần xem và kết quả bạn mong đợi sẽ tiết kiệm cả chỗ lẫn thời gian.
  • Đừng đưa vào mọi thứ. Khi hỏi vì sao test thất bại, bạn chỉ cần các dòng xung quanh lỗi, không cần toàn bộ nhật ký.
  • Giữ chỉ dẫn dự án ngắn gọn. CLAUDE.md được nạp trong mỗi phiên. Tài liệu tham khảo dài nên để trong các tệp riêng và chỉ đọc khi cần.
  • Tắt MCP server không cần thiết. Server được kết nối "phòng khi cần" vẫn chiếm chỗ mỗi lần khởi chạy nhưng chẳng đem lại lợi ích nào.
  • Giao việc nghiên cứu lớn cho subagent. Subagent làm việc trong cửa sổ riêng và trả về bản tóm tắt; hàng chục tệp đã đọc vẫn nằm trong ngữ cảnh của nó.

Điều cần nhớ

Ngữ cảnh là những gì bạn đặt lên bàn, chứ không phải mọi thứ "có trong dự án". Tệp trên đĩa, bản ghi trong lịch sử và thông tin trong cửa sổ hiện tại là ba thứ khác nhau; nhầm lẫn giữa chúng giải thích phần lớn những câu trả lời kỳ lạ.

Tóm lại, có ba việc: xem mức sử dụng bằng /context, đưa đúng nguồn vào bằng @, và chọn đúng lúc để nén cuộc trò chuyện hay bắt đầu phiên mới. Hãy chọn theo tình huống - nén không thay thế việc đọc tệp cần thiết, còn tệp được đưa vào cũng không thay bạn kiểm tra lập luận của agent.