[VB-01] Những bước đầu sử dụng Sub-agents trong Claude Code
[Bài 01 trong series “Vibe-coding cùng Claude Code”]
Mình dự định sẽ ghi lại và chia sẻ toàn bộ kinh nghiệm rút ra được khi sử dụng Claude Code trong quá “vibe coding” ứng dụng DevPocket.app này!
(gọi là “vibe coding” vì mình chỉ tập trung vào việc ra lệnh thôi, chứ không review code nhiều nữa, không biết có ra nổi thành quả không đây 😂)
Series này dự kiến sẽ khoảng 8 bài:
[VB-01] Những bước đầu sử dụng Sub-agents trong Claude Code
[VB-02] Tất tần tật về bộ công cụ của Claude Code
[VB-03] Viết prompt như thế nào khi “Vibe Coding”
[VB-04] Tận dụng “Commands” để tăng hiệu suất sử dụng Claude Code
[VB-05] "Trick lỏ" Subagents: Tối ưu System Prompt!
[VB-06] Hooks - Là gì và để làm gì?
[VB-07] Vibe coding giao diện sao cho đẹp?
[VB-08] Claude Code Beast Mode: Dùng Sub-agent để tạo Sub-agents
Hôm nay chúng ta sẽ cùng đi qua những bước đầu tiên khi sử dụng Sub-agents của Claude Code - mội đội quân agents của riêng bạn với mỗi con agent làm chuyên biệt một nhiệm vụ khác nhau.
Đây là tính năng rất mạnh mẽ của Claude, nhưng như mình đã nói ở bài trước đó, việc khai thác nó hiệu quả thực sự không hề đơn giản.
Trong bài này, chúng ta sẽ mổ xẻ cách xây dựng sub-agents hiệu quả và tránh những sai lầm phổ biến nhất dựa theo trải nghiệm cá nhân của mình.
(*) Đặc biệt: mình có side notes quan trọng ở cuối bài! 😜
—
1. Sub-agents Hoạt Động Như Thế Nào? Hiểu Đúng Luồng Thông Tin
Đây là phần quan trọng nhất mà có thể nhiều người thường bỏ qua hoặc không biết (trong đó có mình hehe)
Luồng hoạt động của sub-agents không đi thẳng từ nó đến bạn, mà là một chuỗi ủy quyền:
Bạn ra lệnh (prompt) cho Agent Chính (main agent).
Agent Chính dựa vào lệnh của bạn, quyết định và ra lệnh cho các Sub-agent phù hợp.
Các Sub-agent hoạt động độc lập để thực thi nhiệm vụ.
Sau khi xong, các Sub-agent báo cáo kết quả lại cho Agent Chính.
Cuối cùng, Agent Chính tổng hợp thông tin và báo cáo lại cho bạn.
👉 Điểm cốt lõi: Sub-agent không giao tiếp với bạn, nó giao tiếp với Agent Chính. Hiểu sai điều này sẽ dẫn đến việc viết prompt sai, viết workflow sai và không đạt được kết quả mong muốn.
Ví dụ như mình khi mới dùng thử, tạo cho đã 2-3 con agents, nhưng lúc prompt chả thấy em agent nào được summon lên cả, hóa ra cần phải tạo một agent chính trước (kiểu như leader đó), rồi viết system prompt để có thể summon nó lên giao việc, sau đó nó sẽ ủy quyền (delegate) xuống cho các agents trong team để làm việc.
Lưu ý:
Các agents KHÔNG chia sẻ memory với nhau, tụi nó làm việc ở các session riêng biệt, và chỉ báo cáo lại khi nhiệm vụ đã hoàn tất.
Điều này dẫn tới hiện tượng việc sử dụng “sub agents” trong Claude Code ngốn khá nhiều tokens (hơn khá nhiều so với việc sử dụng Claude agent như trước giờ)
Note: hãy bỏ thời gian đọc kỹ “hướng dẫn sử dụng” của Anthropic, đừng chỉ feed cho AI rồi summarize hoặc feed trực tiếp cho Claude Code để nó dùng, chúng ta cần hiểu rõ “bản chất vấn đề” thì mới vận dụng hiệu quả được.
—
2. Hai sai lầm mình mắc phải khi làm việc với Sub-agents
Từ việc hiểu sai luồng thông tin ở trên, chúng ta thường mắc 2 lỗi lớn sau:
Sai lầm 1: Không hiểu nội dung của files trong `/.agent` chính là "System Prompt"
Những gì bạn viết trong file cấu hình của một sub-agent (ví dụ: .agents/hello-world) không phải là “lời nhắc người dùng” (user prompt). Mà nó chính là System Prompt - định nghĩa vai trò, mục đích, hành vi cốt lõi và khi nào nó nên được kích hoạt.Sai lầm 2: Hướng dẫn Sub-agent trả lời sai đối tượng
Vì sub-agent báo cáo cho agent chính, bạn phải hướng dẫn nó cách giao tiếp với "cấp trên" của nó.
Ví dụ, trong prompt của sub-agent, thay vì viết "Hãy trả lời người dùng...", bạn nên viết: "Này Claude (Agent Chính), hãy trả lời người dùng với nội dung sau...". Điều này giúp Agent Chính hiểu được thông điệp và truyền đạt lại cho bạn một cách chính xác.
—
3. Ưu và Nhược Điểm Của Sub-agents
👍 Ưu điểm:
Bảo toàn ngữ cảnh: Như đã nói ở trên, bọn agent không chia sẻ MEMORY, mỗi sub-agent chạy trong một “cửa sổ ngữ cảnh” (context window) riêng, tuy ngốn nhiều tokens hơn nhưng điều này cũng có cái tốt, nó không làm “ô nhiễm” cuộc trò chuyện chính của bạn. Và cực kỳ hữu ích khi xử lý các codebase lớn và phức tạp.
Chuyên môn hóa: Bạn có thể tạo ra các agent cực kỳ chuyên sâu cho từng tác vụ cụ thể (ví dụ: agent chuyên refactor code, agent chuyên viết test,...)
Tái sử dụng: Một khi đã tạo, bạn có thể tái sử dụng các agent này trong nhiều dự án khác nhau.
Kiểm soát quyền hạn: Bạn có thể giới hạn các công cụ mà một sub-agent được phép sử dụng, tăng cường tính bảo mật.
Tập trung cao độ: Vì chỉ làm một việc, sub-agent ít có khả năng “ảo giác” hay mắc lỗi hơn.
👎 Nhược điểm:
Cô lập ngữ cảnh: Đây là mặt trái của ưu điểm trên. Vì không có lịch sử trò chuyện, Agent Chính phải cung cấp đầy đủ thông tin cần thiết trong một lần ra lệnh duy nhất.
Khó gỡ lỗi (debug): Luồng hoạt động bên trong của sub-agent bị trừu tượng hóa thành các message thông báo, lúc nó làm xong thì biến mất hết activities luôn, điều này khiến việc tìm và sửa lỗi trở nên khó khăn hơn (không lẽ cứ ngồi dán mắt zô màn hình coi nó làm gì suốt).
Quá tải lựa chọn: Khi bạn có quá nhiều sub-agents, Agent Chính có thể bị "bối rối" không biết nên gọi agent nào. Việc viết description (mô tả) thật rõ ràng và chính xác là cực kỳ quan trọng.
Phụ thuộc lẫn nhau (Dependency Coupling): Nếu bạn tạo một chuỗi các agent phụ thuộc vào kết quả của nhau, việc thay đổi một agent có thể phá vỡ toàn bộ chuỗi.
Thời gian xử lý task RẤT CHẬM: giống như cách các tổ chức hoạt động vậy, bộ máy cồng kềnh thì thời gian xử lý lâu do phải qua nhiều lớp xét duyệt, có những task mất tới cả tiếng đồng hồ...
—
Tạm kết
Sub-agents là một tính năng cực kỳ mạnh mẽ, mở ra một kỷ nguyên mới về tự động hóa trong lập trình. Nó cho phép chúng ta xây dựng các hệ thống đa agent phức tạp nhưng theo cách có tổ chức. Sau này các hệ thống AI khác (không phải lập trình) cũng sẽ có cách hoạt động tương tự.
Chìa khóa để làm chủ công nghệ này là hiểu rõ luồng thông tin và tư duy theo hướng ủy quyền.
Đừng chỉ giao việc, hãy chỉ cho agent của bạn cách làm việc và báo cáo lại.
—
Quan điểm cá nhân
(Notes đặc biệt mà tui note ở đầu post hehe)
Thuyết âm mưu (nhắc lại: đây là QUAN ĐIỂM CÁ NHÂN - nghe chơi cho vui thôi nha - don’t take it serious): “Mình có cảm giác như Subagents được sinh ra... để bào thêm $ tokens của chúng ta mà thôi haha”
KHÔNG nhất thiết task nào cũng dùng đến subagents! Vì sao thì đọc lại phần “nhược điểm” ở trên, task nhỏ thì prompt CC trực tiếp để xử lý cho nhanh, đỡ tốn tokens, còn task khó & luồng xử lý phức tạp thì hãy dùng tới agents, chặt gà thì không cần tới dao mổ trâu.
Cuối cùng, lẽ ra bài đầu tiên trong series “Vibe Coding” này phải đi từ những thứ cơ bản nhất, nhưng vì mọi người quan tâm đến chủ đề “Subagents” quá nên mình viết trước thôi, trong những bài sau mình sẽ viết thêm về kỹ thuật NÂNG CAO khi sử dụng “Subagents” và các “trick lỏ” (*) dùng sao cho hiệu quả.
Nhưng mà nhớ nha:
KHÔNG nhất thiết task nào cũng dùng đến sub-agents!
KHÔNG nhất thiết task nào cũng dùng đến sub-agents!
KHÔNG nhất thiết task nào cũng dùng đến sub-agents!
(Cái gì quan trọng nhắc 3 lần 😁)
(*) Mấy ae trên Facebook chọc mình hay share "trick lỏ" 😂
Hóng những bài sau nhe anh.
Hóng loạt bài viết này của a