Learn > Claude > Claude Code: context management & CLAUDE.md

Claude Code: context management & CLAUDE.md

Quản lý context trong Claude Code: lệnh /init, nhắc file bằng @, và cách viết CLAUDE.md để Claude thực sự tuân theo — phrasing, @import, thứ tự ưu tiên.

  • Context management là kỹ năng cốt lõi: project có hàng trăm file nhưng quá nhiều context không liên quan lại LÀM GIẢM hiệu năng Claude — phải dẫn nó tới đúng file. Chạy /init để Claude phân tích codebase và sinh CLAUDE.md (mục đích, kiến trúc, lệnh & file trọng yếu, coding patterns).
  • CLAUDE.md được nhét vào MỌI request → như system prompt bền vững cho project; 4 vị trí stack chồng, load cùng lúc lúc launch, không cái nào bị bỏ: Managed policy (cấp tổ chức, không loại được) → User (~/.claude/CLAUDE.md, mọi project) → Project (CLAUDE.md, commit chia sẻ team) → Local (CLAUDE.local.md, cá nhân, git bỏ qua). Sửa qua /memory hoặc edit tay; nhắc file bằng @path để tự chèn nội dung file vào request.
  • Viết CLAUDE.md để Claude THỰC SỰ theo: nó là guidance chứ không phải config bị ép — mỗi dòng cạnh tranh sự chú ý, file càng dài Claude càng bỏ qua bớt → giữ LEAN. Luật cứng chết người (VD never push to main) đừng để trong CLAUDE.md, đẩy sang PreToolUse hook để CHẶN thật. @import chỉ để tổ chức file (bung inline lúc launch, KHÔNG giảm context). Phrasing quyết định luật có "dính": cụ thể + kiểm được (không "follow best practices"), gọi tên cái thay thế (không chỉ cấm), và emphasis là NGÂN SÁCH — chỉ IN HOA cho 2–3 luật đau nhất. Coi file như production code: dòng nào không biện minh được thì xoá.

TL;DR — Project có hàng trăm file nhưng context window có hạn — context management là kỹ năng cốt lõi. /init sinh CLAUDE.md, file được nhét vào mọi request như system prompt bền vững; @ nhắc đúng file cần. Nhưng CLAUDE.md là guidance chứ không phải config bị cưỡng chế: càng dài Claude càng bỏ qua, nên luật nào cần bảo đảm thì đẩy sang hook.

Phần 1/7 của ghi chú khoá Claude Code in Action — đề thi thử 219 câu (chấm điểm + giải thích) nằm ở tab "Đề thi thử" trên trang tổng quan.

Context management — cho Claude đúng thứ nó cần

Một project có thể có hàng chục đến hàng trăm file, nhưng Claude chỉ cần đúng phần thông tin liên quan. Điểm phản trực giác: quá nhiều context không liên quan thực ra làm giảm hiệu năng của Claude. Vì vậy, biết cách dẫn Claude tới đúng file & tài liệu là kỹ năng cốt lõi — và đó là chỗ CLAUDE.md cùng cú pháp @ phát huy tác dụng.

Lệnh /init — sinh CLAUDE.md tự động

Khi mới mở Claude trong một project, chạy /init. Claude sẽ phân tích toàn bộ codebase để hiểu:

  • Mục đích & kiến trúc của project.
  • Các lệnh quan trọngfile trọng yếu (critical files).
  • Coding patterns và cấu trúc.

Xong, Claude viết một summary và ghi vào file CLAUDE.md. Khi Claude xin quyền tạo file, có 2 lựa chọn: Enter để duyệt từng thao tác ghi, hoặc Shift+Tab để cho Claude tự ghi file thoải mái suốt session (chế độ auto-accept).

CLAUDE.md — "system prompt" bền vững cho project

File CLAUDE.mdhai mục đích:

  1. Dẫn đường Claude qua codebase — chỉ ra lệnh quan trọng, kiến trúc, coding style.
  2. Đưa chỉ thị riêng/tùy biến cho Claude.

Mấu chốt: file này được nhét vào MỌI request — nên nó hoạt động như một system prompt bền vững cho riêng project này.

Claude nhận biết 4 vị trí CLAUDE.mdload cùng lúc lúc launch, STACK chồng lên nhau, không cái nào bị bỏ:

Tầng File / phạm vi Chia sẻ với team?
Managed policy File cấp tổ chức, platform team quản — bạn không loại được nên org policy luôn có hiệu lực (do tổ chức áp)
User ~/.claude/CLAUDE.md — preference cá nhân, theo bạn qua mọi project trên máy (máy cá nhân)
Project CLAUDE.md — sinh bởi /init, commit vào source control ✅ Có — luật chung cả team
Local CLAUDE.local.md — ghi chú cá nhân chỉ cho repo này, git bỏ qua ❌ Không commit

Local dễ bị bỏ quên nhưng rất tiện: đang refactor ở branch riêng và muốn Claude giữ vài quyết định kiến trúc trong đầu suốt lúc làm — thứ đó không thuộc file Project (sẽ ảnh hưởng cả team). Nhét vào Local, chỉ của riêng bạn cho repo này.

Thêm chỉ thị tùy biến + lệnh /memory

Muốn đổi cách Claude hành xử thì thêm chỉ thị vào CLAUDE.md. Ví dụ Claude comment quá nhiều → sửa file. Hai cách: edit CLAUDE.md trực tiếp trong editor, hoặc chạy /memory trong Claude Code để mở file ra sửa. Thêm một dòng như:

Use comments sparingly. Only comment complex code

Claude đọc file này đầu mỗi conversation, nên thay đổi có hiệu lực từ message kế tiếp.

⚠️ Freshness: video khoá học còn cho thấy shortcut cũ # ("memory mode") để ghi nhanh vào CLAUDE.md — shortcut này đã bị gỡ. Hiện tại dùng /memory hoặc sửa CLAUDE.md tay. (Claude Code đổi nhanh; đây là chỗ tài liệu cũ hay sai.)

Nhắc file bằng @

Khi cần Claude nhìn đúng một file, dùng @ + đường dẫn — nó tự chèn nội dung file đó vào request. Ví dụ hỏi về hệ thống auth:

How does the auth system work? @auth

Claude sẽ hiện danh sách file liên quan (auth-*) để chọn, rồi đưa file được chọn vào hội thoại.

Nhắc file ngay trong CLAUDE.md

Cũng dùng @ ngay trong CLAUDE.md để trỏ tới file luôn-liên-quan với nhiều phần của project. Ví dụ với file schema DB:

The database schema is defined in the @prisma/schema.prisma file.
Reference it anytime you need to understand the structure of data stored in the database.

Khi nhắc kiểu này, nội dung file tự vào mọi request → Claude trả lời về cấu trúc dữ liệu ngay, khỏi phải search + đọc lại schema mỗi lần.

Mẹo tương thích: repo đã có sẵn AGENTS.md (cho tool khác) thì không cần chép lại — đặt @AGENTS.mddòng đầu CLAUDE.md, Claude load nội dung đó trước, rồi viết chỉ thị riêng cho Claude bên dưới.

Áp dụng thực tế: chính CLAUDE.md của repo này (nguyenchau.dev) là ví dụ sống của bài — nó tự nhận là "điểm vào tin cậy" rồi trỏ sang các doc con (docs/learn.md, SEO.md) thay vì nhồi tất cả vào một file. Đó cũng là cách tôi quản context budget: CLAUDE.md + mọi @import đi vào mọi request nên tốn token mỗi lượt — tôi chỉ @ những file cross-cutting thật sự (schema DB, coding rule dùng khắp nơi), không import bừa file to. Về mặt Delivery, cặp CLAUDE.md (commit, luật chung) vs CLAUDE.local.md (cá nhân, không commit) đúng bằng ranh giới tôi vẫn kẻ giữa "chuẩn team""sở thích từng dev" — để không ai đẩy preference riêng vào luật chung của repo.

Viết CLAUDE.md để Claude THỰC SỰ theo

Có một cái bẫy bắt gần như tất cả mọi người: CLAUDE.md cứ phình to dần. Gặp vấn đề → thêm một luật. Gặp vấn đề nữa → thêm luật nữa. Chẳng mấy chốc thành một file khổng lồ, và Claude bắt đầu bỏ qua một phần của nó. Đây không phải bug — đó là cách file này hoạt động.

Điểm cốt tử: CLAUDE.md không phải configuration bị ép buộc — nó là guidance (lời hướng dẫn). Mỗi dòng cạnh tranh sự chú ý với mọi dòng khác. File càng dài, nó càng tự cạnh tranh với chính nó, và Claude càng theo kém tin cậy hơn bất kỳ luật đơn lẻ nào. ⇒ Mục tiêu không phải "ghi cho đủ mọi thứ" mà là giữ file LEAN. File càng gọn, Claude càng theo được nhiều.

Bước 0 — hỏi: luật này có thuộc CLAUDE.md không?

Trước khi viết một luật, hỏi xem nó có nên nằm trong CLAUDE.md hay không. Có hai loại việc khác nhau:

  • Guidance (convention mềm) — quy ước, phong cách. Đặt trong CLAUDE.md là hợp.
  • Hard line (lằn ranh cứng, không được vượt) — VD "never push to main". Nếu để trong CLAUDE.md, bạn chỉ đang hy vọng Claude đọc và tôn trọng. Phần lớn thời gian nó sẽ nghe — nhưng "phần lớn thời gian" không đủ cho thứ nguy hiểm.

Luật cứng như vậy thuộc về một pre-tool-use hook. Hook là code chạy TRƯỚC khi Claude hành độngchặn được hành động đó — nên kể cả khi Claude định push main, hook vẫn chặn cứng. Đó là enforcement thật, không phải một lời đề nghị lịch sự. Đẩy hard rule sang hook, để CLAUDE.md lo phần convention mềm.

Tách file to bằng import — nhưng biết rõ nó mua gì cho bạn

Khi file Project dài ra, tách nhỏ bằng cú pháp import path-to-file, thay một bức tường chữ bằng con trỏ tới file khác:

@.claude/conventions/code-style.md
@.claude/conventions/testing.md
@.claude/conventions/workflow.md

Tốt cho việc tổ chức. Nhưng ⚠️ hiểu đúng nó mua gì: lúc Claude launch, các file import được bung inline ngay tại chỗ tham chiếu. Nghĩa là mọi thứ vẫn load hết ở đầuimport KHÔNG giảm lượng context Claude phải đọc. Dùng import để tổ chức, không phải để thu nhỏ tải.

Phrasing — cách viết mới là thứ làm luật "dính"

Khi đã chốt một luật thuộc CLAUDE.md, việc Claude có thật sự tuân hay không phụ thuộc cách bạn diễn đạt. Đa số luật thất bại vì mơ hồ. Ba nguyên tắc:

1. Cụ thể + kiểm được (specific and checkable). Nếu chính bạn không kiểm được luật có được tuân hay không thì Claude cũng vậy.

  • ❌ Mơ hồ: "Follow best practices for API routes."
  • ✅ Cụ thể: "Put new API routes in src/api/handlers, one per file." — nhìn kết quả là biết ngay đúng/sai.

2. Gọi tên cái thay thế, đừng chỉ cấm (name the replacement). Cấm mà không nói làm gì thay là để ngỏ cửa.

  • ❌ Để ngỏ: "Don't use default exports." Rồi thì dùng gì?
  • ✅ Đóng lại: "Use named exports, not default exports."

3. Emphasis là một NGÂN SÁCH (emphasis is a budget). Chữ như "IMPORTANT", "YOU MUST" nâng ưu tiên một luật — nhưng chỉ tương đối so với những dòng im lặng quanh nó. Nếu mọi luật đều hét thì không luật nào nổi bật, và emphasis mất nghĩa. Xài emphasis như tiêu tiền: dồn cho 2–3 luật đau nhất khi bị phá, để phần còn lại ở âm lượng bình thường.

Giữ file "under revision" — như production code

CLAUDE.md không bao giờ xong — coi nó như code sống, liên tục được sửa. Khi Claude làm sai, đừng thở dài rồi sửa tay: coi đó là một bug report với chính CLAUDE.md. Bạn thậm chí bảo thẳng Claude "add that to the CLAUDE.md file" — nó tự viết luật cho bạn. Nhờ vậy mỗi lần có gì sai, file lại tốt lên. Nguyên tắc chốt: dòng nào không biện minh được thì XOÁ.

Áp dụng thực tế: chính CLAUDE.md của repo này là ca thú vị để tự soi. Nó lean sẵn và né được bẫy @import: thay vì import mọi doc (bung inline, tốn token mỗi request), nó trỏ prose "đọc khi cần" sang docs/learn.md, SEO.md… — tức lazy-load, Claude chỉ mở doc khi task chạm tới. Đây là điểm tôi thấy nhiều người làm ngược: nhồi hết vào một file khổng lồ rồi than Claude bỏ qua luật. Chỗ tôi tự bắt lỗi mình nhất là emphasis budget: khi gần như dòng nào cũng "TUYỆT ĐỐI / KHÔNG / BẮT BUỘC" thì đúng như bài nói — không dòng nào còn nổi. Cách chữa của tôi: chỉ giữ IN HOA cho 2–3 luật mà phá là hỏng nặng và khó cứu (VD gate build trước khi deploy), hạ phần còn lại về giọng thường. Và luật thật sự chết người thì tôi không tin vào chữ nghĩa — đẩy sang cơ chế chặn cứng (một pre-push hook chạy validator, hay .gitignore cho thứ không được commit) đúng tinh thần "hard rule → hook": enforcement thật, không phụ thuộc ai đó có nhớ hay không.


Phần tiếp theo: Claude Code: Planning Mode, /compact & rewind

Nguồn: Claude Code in Action (Anthropic Academy) — Copyright Anthropic. Phần đề thi thử cho khoá này nằm ở tab "Đề thi thử" trên trang tổng quan khoá.

Câu hỏi thường gặp

Lệnh /init trong Claude Code làm gì?
Chạy /init khi mới mở project để Claude phân tích toàn bộ codebase — hiểu mục đích & kiến trúc, các lệnh quan trọng và file trọng yếu, coding patterns — rồi viết một bản summary vào file CLAUDE.md. Khi Claude xin quyền tạo file, nhấn Enter để duyệt từng thao tác ghi, hoặc Shift+Tab để cho Claude tự ghi file thoải mái suốt session (auto-accept).
File CLAUDE.md dùng để làm gì và có mấy loại?
CLAUDE.md có hai mục đích: dẫn đường Claude qua codebase (lệnh, kiến trúc, coding style) và cho bạn đưa chỉ thị tùy biến. Nó được nhét vào MỌI request nên hoạt động như một system prompt bền vững cho project. Có 4 vị trí, load cùng lúc lúc launch và STACK chồng lên nhau (không cái nào bị bỏ): Managed policy (file cấp tổ chức do platform team quản, bạn không loại được nên org policy luôn có hiệu lực), User (~/.claude/CLAUDE.md, theo bạn qua mọi project trên máy), Project (CLAUDE.md sinh bởi /init, commit vào source control, chia sẻ cả team), và Local (CLAUDE.local.md, git bỏ qua — ghi chú cá nhân chỉ cho repo này, VD giữ vài quyết định kiến trúc khi refactor ở branch riêng mà không muốn ảnh hưởng cả team). Sửa bằng cách edit file trực tiếp hoặc chạy /memory — lưu ý shortcut cũ "#" (memory mode) đã bị gỡ.
Nhắc file bằng @ trong Claude Code hoạt động thế nào?
Gõ @ kèm đường dẫn để tự động chèn nội dung file đó vào request, ví dụ "How does the auth system work? @auth" — Claude hiện danh sách file liên quan để chọn rồi đưa vào hội thoại. Dùng chính cú pháp @ ngay trong CLAUDE.md để trỏ tới file luôn-liên-quan (VD @prisma/schema.prisma): nội dung file sẽ tự vào mọi request nên Claude trả lời ngay mà không phải search + đọc lại mỗi lần. Nếu repo đã có AGENTS.md cho tool khác, đặt @AGENTS.md ở dòng đầu CLAUDE.md để nạp lại, khỏi chép trùng.
Vì sao CLAUDE.md càng dài thì Claude càng bỏ qua luật?
Vì CLAUDE.md là guidance (lời hướng dẫn) chứ không phải configuration bị ép buộc — mỗi dòng cạnh tranh sự chú ý với mọi dòng khác. File càng dài, nó càng tự cạnh tranh với chính nó, và Claude theo kém tin cậy hơn bất kỳ luật đơn lẻ nào. Đây không phải bug mà là cách file hoạt động. Hệ quả: mục tiêu không phải ghi cho đủ mọi thứ, mà giữ file LEAN — file càng gọn Claude càng theo được nhiều. Nếu một dòng không biện minh được, xoá nó đi (coi file như production code).
Khi nào nên để một luật trong CLAUDE.md, khi nào đẩy sang hook?
Convention mềm (quy ước, phong cách) thì đặt trong CLAUDE.md là hợp. Nhưng hard line chết người — ví dụ "never push to main" — đừng để trong CLAUDE.md, vì ở đó bạn chỉ HY VỌNG Claude đọc và tôn trọng; phần lớn thời gian nó nghe, nhưng "phần lớn thời gian" không đủ cho thứ nguy hiểm. Luật cứng thuộc về một pre-tool-use hook: hook là code chạy TRƯỚC khi Claude hành động và CHẶN được hành động đó, nên kể cả khi Claude định push main, hook vẫn chặn cứng. Đó là enforcement thật, không phải lời đề nghị lịch sự.
Dùng @import để tách CLAUDE.md có giúp giảm context không?
Không. Cú pháp import path-to-file (ví dụ @.claude/conventions/code-style.md) giúp TỔ CHỨC file gọn gàng, nhưng lúc Claude launch các file import được bung inline ngay tại chỗ tham chiếu — mọi thứ vẫn load hết ở đầu. Nên import KHÔNG giảm lượng context Claude phải đọc; dùng nó để tổ chức, không phải để thu nhỏ tải. Muốn thật sự nhẹ context thì trỏ prose "đọc khi cần" (lazy-load) thay vì import cứng (eager-load, tốn token mỗi request).
Ba nguyên tắc phrasing để một luật CLAUDE.md "dính" là gì?
Một, cụ thể + kiểm được (specific and checkable): thay "Follow best practices for API routes" bằng "Put new API routes in src/api/handlers, one per file" — nhìn kết quả biết ngay đúng/sai. Hai, gọi tên cái thay thế (name the replacement), đừng chỉ cấm: thay "Don't use default exports" bằng "Use named exports, not default exports". Ba, emphasis là một NGÂN SÁCH: IMPORTANT/YOU MUST chỉ nâng ưu tiên tương đối so với các dòng im lặng quanh nó — nếu mọi luật đều hét thì không luật nào nổi bật, nên chỉ dồn nhấn mạnh cho 2–3 luật đau nhất.
CLAUDE.md có mấy vị trí và chúng xếp thế nào?
Bốn vị trí, load cùng lúc lúc launch và STACK chồng lên nhau, không cái nào bị bỏ: Managed policy (file cấp tổ chức do platform team quản, bạn không loại được nên org policy luôn có hiệu lực), User (~/.claude/CLAUDE.md, theo bạn qua mọi project trên máy), Project (CLAUDE.md commit chia sẻ team), và Local (CLAUDE.local.md, git bỏ qua — ghi chú cá nhân chỉ cho repo này, tiện khi refactor ở branch riêng mà không muốn ảnh hưởng cả team).