Bóc tách cái mà LLM thực sự "nhìn thấy" trong mỗi turn — và cách điều khiển nó.
3 vai trò: System / User / Assistant — & nguyên lý "stateless"
Always / On-demand / Variable / Buffer — token economics
Birth → Grow → Compact → Death (autocompact)
Project rules · Skills · Workflows · Subagents · Hooks · Output styles
5 nguyên tắc, anti-patterns, cách debug
Mỗi lần gọi API, ta gửi toàn bộ context. Model không nhớ phiên trước — nhớ là việc của ta.
Định hình hành vi AI
Yêu cầu của con người
Phản hồi + tool calls
Mỗi turn nối tiếp nhau theo thứ tự thời gian. Toàn bộ chuỗi này gọi là context window.
"Tôi nói với ChatGPT/Claude tuần trước, chắc nó nhớ."
Nhiều bạn nghĩ model có "trí nhớ" liên phiên — như con người.
❌ Sai. Mỗi request API là độc lập. Model không có ổ đĩa lưu cuộc chat.
UI (ChatGPT, Claude.ai, Cursor…) gửi lại toàn bộ lịch sử mỗi turn.
Cảm giác "nhớ" = client side replay history vào prompt.
✅ Muốn agent "nhớ" xuyên phiên → ta phải persist ra ngoài (DB, file, vector store).
Hệ quả thiết kế: memory ngắn hạn = nằm trong context, memory dài hạn = ngoài context, ta tự load lại khi cần.
| Thành phần | Nhóm | Tokens (ví dụ) | % | Mô tả |
|---|---|---|---|---|
| ALWAYS INCLUDED — luôn nạp khi bắt đầu phiên | ||||
| System Prompt | ALWAYS | 3,200 | 1.6% | Hành vi, tone, safety rules, output format mặc định. |
| Tool Definitions | ALWAYS | 11,600 | 5.8% | Schema của tool nội tại: Read, Write, Edit, Bash, Grep, Glob… |
| Project Memory (CLAUDE.md / .cursorrules / GEMINI.md) | ALWAYS | 800 | 0.4% | Instruction project-level: build cmd, convention, kiến trúc. |
| ON-DEMAND — chỉ load khi cần / khi invoke | ||||
| MCP Tools | ON-DEMAND | 3,000 | 1.5% | Tool external qua MCP: GitHub, Slack, Postgres, … |
| Skills / Slash commands | ON-DEMAND | 1,200 | 0.6% | name + description load ngay, body chỉ load khi invoke (/commit, /review). |
| Subagents | ON-DEMAND | 800 | 0.4% | "Trợ lý phụ" với context riêng — chỉ thông tin tóm tắt trả về. |
| VARIABLE (per session) — tăng dần theo cuộc chat | ||||
| Messages history | VARIABLE | 16,000 | 8.0% | Lịch sử trao đổi (~15–20 turn cuối). |
| File contents | VARIABLE | 12,000 | 6.0% | File đã Read trong session (~5 file source). |
| Tool / Bash outputs | VARIABLE | 4,000 | 2.0% | Kết quả build, test, grep, … (rất ăn token). |
| Extended thinking | VARIABLE | 16,000 | 8.0% | Reasoning nội bộ (lên tới 32k với model có thinking budget). |
| BUFFER | ||||
| Free space | AVAILABLE | 88,400 | 44.2% | Phần trống còn lại để tiếp tục cuộc chat. |
| Autocompact buffer | RESERVED | 45,000 | 22.5% | Khi chạm ngưỡng → trigger nén lịch sử để tạo chỗ trống. |
System prompt + tool defs + project memory chiếm ~8%. Đây là chi phí "thuê chỗ" cố định mỗi turn.
Càng nhiều turn / file / bash output → càng phình. Đa số sự cố cost & latency đến từ đây.
Khi context dùng tới ~78%, model bắt đầu nén lịch sử cũ → có thể "ăn mất" thông tin quan trọng.
Load System prompt + Tool definitions + Project memory (CLAUDE.md / .cursorrules) + Skill names & descriptions. Context bắt đầu ở ~5–10%.
Mỗi turn nối thêm: user message → assistant message + (optional) tool calls + tool results. Mỗi Read file / Bash output có thể thêm hàng nghìn tokens.
Khi context dùng ~78%, hệ thống tự động nén: tool outputs cũ bị xoá, hội thoại được tóm tắt. Vẫn giữ system prompt + project memory.
Khi đóng session, toàn bộ context biến mất. Mọi thứ ta muốn nhớ phải đã được persist ra ngoài (file, DB, vector store, commit, …).
Trong agent dài hạn, compact & death là 2 sự kiện ta phải thiết kế xung quanh, không phải "tai nạn".
Khái niệm chung
Nó dùng để chứa gì?
Giữ ngắn (< 1k tokens lý tưởng) — nó nằm trong "always-in" nên mỗi byte = chi phí mỗi turn.
Các "tên gọi" khác nhau
Mẹo dùng tốt
Thư mục chứa hướng dẫn chi tiết cho 1 tác vụ (vd: /commit, /review, /debug).
Khi session start: chỉ tên + mô tả ngắn được load. Body chỉ vào context khi user gọi.
Lý tưởng cho task lặp lại có quy trình rõ.
"Trợ lý phụ" chạy trong context riêng. Có system prompt, tool allow-list, model riêng.
Agent chính chỉ thấy kết quả tóm tắt trả về — không bị ảnh hưởng bởi noise của subagent.
Lý tưởng cho search rộng, research, side-task lớn.
Tool external (GitHub, Slack, Postgres, Figma…) qua giao thức chuẩn JSON-RPC.
Khai báo trong settings.json. Schema tool load khi server kết nối — vẫn tốn context.
Bật/tắt theo nhu cầu để tránh "ngạt tool".
Nguyên tắc: chỉ load khi cần. 50 skills × 2k tokens body = 100k tokens — không bao giờ nhét tất cả vào always-in.
Workflow vs Skill
/commit, /review).Cấu trúc 4 phase điển hình
Đây là "khung xương" — bạn nhân lên / cắt bớt theo loại task (bug-fix, feature, refactor, doc…).
Một workflow gồm 3 cấu phần
"Khi user nói X → chạy workflow Y." Logic chọn workflow nào.
Mỗi phase = invoke một skill hoặc subagent. Có input/output rõ ràng.
Hook chặn nếu artifact yêu cầu chưa có. Vd: không qua Implement nếu chưa có plan file.
Skill = 1 hành động · Workflow = chuỗi nhiều skill + ràng buộc thứ tự + gate.
Routing (rule)
bug-fix-workflow (rule).
Phases (mỗi phase 1 skill / subagent)
Gates (hooks)
Lợi ích so với chat tự do
Định nghĩa
Các sự kiện điển hình
SessionStart — Khi mở session.UserPromptSubmit — Khi user gửi tin.PreToolUse — Trước khi model gọi tool.PostToolUse — Sau khi tool xong.Stop — Khi agent kết thúc.Hook = deterministic. LLM = probabilistic. Khi cần chắc chắn 100% → dùng hook.
Ví dụ thực tế
Khi nào dùng hook?
| Cơ chế | Sống bao lâu? | Tốn token? | Khi nào dùng |
|---|---|---|---|
| System prompt | Cả phiên | Mỗi turn | Định nghĩa vai trò và safety rules. |
| Project rules (CLAUDE.md / AGENTS.md / .cursorrules) | Cả phiên | Mỗi turn | Context không đổi theo project: convention, kiến trúc. |
| Skill / Slash command | Một phần phiên (khi invoke) | On-demand | Một tác vụ cohesive (1 lệnh = 1 action). Vd: /commit. |
| Workflow | Một phần phiên (chuỗi) | On-demand | Chuỗi nhiều skill/subagent với phase & gate. Vd: bug-fix, feature. |
| Subagent | 1 task | Context riêng | Task lớn / search rộng → tránh làm phình agent chính. |
| Hook | Trigger theo sự kiện | 0 (chạy ngoài LLM) | Cần chắc chắn & deterministic. |
| Output style | Cả phiên | Mỗi turn | Đổi tone / format trả lời (vd: terse, teacher, JSON). |
| Memory layer (vector DB, file) | Liên phiên | Khi load lại | Cá nhân hoá & học liên phiên (sẽ học ở S-09). |
Câu hỏi vàng khi thiết kế agent: "Thông tin này luôn cần, hay chỉ khi user hỏi?" — Quyết định nó nằm ở always-in hay on-demand.
Cấu trúc điển hình
Trade-off khi tổ chức
rules/ để load có chọn lọc.Layout này giống nhau (về ý) cho Claude Code, Cursor, Gemini CLI — chỉ khác tên thư mục.
Context ngắn + đúng > context dài. Mỗi token thêm vào phải trả lời câu hỏi cụ thể.
Bullet, table, JSON, code block dễ scan hơn paragraph. Model "đọc" cấu trúc tốt hơn.
Đặt thông tin quan trọng & mới ở cuối context. Model attend mạnh nhất ở đầu & cuối.
Tool output thô = noise. Lọc, tóm tắt trước khi đưa vào next turn. Subagent là vũ khí mạnh.
Cái gì cần xuyên session → ghi ra file / DB / vector store. Đừng tin vào memory của LLM.
Log context thực gửi đi → nhìn xem có rác gì, có lặp gì → tối ưu dần.
"CLAUDE.md 5,000 dòng" — nhét toàn bộ wiki vào → bloat 30%+ context mỗi turn, cost & latency tăng.
"Bật hết MCP servers" — 20 servers × 50 tools = ngạt schema, model bối rối chọn tool.
"Read cả thư mục để chắc" — đưa 100 files vào context khi chỉ cần grep tên hàm.
"Một mega-prompt" — yêu cầu plan + code + test + commit trong 1 prompt — error propagation.
"Tin model tự nhớ" — không persist ra file → mất sau autocompact.
CLAUDE.md < 1k tokens. Chi tiết → tách rule path-scoped hoặc skill.
MCP bật theo nhu cầu task. Có thể có config preset (dev / debug / docs).
Dùng Grep / Glob tìm trước, Read đúng file cần. Limit lines khi file lớn.
Chia chain of prompt hoặc chain of subagent — sẽ học chi tiết ở S-05.
Cuối phiên → commit code, cập nhật CLAUDE.md, ghi note ra file.
Lệnh / công cụ có sẵn
/context — Claude Code: xem token usage theo từng nhóm./compact — chủ động nén lịch sử khi đầy./clear — reset hoàn toàn (giữ project memory).Checklist khi agent "ngớ ngẩn"
LLM API là stateless. Mỗi turn = gửi lại toàn bộ context. Cảm giác "nhớ" là do client replay.
Context window có 4 nhóm: ALWAYS · ON-DEMAND · VARIABLE · BUFFER. Hiểu nhóm = quyết được cost & reliability.
Vòng đời: Birth → Grow → Compact → Death. Phải thiết kế xung quanh compact & death, không coi là tai nạn.
Đặt thông tin đúng chỗ: Project memory (always) · Skill (1 action) · Workflow (chuỗi nhiều bước + gate) · Subagent (context riêng) · Hook (ngoài LLM).
Context engineering = Relevance > Volume, structured, fresh-at-bottom, compress, persist outside. Quan sát & lặp.
CLAUDE.md (hoặc .cursorrules) cho 1 repo, < 60 dòng./commit chuẩn hoá commit message./context trước & sau khi mở file lớn — đo chênh lệch token.Buổi 3 — Kiến trúc AI Agent
7 thành phần. So sánh Claude Code · Cursor · OpenAI Assistant · Gemini CLI.