Cửa sổ ngữ cảnh của LLM agent: những gì nằm trong đó và vì sao agent quên quy tắc
Cửa sổ ngữ cảnh của LLM là toàn bộ văn bản mà mô hình thấy khi tạo mỗi câu trả lời: system prompt, file hướng dẫn, lịch sử hội thoại, các file đã đọc và đầu ra của công cụ. Cửa sổ có giới hạn cứng tính bằng token, nhưng chất lượng chú ý giảm từ rất sớm trước giới hạn đó, nên trong phiên dài agent bắt đầu đánh mất quy tắc; giải pháp là hướng dẫn ngắn, compaction, phiên mới kèm file kế hoạch và đưa công việc ồn ào sang subagent.
Cửa sổ ngữ cảnh của LLM là gì
Cửa sổ ngữ cảnh của LLM là toàn bộ văn bản mà mô hình nhận làm đầu vào khi sinh ra một câu trả lời. Mô hình không có trí nhớ theo nghĩa con người: mọi thứ nó «biết» về nhiệm vụ của bạn tại thời điểm đó đều nằm trong cửa sổ này. Cái gì không có trong cửa sổ thì với mô hình là không tồn tại.
Kích thước cửa sổ đo bằng token — các mảnh từ nhỏ. Với tiếng Việt, một token thường ngắn hơn so với tiếng Anh, nên cùng một hướng dẫn có thể tốn nhiều token hơn. Các mô hình hiện nay có cửa sổ hàng trăm nghìn token, nên có vẻ như chỗ đủ cho mọi thứ. Trên thực tế, chỗ trong cửa sổ cạn nhanh hơn bạn nghĩ, và chất lượng làm việc của agent suy giảm còn sớm hơn.
Những gì nằm trong cửa sổ ngữ cảnh của agent
Agent lập trình có đúng ba nguồn thông tin: system prompt mô tả nhiệm vụ, nội dung các file nó đã đọc, và đầu ra của các công cụ nó đã gọi. Cả ba cùng sống trong một cửa sổ và cạnh tranh chỗ.
| Thành phần | Khi nào vào | Thường tốn bao nhiêu |
|---|---|---|
| System prompt của agent và mô tả công cụ | đầu mỗi phiên | chi phí cố định, gần như không phụ thuộc bạn |
| CLAUDE.md, AGENTS.md và các file hướng dẫn khác | đầu phiên, toàn bộ | từ vài trăm đến hàng chục nghìn token — tùy bạn |
| Tin nhắn của bạn và câu trả lời của agent | tích lũy suốt cuộc hội thoại | tăng sau mỗi lượt |
| File đã đọc | khi agent mở chúng | file lớn — hàng nghìn token mỗi lần |
| Đầu ra lệnh: test, log, build, grep | sau mỗi lần gọi | thường là phần lớn nhất và ít hữu ích nhất |
Điều cốt lõi: không thứ nào trong số này tự biến mất. Log test bị lỗi cần cho hai mươi bước trước vẫn nằm trong cửa sổ và tiếp tục giành sự chú ý của bước hiện tại. Một phiên dài là một đống ngày càng lớn, trong đó việc tìm cây kim ngày càng khó.
Vì sao agent quên quy tắc trong phiên dài
Lời phàn nàn phổ biến: lúc đầu phiên, agent tuân thủ cẩn thận các quy tắc trong CLAUDE.md, nhưng sau một giờ làm việc lại bắt đầu vi phạm. Nó không «quên» theo nghĩa đen — văn bản quy tắc vẫn còn trong cửa sổ. Vấn đề nằm ở cách mô hình phân bổ sự chú ý trên một văn bản dài.
Lost in the middle
Nghiên cứu của Liu và các cộng sự năm 2023 cho thấy: các mô hình ngôn ngữ dùng thông tin ở đầu và cuối ngữ cảnh dài tốt hơn đáng kể so với thông tin ở giữa. File hướng dẫn được nạp vào đầu phiên, nhưng khi hội thoại tiếp diễn, ngày càng nhiều văn bản chất lên phía trên và phía dưới nó. Quy tắc từng nằm ở vị trí nổi bật dần rơi vào vùng mà mô hình «nhìn» kém nhất.
Tỷ lệ quy tắc trong cửa sổ giảm dần
Ở phiên mới, các hướng dẫn chiếm một phần đáng kể của ngữ cảnh. Sau hàng trăm lần gọi công cụ, chúng trở thành một đoạn nhỏ giữa log, diff và đoạn code đã đọc. Tín hiệu vẫn vậy, nhưng nhiễu xung quanh tăng gấp hàng chục lần.
Ví dụ mới lấn át quy tắc cũ
Mô hình phụ thuộc mạnh vào những gì vừa diễn ra trong hội thoại. Nếu agent đã vài lần làm điều gì đó đi vòng quanh một quy tắc và không bị phát hiện, mẫu hành vi đó trong lịch sử bắt đầu nặng hơn một dòng hướng dẫn ở đâu đó phía đầu.
Context rot: chất lượng suy giảm trước khi chạm giới hạn
Context rot («thối rữa ngữ cảnh») là tên gọi hiện tượng chất lượng câu trả lời của mô hình giảm dần khi cửa sổ đầy lên, dù vẫn còn rất xa giới hạn kỹ thuật. Mô hình về hình thức nhận 200 nghìn token, nhưng ở 150 nghìn token nó làm việc kém hơn so với ở 20 nghìn: hay nhầm chi tiết, lặp lại các phương án đã bị bác bỏ, quên hướng dẫn.
Dấu hiệu phiên đã «thối rữa»:
- agent đề xuất một cách làm mà cách đó đã cùng bị loại bỏ nửa tiếng trước;
- nhầm tên file và hàm đã được bàn trước đó;
- ngừng chạy các kiểm tra mà ban đầu chính nó đã chạy;
- câu trả lời ngày càng dài và loãng, xuất hiện những câu kiểu «tiện thể đã sửa luôn».
Thêm một quy tắc nữa để chữa là vô ích: quy tắc mới cũng sẽ lạc trong cùng đống nhiễu. Cần giảm nhiễu.
Compaction ngữ cảnh
Compaction là việc nén lịch sử phiên: mô hình viết một bản tóm tắt những gì đã diễn ra, và hội thoại tiếp tục từ bản tóm tắt đó thay vì từ toàn bộ lịch sử. Cửa sổ được giải phóng, còn phần cốt lõi của công việc về lý thuyết vẫn được giữ lại.
Trong Claude Code có lệnh /compact, và bạn có thể truyền cho nó gợi ý về những gì cần tập trung khi nén. Khi cửa sổ gần đầy, Claude Code cũng tự động thực hiện compaction. Lệnh /clear xóa hoàn toàn lịch sử và bắt đầu với trang trắng, còn /context cho biết cửa sổ đang bị chiếm bởi những gì.
/context
/compact giữ lại: mục tiêu nhiệm vụ, các quyết định đã chốt kèm lý do, danh sách file đã đổi, những gì còn cần kiểm tra
/clear
Compaction nguy hiểm ở đâu
Bản tóm tắt luôn làm mất chi tiết. Bản nén có thể không giữ phương án đã bị loại và lý do loại, cách diễn đạt chính xác của yêu cầu, hay một điểm tinh tế mà bạn đã thống nhất lướt qua. Sau compaction, agent làm việc theo bản ghi chú do chính phiên của nó viết lại. Vì vậy những điều quan trọng nên được giữ không phải trong lịch sử hội thoại mà trong các file sẽ tồn tại qua mọi lần compaction.
Compaction hay phiên mới
| Tình huống | Nên làm gì |
|---|---|
| Nhiệm vụ gần xong, chỉ cần thêm chút chỗ | Compaction kèm gợi ý nên giữ gì |
| Vừa xong một nhiệm vụ, chuẩn bị làm nhiệm vụ khác | Phiên mới, lịch sử cũ chỉ gây vướng |
| Phiên đã «thối rữa», agent đi vòng quanh | Ghi trạng thái vào file kế hoạch, bắt đầu phiên mới |
| Cần khảo sát code hoặc log dài | Giao việc khảo sát cho subagent |
Cách tiết kiệm cửa sổ ngữ cảnh
Tiết kiệm ngữ cảnh không phải là chuyện giá token, mà là chuyện chất lượng công việc. Càng ít nhiễu trong cửa sổ, càng nhiều chú ý dành cho nhiệm vụ và quy tắc.
1. File hướng dẫn ngắn đóng vai router
CLAUDE.md hoặc AGENTS.md ở gốc được đọc toàn bộ trong mỗi phiên. Một file dài 600 dòng tương đương khoảng 10–20 nghìn token phí cố định. Hãy giữ trong đó các lệnh kiểm tra, ràng buộc cứng và bản đồ dự án, còn chi tiết theo chủ đề để ở các tài liệu riêng, agent chỉ mở khi cần.
2. Kiến thức nạp theo yêu cầu
Skills trong Claude Code được thiết kế để ban đầu chỉ có phần mô tả ngắn của chúng vào ngữ cảnh, còn toàn văn hướng dẫn chỉ được nạp khi tác vụ cần skill đó. Đây là cách tiện để giữ các quy trình hiếm dùng — deploy, migration, phát hành — luôn sẵn sàng mà không phải trả giá cho chúng trong mỗi phiên.
3. Subagent cho công việc ồn ào
Subagent làm việc trong cửa sổ ngữ cảnh riêng và chỉ trả về phiên chính kết quả. Tìm kiếm trong code lớn, phân tích log dài, nghiên cứu một module lạ — tất cả có thể giao cho subagent và nhận lại vài đoạn kết luận thay vì hàng nghìn dòng đầu ra thô.
4. Đầu ra công cụ im lặng
Đầu ra của lệnh là kẻ ăn cửa sổ lớn nhất. Hãy cấu hình các lệnh kiểm tra sao cho khi thành công chỉ in một dòng, còn khi lỗi thì chỉ in phần cốt lõi: test bị lỗi và thông báo của nó, chứ không phải toàn bộ log build.
# ồn ào: hàng nghìn dòng vào cửa sổ cho mỗi lần chạy
pytest -v
# im lặng: khi thành công một dòng, khi lỗi chỉ các test hỏng
pytest -q --tb=short
# log — không lấy toàn bộ, chỉ phần cuối và các dòng lỗi
tail -n 50 app.log | grep -i error
5. Một nhiệm vụ — một phiên
Đừng kéo một phiên qua ba nhiệm vụ không liên quan. Lịch sử của nhiệm vụ đầu vô ích cho nhiệm vụ thứ ba, nhưng vẫn chiếm chỗ và làm agent rối. Xong việc — ghi nhận kết quả — mở phiên mới.
6. Trạng thái nằm trong file, không nằm trong lịch sử
Mọi thứ cần sống sót qua compaction và phiên mới đều nên được ghi vào repository: mục tiêu, các quyết định kèm lý do, các phương án đã bị loại, những gì đã làm và đã kiểm tra thế nào, bước tiếp theo. Ví dụ trong PLAN.md và PROGRESS.md. Khi đó phiên mới không bắt đầu bằng một bản kể lại, mà bằng một tài liệu chính xác, và bạn có thể yên tâm xóa lịch sử.
# PROGRESS.md
## Mục tiêu
Chuyển phép tính giảm giá sang đơn vị xu nguyên
## Đã làm (đã kiểm tra)
- app/payments/discount.py: float → int, make test xanh
- Đã thêm migration 041, đã áp dụng cục bộ
## Quyết định
- Làm tròn kiểu ngân hàng, như nhà cung cấp thanh toán
## Đã loại bỏ
- Decimal trong model: làm hỏng serialize của webhook
## Bước tiếp theo
Cập nhật kịch bản e2e đặt hàng và chạy make e2e
Quy tắc quan trọng không chỉ nằm trong cửa sổ
Ngay cả một ngữ cảnh được tổ chức hoàn hảo cũng không đảm bảo quy tắc được tuân thủ: văn bản trong cửa sổ là một ảnh hưởng lên mô hình, chứ không phải một lệnh cấm có thể thực thi. Nếu vi phạm là không thể chấp nhận, quy tắc phải được kiểm tra bằng máy. Trong Claude Code, để làm điều đó có hooks — lệnh chạy theo sự kiện của agent và có thể chặn hành động — và cấu hình quyền, cấm những công cụ hoặc lệnh nhất định. Linter, test và CI hoạt động độc lập với những gì đang diễn ra trong cửa sổ của agent.
Quy tắc tốt của harness: thứ gì kiểm tra tự động được thì kiểm tra tự động, còn trong ngữ cảnh chỉ giữ những gì đòi hỏi phán đoán.
Tổng kết
Cửa sổ ngữ cảnh của LLM là nơi duy nhất agent nhìn thấy nhiệm vụ của bạn, và nó đầy nhanh hơn bạn tưởng: hướng dẫn, lịch sử, file đã đọc và đầu ra lệnh tích lũy đến hết phiên. Chất lượng suy giảm từ rất lâu trước giới hạn kỹ thuật, quy tắc ở giữa ngữ cảnh dài bị lạc, còn compaction cứu chỗ bằng cái giá là chi tiết. Hãy giữ hướng dẫn ngắn, nạp kiến thức hiếm dùng khi cần, giao công việc ồn ào cho subagent, lưu trạng thái vào file, và củng cố quy tắc quan trọng bằng hooks và kiểm tra. Cách làm việc với ngữ cảnh của agent được chúng tôi trình bày thực hành trong khóa học về harness engineering.
Câu hỏi thường gặp
Cửa sổ ngữ cảnh của Claude có bao nhiêu token?
Phụ thuộc vào mô hình và gói dịch vụ, mốc phổ biến là khoảng 200 nghìn token, một số mô hình và cấu hình có thể lớn hơn. Hãy xem con số chính xác trong tài liệu của Anthropic cho đúng mô hình bạn dùng.
Cửa sổ lớn hơn có giải quyết được việc quên quy tắc không?
Chỉ một phần: chỗ nhiều hơn, nhưng hiệu ứng lost in the middle và context rot vẫn còn. Cửa sổ lớn không thay được hướng dẫn ngắn và phiên sạch.
Có nên nhắc lại quy tắc quan trọng trong tin nhắn khi agent vi phạm không?
Nhắc một lần thì có ích, vì văn bản mới ở cuối ngữ cảnh được mô hình nhìn rõ hơn. Nhưng nếu phải nhắc liên tục, hãy củng cố quy tắc bằng kiểm tra hoặc hook.
Làm sao biết cửa sổ ngữ cảnh của Claude Code đang bị chiếm bởi cái gì?
Lệnh /context cho biết system prompt, công cụ, file bộ nhớ và lịch sử tin nhắn chiếm bao nhiêu chỗ. Đây là cách nhanh để thấy CLAUDE.md phình to hay lịch sử dài đang ăn cửa sổ.
Khi compaction, điều gì mất đầu tiên?
Những thỏa thuận chỉ tồn tại trong hội thoại: các phương án đã bị loại, làm rõ yêu cầu, chi tiết nhỏ. Mọi thứ đã ghi trong file của repository thì agent có thể đọc lại.
Chủ đề này được giảng chi tiết kèm thực hành trong khóa học “Harness Engineering: инженерия надёжности AI-агентов”.
- Карта репозитория для AI-агента: структура проекта и состояние без памяти между сессиями
- AGENTS.md: почему большой файл инструкций не работает и как устроить роутер
- Память AI-агента между сессиями: session handoff, PROGRESS.md и bootstrap-контракт