Bài học từ việc xây dựng Claude Code: Nhìn nhận như một AI Agent

@trq212
TIẾNG ANH4 tháng trước · 27 thg 2, 2026
4.0M
11.2K
1.4K
249
28.6K

TL;DR

Khám phá cách đội ngũ Claude Code tối ưu hóa hiệu suất của AI agent thông qua các kỹ thuật gọi công cụ có cấu trúc, điều phối tác vụ và hiển thị thông tin từng bước.

Một trong những phần khó nhất khi xây dựng một agent harness là xây dựng không gian hành động của nó.

Claude hoạt động thông qua Tool Calling, nhưng có một số cách để xây dựng công cụ trong Claude API với các nguyên thủy như bash, skills và gần đây là code execution (đọc thêm về programmatic tool calling trên Claude API trong bài viết mới của @RLanceMartin).

Với tất cả các lựa chọn này, làm thế nào để bạn thiết kế các công cụ cho agent của mình? Bạn có cần chỉ một công cụ như code execution hay bash không? Điều gì sẽ xảy ra nếu bạn có 50 công cụ, mỗi công cụ cho một trường hợp sử dụng mà agent của bạn có thể gặp phải?

Để đặt mình vào vị trí của mô hình, tôi thích tưởng tượng mình được giao một bài toán khó. Bạn sẽ muốn có những công cụ nào để giải quyết nó? Điều đó phụ thuộc vào kỹ năng của chính bạn!

Giấy là tối thiểu, nhưng bạn sẽ bị giới hạn bởi tính toán thủ công. Máy tính sẽ tốt hơn, nhưng bạn sẽ cần biết cách vận hành các tùy chọn nâng cao hơn. Lựa chọn nhanh nhất và mạnh mẽ nhất là máy tính, nhưng bạn sẽ phải biết cách sử dụng nó để viết và thực thi code.

Đây là một khuôn khổ hữu ích để thiết kế agent của bạn. Bạn muốn cung cấp cho nó những công cụ phù hợp với khả năng của chính nó. Nhưng làm thế nào để bạn biết những khả năng đó là gì? Bạn chú ý, đọc đầu ra của nó, thử nghiệm. Bạn học cách nhìn như một agent.

Dưới đây là một số bài học chúng tôi đã học được từ việc chú ý đến Claude khi xây dựng Claude Code.

Cải thiện Elicitation & công cụ AskUserQuestion

Thariq - inline image

Khi xây dựng công cụ AskUserQuestion, mục tiêu của chúng tôi là cải thiện khả năng đặt câu hỏi của Claude (thường được gọi là elicitation).

Mặc dù Claude có thể chỉ đặt câu hỏi bằng văn bản thuần túy, chúng tôi thấy rằng việc trả lời những câu hỏi đó có vẻ mất nhiều thời gian không cần thiết. Làm thế nào để chúng tôi giảm ma sát này và tăng băng thông giao tiếp giữa người dùng và Claude?

Lần thử #1 - Chỉnh sửa ExitPlanTool

Điều đầu tiên chúng tôi thử là thêm một tham số vào ExitPlanTool để có một mảng câu hỏi đi kèm với kế hoạch. Đây là điều dễ thực hiện nhất, nhưng nó làm Claude bối rối vì chúng tôi đồng thời yêu cầu một kế hoạch và một bộ câu hỏi về kế hoạch đó. Điều gì sẽ xảy ra nếu câu trả lời của người dùng mâu thuẫn với những gì kế hoạch nói? Liệu Claude có cần gọi ExitPlanTool hai lần không? Chúng tôi cần một cách tiếp cận khác.

(bạn có thể đọc thêm về lý do chúng tôi tạo ExitPlanTool trong bài viết của chúng tôi về prompt caching

Lần thử #2 - Thay đổi định dạng đầu ra

Tiếp theo, chúng tôi thử sửa đổi hướng dẫn đầu ra của Claude để phục vụ một định dạng markdown đã được sửa đổi một chút mà nó có thể sử dụng để đặt câu hỏi. Ví dụ, chúng tôi có thể yêu cầu nó xuất ra một danh sách các câu hỏi dạng bullet point với các lựa chọn thay thế trong ngoặc. Sau đó, chúng tôi có thể phân tích và định dạng câu hỏi đó thành UI cho người dùng.

Mặc dù đây là thay đổi tổng quát nhất mà chúng tôi có thể thực hiện và Claude thậm chí có vẻ ổn khi xuất ra điều này, nhưng nó không được đảm bảo. Claude sẽ thêm các câu phụ, bỏ qua các tùy chọn hoặc sử dụng một định dạng hoàn toàn khác.

Lần thử #3 - Công cụ AskUserQuestion

Thariq - inline image

Cuối cùng, chúng tôi quyết định tạo một công cụ mà Claude có thể gọi bất kỳ lúc nào, nhưng nó được nhắc đặc biệt để làm như vậy trong chế độ lập kế hoạch. Khi công cụ được kích hoạt, chúng tôi sẽ hiển thị một modal để hiển thị các câu hỏi và chặn vòng lặp của agent cho đến khi người dùng trả lời.

Công cụ này cho phép chúng tôi nhắc Claude đưa ra đầu ra có cấu trúc và giúp chúng tôi đảm bảo rằng Claude đưa cho người dùng nhiều lựa chọn. Nó cũng cung cấp cho người dùng các cách để kết hợp chức năng này, ví dụ như gọi nó trong Agent SDK hoặc tham chiếu đến nó trong skills.

Quan trọng nhất, Claude có vẻ thích gọi công cụ này và chúng tôi thấy đầu ra của nó hoạt động tốt. Ngay cả công cụ được thiết kế tốt nhất cũng không hoạt động nếu Claude không hiểu cách gọi nó.

Đây có phải là hình thức elicitation cuối cùng trong Claude Code không? Chúng tôi không chắc. Như bạn sẽ thấy trong ví dụ tiếp theo, những gì hiệu quả với một mô hình có thể không phải là tốt nhất cho mô hình khác.

Cập nhật với các khả năng - Tasks & Todos

Thariq - inline image

Khi chúng tôi lần đầu ra mắt Claude Code, chúng tôi nhận ra rằng mô hình cần một danh sách Todo để giữ nó đi đúng hướng. Todos có thể được viết khi bắt đầu và được đánh dấu hoàn thành khi mô hình thực hiện công việc. Để làm điều này, chúng tôi đã cung cấp cho Claude công cụ TodoWrite, công cụ này sẽ viết hoặc cập nhật Todos và hiển thị chúng cho người dùng.

Nhưng ngay cả khi đó, chúng tôi thường thấy Claude quên những gì nó phải làm. Để thích ứng, chúng tôi đã chèn các lời nhắc hệ thống mỗi 5 lượt để nhắc Claude về mục tiêu của nó.

Nhưng khi các mô hình cải thiện, chúng không chỉ không cần được nhắc nhở về danh sách Todo mà còn có thể thấy nó hạn chế. Việc được gửi lời nhắc về danh sách todo khiến Claude nghĩ rằng nó phải bám vào danh sách thay vì sửa đổi nó. Chúng tôi cũng thấy Opus 4.5 trở nên tốt hơn nhiều trong việc sử dụng subagent, nhưng làm thế nào để các subagent phối hợp trên một danh sách Todo chung?

Thấy vậy, chúng tôi đã thay thế TodoWrite bằng Task Tool (đọc thêm về Tasks tại đây). Trong khi Todos tập trung vào việc giữ mô hình đi đúng hướng, Tasks lại tập trung nhiều hơn vào việc giúp các agent giao tiếp với nhau. Tasks có thể bao gồm các phụ thuộc, chia sẻ cập nhật giữa các subagent và mô hình có thể thay đổi và xóa chúng.

Khi khả năng của mô hình tăng lên, các công cụ mà mô hình của bạn từng cần giờ đây có thể đang hạn chế chúng. Điều quan trọng là liên tục xem xét lại các giả định trước đây về những công cụ nào là cần thiết. Đây cũng là lý do tại sao việc bám vào một bộ mô hình nhỏ có hồ sơ khả năng tương đối giống nhau là hữu ích.

Thiết kế giao diện tìm kiếm

Một bộ công cụ đặc biệt quan trọng đối với Claude là các công cụ tìm kiếm có thể được sử dụng để xây dựng ngữ cảnh riêng của nó.

Khi Claude Code lần đầu ra mắt, chúng tôi đã sử dụng cơ sở dữ liệu vector RAG để tìm ngữ cảnh cho Claude. Mặc dù RAG mạnh mẽ và nhanh chóng, nó yêu cầu lập chỉ mục và thiết lập, và có thể dễ vỡ trên nhiều môi trường khác nhau. Quan trọng hơn, Claude được cung cấp ngữ cảnh này thay vì tự tìm ngữ cảnh.

Nhưng nếu Claude có thể tìm kiếm trên web, tại sao không tìm kiếm trong codebase của bạn? Bằng cách cung cấp cho Claude một công cụ Grep, chúng tôi có thể để nó tự tìm kiếm các tệp và xây dựng ngữ cảnh.

Đây là một mẫu hình chúng tôi đã thấy khi Claude ngày càng thông minh hơn, nó ngày càng giỏi trong việc xây dựng ngữ cảnh nếu được cung cấp các công cụ phù hợp.

Khi chúng tôi giới thiệu Agent Skills, chúng tôi đã chính thức hóa ý tưởng về progressive disclosure, cho phép các agent khám phá dần dần ngữ cảnh liên quan thông qua khám phá.

Claude có thể đọc các tệp skill và các tệp đó có thể tham chiếu đến các tệp khác mà mô hình có thể đọc đệ quy. Trên thực tế, một cách sử dụng phổ biến của skills là thêm nhiều khả năng tìm kiếm hơn cho Claude, như cung cấp cho nó hướng dẫn về cách sử dụng API hoặc truy vấn cơ sở dữ liệu.

Trong suốt một năm, Claude đã đi từ chỗ không thực sự có thể xây dựng ngữ cảnh riêng, đến có thể thực hiện tìm kiếm lồng nhau qua nhiều lớp tệp để tìm chính xác ngữ cảnh cần thiết.

Progressive disclosure hiện là một kỹ thuật phổ biến mà chúng tôi sử dụng để thêm chức năng mới mà không cần thêm công cụ.

Progressive Disclosure - Agent Claude Code Guide

Claude Code hiện có khoảng 20 công cụ, và chúng tôi liên tục tự hỏi liệu mình có cần tất cả chúng không. Rào cản để thêm một công cụ mới là rất cao, vì điều này mang lại cho mô hình thêm một lựa chọn để cân nhắc.

Ví dụ, chúng tôi nhận thấy rằng Claude không biết đủ về cách sử dụng Claude Code. Nếu bạn hỏi nó cách thêm MCP hoặc lệnh slash làm gì, nó sẽ không thể trả lời.

Chúng tôi có thể đã đặt tất cả thông tin này trong system prompt, nhưng vì người dùng hiếm khi hỏi về điều này, nó sẽ thêm context rot và can thiệp vào công việc chính của Claude Code: viết code.

Thay vào đó, chúng tôi đã thử một hình thức progressive disclosure. Chúng tôi cung cấp cho Claude một liên kết đến tài liệu của nó, mà nó có thể tải để tìm kiếm thêm thông tin. Điều này hiệu quả, nhưng chúng tôi thấy rằng Claude sẽ tải rất nhiều kết quả vào ngữ cảnh để tìm câu trả lời đúng, trong khi thực sự bạn chỉ cần câu trả lời.

Vì vậy, chúng tôi đã xây dựng subagent Claude Code Guide, mà Claude được nhắc gọi khi bạn hỏi về chính nó. Subagent có hướng dẫn chi tiết về cách tìm kiếm tài liệu tốt và những gì cần trả về.

Mặc dù điều này không hoàn hảo, Claude vẫn có thể bị nhầm lẫn khi bạn hỏi nó về cách thiết lập bản thân, nhưng nó tốt hơn nhiều so với trước đây! Chúng tôi đã có thể thêm những thứ vào không gian hành động của Claude mà không cần thêm công cụ.

Một nghệ thuật, không phải khoa học

Nếu bạn hy vọng có một bộ quy tắc cứng nhắc về cách xây dựng công cụ của mình, thì tiếc là hướng dẫn này không phải như vậy. Thiết kế công cụ cho mô hình của bạn vừa là nghệ thuật vừa là khoa học. Nó phụ thuộc rất nhiều vào mô hình bạn đang sử dụng, mục tiêu của agent và môi trường nó đang hoạt động.

Hãy thử nghiệm thường xuyên, đọc đầu ra của bạn, thử những điều mới. Hãy nhìn như một agent.

Save to YouMind

Use YouMind to read viral articles deeply

Save the source, ask focused questions, summarize the argument, and turn a viral article into reusable notes in one AI workspace.

Explore YouMind

Thêm pattern để giải mã

Bài viết viral gần đây

Khám phá thêm bài viết viral