- Một workshop thực hành của Anthropic về việc phân rã một agent quá phức tạp ("Stock Pilot" — agent quản lý kho với system prompt 400 dòng, 12 tool và 3 subagent) có eval đã suy giảm.
- Cách khắc phục là dùng đúng
agentic primitivevào đúng lúc: chuyển business logic từ system prompt sangskill(progressive disclosure), thay phần lớn tool tùy biến bằng các primitive của Claude Code (bash/read/write, code execution), và chỉ giữ subagent thực sự cần. - Di chuyển sang
Claude managed agentsvà "hill climbing" trên eval đã đưa agent từ baseline ~62–83% lên ~92%, với token, chi phí và độ trễ giảm mạnh.
Tool, skill, or subagent? Decomposing an agent that outgrew its prompt
- Mẫu lỗi phổ biến: một agent vốn chạy tốt bị "đắp" thêm năng lực theo thời gian đến khi system prompt dài hàng trăm dòng, có hàng chục tool và subagent, và eval bắt đầu suy giảm.
- Eval là trung tâm: Stock Pilot có 12 tác vụ eval qua 5 loại grader — tác vụ một lượt (R, regression) và đa lượt (F, failure mode) — dùng cả grader xác định (turn count, latency, token) và grader phi xác định kiểu LLM-as-a-judge (tone, style, chất lượng output).
- Mỗi lỗi eval có nguyên nhân gốc cụ thể: đường đi vòng vèo kém hiệu quả (F1), đứt gãy giao tiếp giữa orchestrator và subagent (F2), và các policy mâu thuẫn nằm ở các phần khác nhau của system prompt dài gây ảo giác hệ số nhân (R8) — vấn đề ngữ cảnh, không phải vấn đề model.
Skillcho phép progressive disclosure: đóng gói thông tin Claude chỉ cần đôi lúc và để nó kéo vào ngữ cảnh khi cần, thay vì nhồi tất cả vào system prompt; điều này cắt prompt từ ~400 dòng còn ~15 và giảm ô nhiễm ngữ cảnh.- Bắt đầu với các primitive giống con người: cấp cho Claude cùng các công cụ một người có ở nơi làm việc — file system, web search, code execution, to-do list — rồi bỏ thứ không cần và chỉ thêm tool tùy biến khi cần.
- Code execution hiệu quả hơn nhiều so với nạp dữ liệu thô: cấp cho Claude một bash tool để viết và chạy Python trên CSV/Excel đã giảm token từ hơn 200.000 xuống một phần nhỏ, đồng thời giảm chi phí và thời gian thực thi.
- Thứ tự chiến lược tool: bắt đầu với primitive của Claude Code, rồi tạo tool cục bộ, và chỉ dùng MCP khi nhiều agent/client cần cùng bộ tool chuẩn hóa, có governance — và cân nhắc code execution (CLI/API) như giải pháp thay MCP để tránh ô nhiễm ngữ cảnh.
- Hai lý do mạnh để dùng subagent: ném thật nhiều Claude vào một bài toán song song hóa được (deep research, khám phá codebase), hoặc cấp một "đầu óc tươi mới" cách ly ngữ cảnh cho một bài toán (ví dụ review code, hay subagent dự báo tách khỏi hội thoại chính);
Claude managed agentscung cấp khả năng callable-agents native với observability tích hợp thay vì bọc subagent thành tool.
Claude managed agents(CMA) — Claude managed agents (nền tảng được quản lý)agentic primitive— agentic primitive (khối xây dựng agent)skill— skillprogressive disclosure(tiết lộ dần) — progressive disclosuresubagent/callable agent— subagent / callable agenteval(đánh giá) — evalhill climbing(leo đồi) — hill climbingprimitive giống con người— human-like primitiveLLM-as-a-judge— LLM-as-a-judgeorchestrator(bộ điều phối) — orchestrator
Vấn đề: Agent phình to vượt khỏi prompt
Will, kỹ sư đội Applied AI tại Anthropic (chia thời gian giữa kỹ thuật nội bộ và xây agent với khách hàng), mô tả một mẫu lỗi phổ biến. Bạn ship một agent chạy tốt; rồi liên tục được yêu cầu thêm năng lực. System prompt phình lên hàng trăm dòng, có hàng chục tool và subagent, và do phức tạp, agent bắt đầu suy giảm ở chính những việc nó từng làm tốt.
Workshop mô phỏng một agent như vậy: "Stock Pilot", agent quản lý kho cho một nhà bán lẻ tầm trung, làm được cảnh báo tồn kho thấp, dự báo nhu cầu, chọn nhà cung cấp, lập PO và viết báo cáo tuần. Vấn đề là năng lực được "đắp" thêm theo thời gian mà không hiện đại hóa kiến trúc. Hiện tại agent có một orchestrator duy nhất, system prompt ~400 dòng, 12 tool, ba trong số đó bọc subagent với context window hoàn toàn tách biệt. Mục tiêu là dùng đúng agentic primitive vào đúng lúc — khi nào dùng tool, skill, hay subagent.
Eval và chẩn đoán nguyên nhân gốc
Agent có 12 tác vụ eval qua 5 loại grader. ID bắt đầu bằng R là regression (tác vụ một lượt thực tế); ID bắt đầu bằng F là failure mode (tác vụ đa lượt phức tạp). Có grader xác định (turn count, latency, token) và grader phi xác định kiểu LLM-as-a-judge (tone, style, chất lượng output).
Các lỗi cụ thể: F1 (quét tồn kho thấp hằng ngày) thất bại vì agent làm đúng nhưng đi đường vòng kém hiệu quả; F2 (đặt hàng theo chương trình khuyến mãi) thất bại do đứt gãy giao tiếp giữa subagent và orchestrator; R8 (dự báo trong tháng khuyến mãi) thất bại vì hai policy mâu thuẫn nằm ở các phần khác nhau của system prompt dài. Soi kỹ R8: agent lấy đúng baseline dự báo (12 đơn vị/ngày) và đúng hệ số khuyến mãi (3.1x), nhưng khi tính lại ảo giác dùng 1.35. Đây là vấn đề ngữ cảnh, không phải model. Eval khởi điểm khoảng 83% (khi chạy bằng Claude Code cho ra 62%, 7/12 đạt) — với sản xuất, 17% lỗi là rất đắt.
Mục tiêu: chạy eval, triage, cập nhật thiết kế, rồi "hill climbing" — lập baseline, tối ưu kiến trúc, chạy lại để leo điểm. Đồng thời di chuyển agent từ messages API sang Claude managed agents (CMA), vốn gánh hộ phần "lộn xộn" của agentic harness: hosting, scaling, memory, security — để chỉ phải lo thiết kế agent.
Skills và Progressive Disclosure
Skill là thông tin đóng gói, composable mà Claude kéo vào ngữ cảnh khi nhận ra cần để hoàn thành tác vụ. Trong agent này có nhiều policy và quy trình quản lý kho; thay vì xây skill, tác giả cứ nối thêm vào system prompt khiến nó dài ra. Khuyến nghị: chỉ để trong system prompt thông tin Claude cần bất kể tác vụ; còn thông tin chỉ cần đôi lúc thì đưa vào skill. Ví dụ, Claude không cần thông tin dự báo trừ khi bạn yêu cầu dựng dự báo — lúc đó nó mới kéo vào. Skill cũng giúp tiết kiệm ngữ cảnh, vì nhồi mọi thứ vào system prompt làm ô nhiễm context. Kết quả: kích hoạt nhiều skill và rút system prompt từ ~400 dòng còn ~50.
Tools: Bắt đầu với primitive giống con người
Agent có 12 tool — tool cho mọi thứ. Mẹo của Anthropic: dùng các primitive giống con người — như khi đi làm, bạn có máy tính, duyệt file system, gõ trong trình duyệt, tìm web, và viết/chạy code. Claude Code đã cấp cho Claude các primitive đó. Sức mạnh: khi ra model mới, Claude dùng các primitive đó tốt hơn. Bắt đầu với primitive trước (code execution, file system, to-do list, web search), bỏ thứ không cần, thêm tool tùy biến khi cần. Ví dụ: với CSV/Excel, cấp bash tool để Claude viết và chạy Python rồi suy luận trên kết quả hiệu quả hơn nhiều so với nạp cả CSV vào ngữ cảnh. Với CMA, các tool này có sẵn mặc định. Kết quả: token giảm từ hơn 200.000 xuống một phần nhỏ, chi phí và thời gian thực thi đều giảm.
Về MCP: thứ tự là primitive Claude Code → tool cục bộ riêng cho agent → MCP. Nhiều người chạy ngay tới MCP và rơi vào hệ sinh thái MCP server hỗn loạn, chồng chéo. Chỉ dùng MCP khi nhiều client/agent cần cùng bộ tool chuẩn hóa, có governance. Ngày càng phổ biến: dùng code execution gọi CLI/API thay MCP, vì MCP có thể ô nhiễm và chiếm nhiều ngữ cảnh.
Subagents và kiến trúc cuối cùng
Hai lý do dùng subagent: (1) ném thật nhiều Claude vào bài toán song song hóa được (deep research, web search, khám phá codebase); (2) cần "đầu óc tươi mới" cách ly ngữ cảnh (như review code, hay subagent dự báo tách khỏi instance chính để không bị ngữ cảnh ban đầu làm sai lệch). Agent giữ lại đúng một subagent — dự báo. Thay vì bọc subagent thành tool, dùng khả năng callable agents native của CMA, có observability và metrics chính xác như orchestrator, giải quyết vấn đề giao tiếp đứt gãy và logging khó. Nhiều trường hợp có thể bỏ hẳn subagent vì frontier model đã đủ thông minh để quản nhiều thông tin hơn.
Kiến trúc cuối: orchestrator triển khai trên CMA; tool rút còn ba (bash, read, write); đồng bộ dữ liệu vào môi trường CMA khi chạy; system prompt còn 15 dòng, toàn bộ business logic chuyển thành skill. Điểm eval lên ~92%, nhanh hơn, ít token hơn nhờ code execution; turn count giữ nguyên nhưng do token và chi phí giảm nên chấp nhận được, và sẵn sàng đánh đổi chút latency cho agent dự báo chất lượng cao.
Bài học rút ra
(1) Bắt đầu với một agent loop đơn, trang bị primitive đơn giản giống con người (file system, web search, code execution, đôi khi to-do list), rồi xây tiếp. (2) Dùng progressive disclosure qua skill thay vì nhồi system prompt, để chạy hiệu quả và không ô nhiễm ngữ cảnh. (3) Viết eval và "hill climbing": lập baseline, chỉnh kiến trúc, chạy lại, tốt dần lên — và luôn cập nhật eval theo năng lực sản phẩm để đo đúng thứ quan trọng.
TL;DR
- Một workshop thực hành của Anthropic về việc phân rã một agent quá phức tạp ("Stock Pilot" — agent quản lý kho với system prompt 400 dòng, 12 tool và 3 subagent) có eval đã suy giảm.
- Cách khắc phục là dùng đúng
agentic primitivevào đúng lúc: chuyển business logic từ system prompt sangskill(progressive disclosure), thay phần lớn tool tùy biến bằng các primitive của Claude Code (bash/read/write, code execution), và chỉ giữ subagent thực sự cần. - Di chuyển sang
Claude managed agentsvà "hill climbing" trên eval đã đưa agent từ baseline ~62–83% lên ~92%, với token, chi phí và độ trễ giảm mạnh.
Điểm chính
- Mẫu lỗi phổ biến: một agent vốn chạy tốt bị "đắp" thêm năng lực theo thời gian đến khi system prompt dài hàng trăm dòng, có hàng chục tool và subagent, và eval bắt đầu suy giảm.
- Eval là trung tâm: Stock Pilot có 12 tác vụ eval qua 5 loại grader — tác vụ một lượt (R, regression) và đa lượt (F, failure mode) — dùng cả grader xác định (turn count, latency, token) và grader phi xác định kiểu LLM-as-a-judge (tone, style, chất lượng output).
- Mỗi lỗi eval có nguyên nhân gốc cụ thể: đường đi vòng vèo kém hiệu quả (F1), đứt gãy giao tiếp giữa orchestrator và subagent (F2), và các policy mâu thuẫn nằm ở các phần khác nhau của system prompt dài gây ảo giác hệ số nhân (R8) — vấn đề ngữ cảnh, không phải vấn đề model.
Skillcho phép progressive disclosure: đóng gói thông tin Claude chỉ cần đôi lúc và để nó kéo vào ngữ cảnh khi cần, thay vì nhồi tất cả vào system prompt; điều này cắt prompt từ ~400 dòng còn ~15 và giảm ô nhiễm ngữ cảnh.- Bắt đầu với các primitive giống con người: cấp cho Claude cùng các công cụ một người có ở nơi làm việc — file system, web search, code execution, to-do list — rồi bỏ thứ không cần và chỉ thêm tool tùy biến khi cần.
- Code execution hiệu quả hơn nhiều so với nạp dữ liệu thô: cấp cho Claude một bash tool để viết và chạy Python trên CSV/Excel đã giảm token từ hơn 200.000 xuống một phần nhỏ, đồng thời giảm chi phí và thời gian thực thi.
- Thứ tự chiến lược tool: bắt đầu với primitive của Claude Code, rồi tạo tool cục bộ, và chỉ dùng MCP khi nhiều agent/client cần cùng bộ tool chuẩn hóa, có governance — và cân nhắc code execution (CLI/API) như giải pháp thay MCP để tránh ô nhiễm ngữ cảnh.
- Hai lý do mạnh để dùng subagent: ném thật nhiều Claude vào một bài toán song song hóa được (deep research, khám phá codebase), hoặc cấp một "đầu óc tươi mới" cách ly ngữ cảnh cho một bài toán (ví dụ review code, hay subagent dự báo tách khỏi hội thoại chính);
Claude managed agentscung cấp khả năng callable-agents native với observability tích hợp thay vì bọc subagent thành tool.
Từ vựng
Claude managed agents(CMA) — Claude managed agents (nền tảng được quản lý)agentic primitive— agentic primitive (khối xây dựng agent)skill— skillprogressive disclosure(tiết lộ dần) — progressive disclosuresubagent/callable agent— subagent / callable agenteval(đánh giá) — evalhill climbing(leo đồi) — hill climbingprimitive giống con người— human-like primitiveLLM-as-a-judge— LLM-as-a-judgeorchestrator(bộ điều phối) — orchestrator
Nội dung chi tiết
Vấn đề: Agent phình to vượt khỏi prompt
Will, kỹ sư đội Applied AI tại Anthropic (chia thời gian giữa kỹ thuật nội bộ và xây agent với khách hàng), mô tả một mẫu lỗi phổ biến. Bạn ship một agent chạy tốt; rồi liên tục được yêu cầu thêm năng lực. System prompt phình lên hàng trăm dòng, có hàng chục tool và subagent, và do phức tạp, agent bắt đầu suy giảm ở chính những việc nó từng làm tốt.
Workshop mô phỏng một agent như vậy: "Stock Pilot", agent quản lý kho cho một nhà bán lẻ tầm trung, làm được cảnh báo tồn kho thấp, dự báo nhu cầu, chọn nhà cung cấp, lập PO và viết báo cáo tuần. Vấn đề là năng lực được "đắp" thêm theo thời gian mà không hiện đại hóa kiến trúc. Hiện tại agent có một orchestrator duy nhất, system prompt ~400 dòng, 12 tool, ba trong số đó bọc subagent với context window hoàn toàn tách biệt. Mục tiêu là dùng đúng agentic primitive vào đúng lúc — khi nào dùng tool, skill, hay subagent.
Eval và chẩn đoán nguyên nhân gốc
Agent có 12 tác vụ eval qua 5 loại grader. ID bắt đầu bằng R là regression (tác vụ một lượt thực tế); ID bắt đầu bằng F là failure mode (tác vụ đa lượt phức tạp). Có grader xác định (turn count, latency, token) và grader phi xác định kiểu LLM-as-a-judge (tone, style, chất lượng output).
Các lỗi cụ thể: F1 (quét tồn kho thấp hằng ngày) thất bại vì agent làm đúng nhưng đi đường vòng kém hiệu quả; F2 (đặt hàng theo chương trình khuyến mãi) thất bại do đứt gãy giao tiếp giữa subagent và orchestrator; R8 (dự báo trong tháng khuyến mãi) thất bại vì hai policy mâu thuẫn nằm ở các phần khác nhau của system prompt dài. Soi kỹ R8: agent lấy đúng baseline dự báo (12 đơn vị/ngày) và đúng hệ số khuyến mãi (3.1x), nhưng khi tính lại ảo giác dùng 1.35. Đây là vấn đề ngữ cảnh, không phải model. Eval khởi điểm khoảng 83% (khi chạy bằng Claude Code cho ra 62%, 7/12 đạt) — với sản xuất, 17% lỗi là rất đắt.
Mục tiêu: chạy eval, triage, cập nhật thiết kế, rồi "hill climbing" — lập baseline, tối ưu kiến trúc, chạy lại để leo điểm. Đồng thời di chuyển agent từ messages API sang Claude managed agents (CMA), vốn gánh hộ phần "lộn xộn" của agentic harness: hosting, scaling, memory, security — để chỉ phải lo thiết kế agent.
Skills và Progressive Disclosure
Skill là thông tin đóng gói, composable mà Claude kéo vào ngữ cảnh khi nhận ra cần để hoàn thành tác vụ. Trong agent này có nhiều policy và quy trình quản lý kho; thay vì xây skill, tác giả cứ nối thêm vào system prompt khiến nó dài ra. Khuyến nghị: chỉ để trong system prompt thông tin Claude cần bất kể tác vụ; còn thông tin chỉ cần đôi lúc thì đưa vào skill. Ví dụ, Claude không cần thông tin dự báo trừ khi bạn yêu cầu dựng dự báo — lúc đó nó mới kéo vào. Skill cũng giúp tiết kiệm ngữ cảnh, vì nhồi mọi thứ vào system prompt làm ô nhiễm context. Kết quả: kích hoạt nhiều skill và rút system prompt từ ~400 dòng còn ~50.
Tools: Bắt đầu với primitive giống con người
Agent có 12 tool — tool cho mọi thứ. Mẹo của Anthropic: dùng các primitive giống con người — như khi đi làm, bạn có máy tính, duyệt file system, gõ trong trình duyệt, tìm web, và viết/chạy code. Claude Code đã cấp cho Claude các primitive đó. Sức mạnh: khi ra model mới, Claude dùng các primitive đó tốt hơn. Bắt đầu với primitive trước (code execution, file system, to-do list, web search), bỏ thứ không cần, thêm tool tùy biến khi cần. Ví dụ: với CSV/Excel, cấp bash tool để Claude viết và chạy Python rồi suy luận trên kết quả hiệu quả hơn nhiều so với nạp cả CSV vào ngữ cảnh. Với CMA, các tool này có sẵn mặc định. Kết quả: token giảm từ hơn 200.000 xuống một phần nhỏ, chi phí và thời gian thực thi đều giảm.
Về MCP: thứ tự là primitive Claude Code → tool cục bộ riêng cho agent → MCP. Nhiều người chạy ngay tới MCP và rơi vào hệ sinh thái MCP server hỗn loạn, chồng chéo. Chỉ dùng MCP khi nhiều client/agent cần cùng bộ tool chuẩn hóa, có governance. Ngày càng phổ biến: dùng code execution gọi CLI/API thay MCP, vì MCP có thể ô nhiễm và chiếm nhiều ngữ cảnh.
Subagents và kiến trúc cuối cùng
Hai lý do dùng subagent: (1) ném thật nhiều Claude vào bài toán song song hóa được (deep research, web search, khám phá codebase); (2) cần "đầu óc tươi mới" cách ly ngữ cảnh (như review code, hay subagent dự báo tách khỏi instance chính để không bị ngữ cảnh ban đầu làm sai lệch). Agent giữ lại đúng một subagent — dự báo. Thay vì bọc subagent thành tool, dùng khả năng callable agents native của CMA, có observability và metrics chính xác như orchestrator, giải quyết vấn đề giao tiếp đứt gãy và logging khó. Nhiều trường hợp có thể bỏ hẳn subagent vì frontier model đã đủ thông minh để quản nhiều thông tin hơn.
Kiến trúc cuối: orchestrator triển khai trên CMA; tool rút còn ba (bash, read, write); đồng bộ dữ liệu vào môi trường CMA khi chạy; system prompt còn 15 dòng, toàn bộ business logic chuyển thành skill. Điểm eval lên ~92%, nhanh hơn, ít token hơn nhờ code execution; turn count giữ nguyên nhưng do token và chi phí giảm nên chấp nhận được, và sẵn sàng đánh đổi chút latency cho agent dự báo chất lượng cao.
Bài học rút ra
(1) Bắt đầu với một agent loop đơn, trang bị primitive đơn giản giống con người (file system, web search, code execution, đôi khi to-do list), rồi xây tiếp. (2) Dùng progressive disclosure qua skill thay vì nhồi system prompt, để chạy hiệu quả và không ô nhiễm ngữ cảnh. (3) Viết eval và "hill climbing": lập baseline, chỉnh kiến trúc, chạy lại, tốt dần lên — và luôn cập nhật eval theo năng lực sản phẩm để đo đúng thứ quan trọng.