Bỏ qua để đến nội dung

Cách Claude Code hoạt động

Bài viết này giúp bạn hiểu được khái niệm vòng lặp agentic, các công cụ có sẵn trong Claude (built-in tools) và cách Claude Code làm việc với dự án của bạn.

Claude Code là một trợ lý agentic chạy trên terminal. Trong khi nó rất thành thạo trong các tác vụ liên quan tới coding, nó còn có thể giúp bạn làm nhiều việc khác: viết tài liệu, chạy lệnh build, tìm kiếm file, nghiên cứu các chủ đề…

Bài viết này bao gồm các kiến thức về kiến trúc, khả năng nội tại của Claude Code và một số lời khuyên để làm việc hiệu quả với Claude Code. Xem Quy trình thường gặp để có hướng dẫn từng bước, và So sánh các cách mở rộng cho skill, MCP, hook.

Khi bạn giao một việc, Claude đi qua ba giai đoạn: thu thập ngữ cảnh, thực thi/thực hiện công việc, và kiểm chứng kết quả. Ba giai đoạn này đan xen vào nhau - Claude dùng tool xuyên suốt, dù là tìm file để hiểu code, sửa file để thay đổi, hay chạy test để kiểm tra lại việc mình vừa làm.

Sơ đồ vòng lặp agentic: prompt của bạn dẫn tới việc Claude thu thập ngữ cảnh, hành động, kiểm chứng kết quả, rồi lặp lại cho tới khi xong việc - bạn có thể ngắt (interrupt) ở bất kỳ điểm nào.

Vòng lặp này thay đổi linh hoạt theo từng loại yêu cầu hay công việc cần làm. Một câu hỏi giải thích mã nguồn có thể chỉ cần giai đoạn thu thập ngữ cảnh. Còn một yêu cầu sửa bug sẽ lặp qua cả ba giai đoạn nhiều lần. Một lần refactor lớn có thể cần kiểm chứng rất kỹ nhiều bước. Claude tự quyết định mỗi bước cần gì dựa trên những gì học được từ bước trước, nối hàng chục hành động lại với nhau và tự điều chỉnh trong quá trình làm việc.

Bạn cũng là một phần của vòng lặp này, hay nói cách khác thỉnh thoảng bạn sẽ tham gia vào vòng lặp này - bạn có thể can thiệp bất kỳ lúc nào để điều chỉnh lại hướng tiếp cận, điều chỉnh cách giải quyết công việc, hoặc cũng có thể bổ sung ngữ cảnh. Claude làm việc độc lập nhưng vẫn luôn sẵn sàng phản hồi lại yêu cầu của bạn.

Hai thành phần vận hành vòng lặp này: model biết suy luận, và tool biết thực thi các công việc/hành động. Claude Code đóng vai trò “bộ khung agentic” (agentic harness) bao quanh model Claude - cung cấp tool, quản lý ngữ cảnh, và môi trường thực thi biến một mô hình ngôn ngữ thành một agent lập trình có năng lực thực sự.

Claude Code dùng model Claude để đọc hiểu code và suy luận về tác vụ. Claude có thể đọc code ở bất kỳ ngôn ngữ nào, hiểu các thành phần liên kết với nhau ra sao, và tìm ra cần thay đổi gì để đạt mục tiêu của bạn. Với các công việc phức tạp, model chia nhỏ thành từng bước, thực hiện, rồi điều chỉnh dựa trên kết quả học được.

Có nhiều model để lựa chọn với các ưu nhược điểm khác nhau - Sonnet xử lý tốt phần lớn việc lập trình, Opus mạnh hơn về suy luận cho quyết định kiến trúc phức tạp. Chuyển đổi bằng /model trong phiên, hoặc chỉ định ngay từ đầu bằng claude --model <tên-model>.

Khi trang này nói “Claude chọn” hay “Claude quyết định”, đó chính là model đang thực hiện phần suy luận.

Tool là thứ khiến Claude Code trở thành “agentic”. Không có tool, Claude chỉ có thể trả lời bằng chữ. Có tool, Claude có thể hành động: đọc code, sửa file, chạy lệnh, tìm kiếm trên web, tương tác với dịch vụ bên ngoài. Mỗi lần dùng tool trả về thông tin mới, nuôi lại vòng lặp để quyết định bước tiếp theo.

Các tool có sẵn (built-in) thuộc năm nhóm chính, mỗi nhóm đại diện cho một dạng năng lực khác nhau:

Nhóm Claude có thể làm gì
Thao tác file Đọc file, sửa code, tạo file mới, đổi tên/sắp xếp lại
Tìm kiếm Tìm file theo mẫu, tìm nội dung bằng regex, khám phá codebase
Thực thi Chạy lệnh shell, khởi động server, chạy test, dùng git
Web Tìm kiếm trên web, lấy tài liệu, tra cứu thông báo lỗi
Code intelligence Xem lỗi kiểu dữ liệu sau khi sửa, nhảy đến định nghĩa, tìm nơi sử dụng (cần cài thêm plugin ngôn ngữ)

Đây là các năng lực chính. Ngoài ra Claude còn có tool để giao việc cho subagent, hỏi lại bạn, và vài tác vụ điều phối khác. Xem Tool use & function calling để hiểu cơ chế bên dưới.

Claude tự chọn dùng tool nào dựa trên yêu cầu của bạn và những gì học được dọc đường. Khi bạn nói “sửa các test đang fail”, Claude có thể:

  1. Chạy bộ test để xem cái nào fail
  2. Đọc log lỗi
  3. Tìm file mã nguồn liên quan
  4. Đọc các file đó để hiểu code
  5. Sửa file để khắc phục vấn đề
  6. Chạy lại test để xác nhận

Mỗi lần dùng tool cho Claude thông tin mới để quyết định bước kế tiếp - đó chính là vòng lặp agentic đang vận hành.

Mở rộng khả năng nền tảng: các tool có sẵn là nền móng. Bạn có thể mở rộng thêm kiến thức bằng skill, kết nối dịch vụ ngoài bằng MCP, tự động hoá quy trình bằng hooks, và giao việc cho subagent. Các phần mở rộng này tạo thành một lớp phía trên vòng lặp agentic cốt lõi. Xem So sánh các cách mở rộng để biết khi nào nên dùng cái nào.

Khi bạn chạy claude trong một thư mục, Claude Code có quyền truy cập:

  • Dự án của bạn - file trong thư mục và thư mục con, cộng thêm nơi khác nếu bạn cho phép (--add-dir).
  • Terminal của bạn - bất kỳ lệnh nào bạn có thể chạy: build tool, git, package manager, tiện ích hệ thống, script riêng. Nếu bạn làm được từ dòng lệnh thì Claude cũng làm được.
  • Trạng thái git - nhánh hiện tại, thay đổi chưa commit, lịch sử commit gần đây.
  • CLAUDE.md - file markdown nơi bạn lưu chỉ dẫn, quy ước, và ngữ cảnh riêng của dự án mà Claude nên biết ở mọi phiên.
  • Auto memory - điều Claude tự học được khi làm việc, như các pattern của dự án hay sở thích của bạn. 200 dòng đầu hoặc 25KB đầu của MEMORY.md (tuỳ cái nào tới trước) được nạp vào đầu mỗi phiên.
  • Các phần mở rộng bạn cấu hình - MCP server cho dịch vụ ngoài, skill cho quy trình, subagent cho việc giao phó, và Claude in Chrome để tương tác trình duyệt.

Vì Claude nhìn thấy toàn bộ dự án, nó có thể làm việc xuyên suốt dự án đó. Khi bạn yêu cầu “sửa lỗi ở module authentication”, Claude tìm các file liên quan, đọc nhiều file để hiểu ngữ cảnh, sửa đồng bộ trên các file đó, chạy test để xác nhận, và commit nếu bạn yêu cầu. Đây là điểm khác biệt so với các trợ lý code chỉ nhìn thấy file đang mở.

Vòng lặp agentic, tool, và các khả năng ở trên giống hệt nhau dù bạn dùng Claude Code ở đâu. Điều thay đổi là code chạy ở đâu và bạn tương tác bằng cách nào.

Claude Code chạy trong ba môi trường, mỗi môi trường có đánh đổi khác nhau về nơi code thực sự chạy:

Môi trường Code chạy ở đâu Dùng khi nào
Local Máy của bạn Mặc định. Toàn quyền truy cập file, tool, và môi trường của bạn
Cloud VM do Anthropic quản lý, hoặc môi trường tự triển khai (self-hosted) do tổ chức bạn vận hành Đẩy tác vụ ra ngoài, làm việc với repo bạn không có sẵn cục bộ
Remote Control Máy của bạn, điều khiển từ trình duyệt Dùng giao diện web trong khi code và file vẫn nằm cục bộ

Bạn có thể dùng Claude Code qua terminal, app Desktop, extension IDE, claude.ai/code, Remote Control, Slack, và pipeline CI/CD. Giao diện quyết định cách bạn nhìn thấy và tương tác với Claude, nhưng vòng lặp agentic bên dưới luôn giống nhau. Xem Tổng quan § Dùng Claude Code ở mọi nơi để có danh sách đầy đủ.

Claude Code lưu hội thoại của bạn cục bộ trên máy khi làm việc - mỗi message, lần dùng tool, và kết quả được ghi vào một file JSONL dạng plaintext dưới ~/.claude/projects/, nhờ đó bạn có thể tua lại (rewind), tiếp tục (resume), hoặc rẽ nhánh (fork) một phiên cũ. Trước khi sửa code, Claude cũng chụp lại (snapshot) các file bị ảnh hưởng để bạn có thể hoàn tác nếu cần. Về đường dẫn, thời gian lưu trữ, và cách xoá dữ liệu này, xem Thư mục .claude.

Các phiên độc lập với nhau. Mỗi phiên mới lại bắt đầu với một cửa sổ ngữ cảnh mới - không mang theo lịch sử hội thoại từ phiên trước. Claude có thể lưu lại điều học được xuyên suốt các phiên nhờ auto memory, và bạn cũng có thể tự thêm chỉ dẫn cố định vào CLAUDE.md.

Mỗi hội thoại Claude Code là một phiên gắn với thư mục hiện tại. Bảng chọn /resume mặc định chỉ hiện các phiên trong worktree hiện tại, kèm phím tắt để mở rộng sang worktree hoặc dự án khác - xem Quản lý phiên làm việc để biết đầy đủ các phím tắt và cách phân giải tên phiên.

Claude nhìn thấy file của nhánh hiện tại. Khi bạn đổi nhánh, Claude nhìn thấy file của nhánh mới, nhưng lịch sử hội thoại vẫn giữ nguyên - Claude vẫn nhớ những gì đã trao đổi kể cả sau khi đổi nhánh.

Vì phiên gắn với thư mục, bạn có thể chạy nhiều phiên Claude song song bằng git worktree - mỗi worktree là một thư mục riêng cho từng nhánh.

Resume một phiên bằng claude --continue hoặc claude --resume sẽ mở lại đúng session ID đó và nối thêm message mới vào hội thoại cũ. Fork bằng --fork-session hoặc /branch sẽ copy lịch sử sang một session ID mới, giữ nguyên phiên gốc không đổi.

Sơ đồ tiếp diễn phiên: resume tiếp tục cùng một session, fork tạo một nhánh mới với ID mới.

Xem Quản lý phiên làm việc để biết đầy đủ các flag resume, cách hoạt động của bảng chọn /resume, cách đặt tên phiên, và chuyện gì xảy ra khi cùng một phiên được mở ở hai terminal.

Cửa sổ ngữ cảnh của Claude chứa lịch sử hội thoại, nội dung file, output lệnh, CLAUDE.md, auto memory, skill đã nạp, và system instruction. Ngữ cảnh đầy dần khi bạn làm việc. Claude tự động compact, nhưng chỉ dẫn từ đầu cuộc hội thoại có thể bị mất theo thời gian. Đặt các rule cố định vào CLAUDE.md, và chạy /context để xem thứ gì đang chiếm chỗ.

Xem Cửa sổ ngữ cảnh để có mô phỏng tương tác về những gì nạp vào và khi nào.

Claude Code tự quản lý ngữ cảnh khi gần chạm giới hạn: xoá output tool cũ trước, rồi tóm tắt hội thoại nếu cần. Yêu cầu của bạn và các đoạn code quan trọng được giữ lại; chỉ dẫn chi tiết từ đầu hội thoại có thể bị mất. Đặt rule cố định vào CLAUDE.md thay vì trông chờ vào lịch sử hội thoại.

Để kiểm soát thứ gì được giữ lại khi compact, thêm mục “Compact Instructions” vào CLAUDE.md, hoặc chạy /compact kèm trọng tâm cụ thể (ví dụ /compact focus on the API changes).

Nếu một file hay output tool đơn lẻ quá lớn khiến ngữ cảnh đầy lại ngay sau mỗi lần tóm tắt, Claude Code sẽ dừng auto-compact sau vài lần thử và báo lỗi thay vì lặp vô hạn - xem Tra cứu lỗi để biết cách khắc phục.

Chạy /context để xem thứ gì đang chiếm chỗ. Định nghĩa tool của MCP mặc định được hoãn nạp (deferred) và chỉ tải khi cần qua tool search, nên chỉ tên tool chiếm chỗ cho đến khi Claude thực sự dùng một tool cụ thể. Chạy /mcp để xem chi phí theo từng server.

Ngoài compact, còn vài tính năng khác giúp kiểm soát thứ gì được nạp vào ngữ cảnh.

Skill nạp theo nhu cầu - Claude thấy mô tả skill lúc khởi động phiên, nhưng nội dung đầy đủ chỉ nạp khi skill được dùng. Với skill bạn tự gọi thủ công, đặt disable-model-invocation: true để giữ mô tả ngoài ngữ cảnh cho đến khi cần. Với skill không phải do bạn viết, dùng skillOverrides trong settings để làm điều tương tự.

Subagent có ngữ cảnh riêng hoàn toàn tách biệt khỏi hội thoại chính. Việc chúng làm không làm phình ngữ cảnh của bạn. Khi xong, chúng trả về một bản tóm tắt. Sự cách ly này là lý do subagent hữu ích cho các phiên dài.

Xem thêm Cửa sổ ngữ cảnh để biết chi phí ngữ cảnh của từng tính năng và cách quản lý lượng token sử dụng.

Claude Code có hai cơ chế an toàn: checkpoint cho phép hoàn tác thay đổi file, còn quyền hạn (permissions) kiểm soát việc gì Claude được làm mà không cần hỏi.

Mọi lần sửa file đều có thể hoàn tác. Trước khi sửa, Claude chụp lại nội dung hiện tại; nếu có gì sai, nhấn Esc hai lần để tua lại trạng thái trước đó, hoặc nhờ Claude hoàn tác.

Checkpoint tách biệt với git và vẫn còn khi bạn resume lại phiên. Chúng chỉ áp dụng cho thay đổi file (bỏ qua symlink và hard link khi restore), không áp dụng cho hành động ảnh hưởng hệ thống bên ngoài (database, API, deploy…) - đó là lý do Claude luôn hỏi trước khi chạy các lệnh có tác động ra ngoài.

Nhấn Shift+Tab để chuyển qua các chế độ quyền hạn:

  • Manual - Claude hỏi trước khi sửa file và chạy lệnh shell.
  • Accept edits - Claude sửa file và chạy các lệnh filesystem thông dụng (mkdir, mv…) mà không hỏi, vẫn hỏi với lệnh khác.
  • Plan - Claude khám phá và đề xuất kế hoạch mà không sửa file nguồn.
  • Auto - Claude tự đánh giá mọi hành động bằng kiểm tra an toàn chạy nền.

Bạn cũng có thể cho phép sẵn các lệnh cụ thể trong .claude/settings.json để Claude không cần hỏi mỗi lần - hữu ích cho lệnh đáng tin cậy như npm test hay git status. Settings có thể áp dụng từ cấp toàn tổ chức xuống đến sở thích cá nhân. Xem Cấu hình permissions để biết chi tiết.

Những mẹo dưới đây giúp bạn có kết quả tốt hơn từ Claude Code.

Claude Code có thể tự dạy bạn cách dùng nó. Hỏi những câu như “làm sao để thiết lập hooks?” hay “CLAUDE.md nên cấu trúc thế nào?” và Claude sẽ giải thích.

Các lệnh có sẵn cũng hướng dẫn bạn thiết lập:

  • /init giúp bạn tạo CLAUDE.md cho dự án
  • /doctor chạy kiểm tra thiết lập, chẩn đoán lỗi cài đặt/cấu hình và có thể tự sửa

Claude Code mang tính hội thoại. Bạn không cần viết prompt hoàn hảo. Bắt đầu với điều bạn muốn, rồi tinh chỉnh dần:

Sửa bug đăng nhập

(Claude điều tra, thử một cách)

Chưa đúng lắm. Vấn đề nằm ở phần xử lý session.

(Claude điều chỉnh cách tiếp cận)

Khi lần thử đầu chưa đúng, bạn không cần bắt đầu lại từ đầu - bạn lặp lại và tinh chỉnh.

Bạn có thể đổi hướng Claude bất cứ lúc nào mà không cần đợi lượt hiện tại chạy xong hay bắt đầu lại:

  • Nhấn Esc để dừng Claude ngay lập tức - lệnh tool đang chạy bị huỷ và Claude chờ chỉ dẫn tiếp theo.
  • Gõ điều chỉnh và nhấn Enter để gửi mà không dừng tool đang chạy - Claude đọc ngay khi hành động hiện tại xong và điều chỉnh trước khi quyết định bước tiếp theo.

Prompt ban đầu càng chính xác, bạn càng ít phải sửa lại. Nêu rõ file liên quan, ràng buộc cần giữ, và pattern ví dụ.

Luồng checkout bị lỗi với thẻ hết hạn.
Xem trong src/payments/, đặc biệt là phần refresh token.
Viết một test fail trước, rồi mới sửa.

Prompt không rõ nghĩa vẫn chạy được, nhưng bạn sẽ tốn nhiều thời gian điều chỉnh hơn. Prompt cụ thể như trên thường thành công ngay lần thử đầu.

Claude làm việc tốt hơn khi có thể tự kiểm tra lại kết quả. Kèm test case, dán ảnh chụp UI mong muốn, hoặc định nghĩa rõ output cần có.

Triển khai validateEmail. Test case: 'user@example.com' → true,
'invalid' → false, 'user@.com' → false. Chạy test sau khi xong.

Với việc liên quan giao diện, dán ảnh chụp thiết kế và yêu cầu Claude so sánh kết quả triển khai với ảnh đó.

Với vấn đề phức tạp, tách nghiên cứu ra khỏi việc code. Dùng plan mode (Shift+Tab hai lần) để phân tích codebase trước:

Đọc src/auth/ và hiểu cách chúng ta xử lý session.
Sau đó lập kế hoạch thêm hỗ trợ OAuth.

Xem lại kế hoạch, tinh chỉnh qua hội thoại, rồi mới để Claude triển khai. Cách làm hai giai đoạn này cho kết quả tốt hơn so với nhảy thẳng vào viết code.

Giao việc, đừng ra lệnh chi tiết từng bước

Phần tiêu đề “Giao việc, đừng ra lệnh chi tiết từng bước”

Hãy nghĩ như đang giao việc cho một đồng nghiệp giỏi: cho đủ ngữ cảnh và định hướng, rồi tin tưởng Claude tự tìm ra chi tiết.

Luồng checkout bị lỗi với thẻ hết hạn.
Code liên quan nằm trong src/payments/. Bạn điều tra và sửa được không?

Bạn không cần chỉ định phải đọc file nào hay chạy lệnh gì - Claude tự tìm ra.