Context engineering là kỹ năng quyết định cái gì nằm trong cửa sổ ngữ cảnh của agent tại mỗi thời điểm - chọn ra tập token ít nhất nhưng “tín hiệu cao” nhất để tối đa khả năng model làm đúng việc. Prompt engineering là viết và tổ chức chỉ dẫn; context engineering rộng hơn - nó bao trùm cả chỉ dẫn, tool, ví dụ, và toàn bộ những gì tích luỹ trong một phiên làm việc dài. Khi làm việc với agent chạy nhiều bước, đây là kỹ năng quan trọng hơn hẳn việc chỉ viết prompt cho khéo.
Lý do: ngữ cảnh là tài nguyên hữu hạn và cạnh tranh. Mọi thứ đều tranh nhau cùng một không gian - chỉ dẫn hệ thống, CLAUDE.md, mô tả tool, nội dung file đã đọc, output lệnh, lịch sử hội thoại. Và chất lượng model giảm khi ngữ cảnh đầy lên, kể cả với cửa sổ 1M token - hiện tượng giới nghiên cứu gọi là “context rot”: căn nguyên nằm ở kiến trúc transformer, nơi mỗi token phải chú ý (attention) tới mọi token khác, nên số quan hệ cần theo dõi tăng theo bình phương độ dài chuỗi; model cũng đơn giản là được huấn luyện với ít ví dụ ngữ cảnh cực dài hơn ví dụ ngắn.
Bốn thao tác cơ bản
Phần tiêu đề “Bốn thao tác cơ bản”Mọi kỹ thuật context engineering đều là một trong bốn thao tác này:
| Thao tác | Làm gì | Ví dụ trong Claude Code |
|---|---|---|
| Nạp có chọn lọc (select) | Chỉ đưa vào cái đang cần | @file cụ thể thay vì để agent đọc cả thư mục; rule theo paths |
| Nén (compress) | Thay nội dung dài bằng bản tóm tắt | /compact, auto-compaction |
| Cắt bỏ (prune / clear) | Xoá hẳn phần không còn liên quan | /clear, context editing (xoá tool result cũ ở tầng API) |
| Đẩy ra ngoài (offload) | Để phần việc ngốn ngữ cảnh diễn ra ở nơi khác | Subagent, file trên đĩa, auto memory |
Nắm bốn thao tác này thì mọi tính năng liên quan trở nên hiển nhiên: /clear là prune, /compact là compress, subagent là offload, .claude/rules/ với paths là select.
Tìm đúng “độ cao” cho chỉ dẫn và tool
Phần tiêu đề “Tìm đúng “độ cao” cho chỉ dẫn và tool”Nguyên tắc “tập token ít nhất nhưng tín hiệu cao nhất” áp dụng trực tiếp lên hai thứ bạn viết tay mỗi ngày: chỉ dẫn hệ thống (system prompt, CLAUDE.md) và định nghĩa tool.
Chỉ dẫn cần đúng “độ cao” - nằm giữa hai thái cực đều dở. Một đầu là cứng nhắc hoá mọi trường hợp bằng logic if-else chi tiết: dễ vỡ khi gặp tình huống chưa lường trước, và càng lúc càng khó bảo trì. Đầu kia là chỉ dẫn chung chung, “hãy viết code tốt”, không cho model tín hiệu cụ thể nào để bám vào. Điểm cân bằng là viết đủ rõ để định hướng hành vi, nhưng đủ linh hoạt để đóng vai trò nguyên tắc suy luận (heuristic) chứ không phải kịch bản cứng - tin tưởng khả năng suy luận của model để nó tự xử lý các biến thể, thay vì cố liệt kê hết mọi biến thể.
Tool cần rõ ràng, ít chồng lấn, và tiết kiệm token. Một tool tốt tự thân đầy đủ, chịu được lỗi đầu vào, và có mục đích sử dụng không mập mờ. Dấu hiệu thiết kế tool kém: nếu chính bạn - một kỹ sư - không thể nói chắc trong tình huống này nên dùng tool nào, thì đừng kỳ vọng agent làm tốt hơn. Bộ tool phình to, chức năng chồng chéo buộc model phải đoán, dẫn tới gọi sai tool hoặc gọi thừa. Kết quả trả về từ tool cũng nên súc tích - tool trả về JSON dài dằng dặc trong khi agent chỉ cần vài trường là đang lãng phí ngữ cảnh ở mọi lần gọi.
Ví dụ mẫu (few-shot) vẫn hữu ích - nhưng đừng liệt kê hết mọi trường hợp biên. Cho model vài ví dụ minh hoạ hành vi mong muốn vẫn là một best practice đáng tin cậy. Nhưng đừng biến prompt thành một danh sách dài dằng dặc mọi edge case bạn nghĩ ra được - hãy chọn lọc một bộ ví dụ đa dạng và tiêu biểu, phản ánh đúng hành vi kỳ vọng. Với model, một ví dụ tốt đáng giá cả nghìn dòng chỉ dẫn.
Vì sao “cửa sổ 1M token” không giải quyết được vấn đề
Phần tiêu đề “Vì sao “cửa sổ 1M token” không giải quyết được vấn đề”Ba lý do:
- Chất lượng suy giảm theo độ đầy, không theo giới hạn. Ngữ cảnh 400K token đầy nội dung ít liên quan cho kết quả tệ hơn 40K token đúng trọng tâm - dù cả hai đều còn dư chỗ.
- Nhiễu cạnh tranh với tín hiệu. Mười hướng tiếp cận thất bại trong lịch sử hội thoại khiến model có xu hướng thử lại chúng.
- Chi phí và độ trễ tuyến tính theo ngữ cảnh. Mỗi lượt gửi lại toàn bộ ngữ cảnh. Ngữ cảnh gấp 10 lần → chi phí input gấp 10 lần mỗi lượt (trừ phần được cache).
Các pattern thực dụng
Phần tiêu đề “Các pattern thực dụng”Nạp tức thời (just-in-time) thay vì nạp trước toàn bộ
Phần tiêu đề “Nạp tức thời (just-in-time) thay vì nạp trước toàn bộ”Cách cũ để cho agent “biết” một khối dữ liệu lớn là nhồi sẵn hết vào ngữ cảnh trước khi nó bắt đầu làm việc. Cách hiệu quả hơn - và là cách Claude Code vận hành - là chỉ giữ những định danh nhẹ: đường dẫn file, câu truy vấn đã lưu, đường link - rồi để agent tự nạp đúng phần nó cần, đúng lúc cần, bằng tool.
Claude Code là ví dụ điển hình: model có thể viết truy vấn nhắm đúng mục tiêu, lưu kết quả trung gian ra file, và dùng các lệnh Bash như head/tail/grep để rà một khối dữ liệu khổng lồ mà không bao giờ phải nạp trọn khối dữ liệu đó vào ngữ cảnh. Đây cũng chính là cách con người xử lý thông tin quá tải - dùng hệ thống lưu trữ, đặt tên file có quy ước, bookmark - thay vì cố nhớ hết mọi thứ. Cấu trúc thư mục, quy ước đặt tên, và timestamp bản thân chúng đã là tín hiệu hữu ích, giúp agent biết khi nào và cách nào nên lấy thêm thông tin mà không cần ai đó nạp sẵn toàn bộ cho nó.
Offload sang subagent
Phần tiêu đề “Offload sang subagent”Pattern có đòn bẩy cao nhất. Việc khám phá codebase đọc rất nhiều file - nhưng bạn chỉ cần kết luận, không cần nội dung file.
Dùng subagent để tìm hiểu hệ thống auth xử lý refresh token thế nào,và xem đã có utility OAuth nào tái dùng được chưa.Subagent đọc 30 file trong ngữ cảnh riêng của nó, rồi trả về 20 dòng tóm tắt. Ngữ cảnh chính chỉ nhận 20 dòng đó. Đây không phải chuyện lý thuyết: một subagent tìm hiểu sâu có thể tiêu tốn hàng chục nghìn token bên trong ngữ cảnh riêng của nó, nhưng chỉ trả về chừng 1.000–2.000 token tóm tắt cho agent điều phối. Ranh giới trách nhiệm nhờ vậy rất rõ - phần “tìm” ở lại trong subagent, agent chính chỉ lo phần “tổng hợp và quyết định”. Với các tác vụ nghiên cứu phức tạp, kiến trúc nhiều subagent làm việc song song từng cho kết quả tốt hơn hẳn một agent đơn độc xử lý tuần tự.
Offload sang đĩa
Phần tiêu đề “Offload sang đĩa”Ngữ cảnh không mang được qua phiên; file thì có. Đây là nền tảng của quy trình nhiều phiên:
Phiên 1: khám phá → viết SPEC.md → /clearPhiên 2: đọc SPEC.md → triển khai → /clearPhiên 3: đọc SPEC.md + diff → reviewMỗi phiên có ngữ cảnh sạch. Xem thêm Artifact.
Ghi chú có cấu trúc (structured note-taking)
Phần tiêu đề “Ghi chú có cấu trúc (structured note-taking)”Ngoài việc offload sang file spec, agent còn có thể tự ghi chú lại tiến độ để “nhớ” xuyên suốt một tác vụ dài, kể cả sau khi ngữ cảnh bị nén hoặc reset. Ví dụ quen thuộc nhất là danh sách việc cần làm (to-do list) mà Claude Code tự duy trì khi xử lý một tác vụ nhiều bước: nó không cần giữ toàn bộ suy luận trong ngữ cảnh, chỉ cần đọc lại danh sách đó để biết đang ở bước nào, việc gì đã xong.
Ý tưởng này đi xa hơn nữa với các agent chạy rất lâu, không có ranh giới “hết một tác vụ” rõ ràng - chẳng hạn một agent chơi game hàng nghìn bước, phải tự ghi lại tiến độ (“đã luyện quái ở khu vực này bao nhiêu bước, đạt cấp độ bao nhiêu”), tự vẽ bản đồ, tự nhớ mục tiêu đã hoàn thành - toàn bộ nằm trong file ghi chú ngoài ngữ cảnh, được đọc lại khi cần chứ không phải giữ mãi trong bộ nhớ tức thời. Đây cũng là nguyên lý đứng sau auto memory: agent xây dựng kho kiến thức tích luỹ theo thời gian, giữ trạng thái dự án xuyên suốt nhiều phiên, và tham chiếu lại việc cũ mà không cần giữ mọi thứ trong ngữ cảnh hiện tại.
Trên Claude Developer Platform, Anthropic cũng cung cấp một memory tool (public beta) giúp agent lưu và tra cứu thông tin ngoài cửa sổ ngữ cảnh qua một hệ thống dựa trên file - cho phép agent xây kho kiến thức theo thời gian, giữ trạng thái dự án xuyên phiên, và tham chiếu việc cũ mà không cần nạp lại tất cả vào ngữ cảnh. Đây là hạ tầng chung đứng sau ý tưởng ghi chú có cấu trúc, tương tự cách auto memory của Claude Code vận hành.
Nạp theo điều kiện (progressive disclosure)
Phần tiêu đề “Nạp theo điều kiện (progressive disclosure)”Đừng nạp mọi chỉ dẫn cho mọi phiên. Ba tầng:
| Tầng | Nạp khi nào | Dùng cho |
|---|---|---|
CLAUDE.md | Mọi phiên | Sự thật cần có ở mọi lượt: lệnh build, quy ước, kiến trúc |
.claude/rules/ có paths | Khi Claude đọc file khớp pattern | Quy tắc riêng cho một phần codebase |
| Skill | Khi được gọi, hoặc khi Claude thấy liên quan | Quy trình nhiều bước, kiến thức domain hẹp |
Một CLAUDE.md 500 dòng và một hệ ba tầng chứa cùng lượng thông tin - nhưng hệ ba tầng chỉ nạp ~80 dòng vào mỗi phiên.
Nén có chủ đích (compaction)
Phần tiêu đề “Nén có chủ đích (compaction)”/compact không chỉ là “tóm tắt cho ngắn lại” - nó gửi toàn bộ lịch sử tin nhắn cho model, yêu cầu giữ lại quyết định kiến trúc, bug chưa xử lý, và các chi tiết triển khai quan trọng, đồng thời loại bỏ output tool đã dùng xong (đọc file, kết quả lệnh cũ…) vì agent không cần nhìn lại chúng nữa. Phiên tiếp tục với bản ngữ cảnh đã nén, cộng thêm nội dung của vài file được truy cập gần nhất.
Khi tinh chỉnh việc nén - hoặc tự thiết kế chiến lược nén riêng - nên đi theo hai bước: trước tiên tối đa hoá độ nhớ đủ (không bỏ sót chi tiết quan trọng), sau đó mới tối ưu độ súc tích (cắt bớt phần thừa). Một cách nén “nhẹ tay” nhất, ít rủi ro mất thông tin nhất, là chỉ xoá riêng phần kết quả thô của các lệnh tool đã dùng xong (tool result clearing) mà giữ nguyên phần còn lại của hội thoại - vì agent hiếm khi cần đọc lại y nguyên output cũ, chỉ cần biết kết luận rút ra từ nó.
Reset thay vì sửa
Phần tiêu đề “Reset thay vì sửa”Nếu bạn đã sửa agent hơn hai lần về cùng một vấn đề, ngữ cảnh đang đầy các hướng thất bại. /clear và viết lại prompt ban đầu tốt hơn, có gộp những gì vừa học. Một phiên sạch với prompt tốt gần như luôn thắng một phiên dài đầy các lần sửa.
Giữ prefix ổn định
Phần tiêu đề “Giữ prefix ổn định”Prompt caching là so khớp tiền tố - đổi một byte ở đầu làm mất cache của toàn bộ phần sau. Vì vậy: đừng nhét timestamp vào system prompt, đừng đổi bộ tool giữa phiên, đừng đổi model giữa phiên. Xem Prompt caching.
Chống mẫu (anti-pattern)
Phần tiêu đề “Chống mẫu (anti-pattern)”- Phiên “bồn rửa bát” - nhiều việc không liên quan trong một phiên. →
/cleargiữa các tác vụ. - Khám phá vô tận - “hãy điều tra X” không khoanh phạm vi; agent đọc hàng trăm file. → khoanh hẹp, hoặc dùng subagent.
CLAUDE.mdphình to - nhồi mọi thứ vào file nạp mọi phiên. → tách sang rule theopathsvà skill.- Nén quá sớm -
/compactkhi ngữ cảnh mới 30% đầy làm mất chi tiết chưa cần mất. → chỉ nén khi thực sự cần. - Đọc lại thứ vừa đọc - file đã trong ngữ cảnh thì đọc lại chỉ nhân đôi chi phí, không thêm thông tin.
Đọc thêm
Phần tiêu đề “Đọc thêm”- Cửa sổ ngữ cảnh - cái gì chiếm ngữ cảnh, và bao nhiêu.
- Prompt caching - vì sao giữ prefix ổn định lại quan trọng.
- Subagent - cơ chế offload chính.
- Best practices - các lệnh cụ thể trong thực tế.
lượt xem