Một trong những thành phần cốt lõi của Agentic Architecture & Orchestration là Agentic Loop (hay còn gọi là Coordinator Runtime). Đây là cơ chế điều phối giúp AI Agent có thể tự thực hiện một chuỗi hành động, sử dụng công cụ (tools) khi cần và chỉ dừng lại khi đã hoàn thành nhiệm vụ.
Điểm thú vị là Coordinator Runtime không tự suy đoán xem model đã làm xong hay chưa. Thay vào đó, toàn bộ luồng thực thi được điều khiển bởi một tín hiệu mà Claude trả về sau mỗi lần suy luận, đó là stop_reason. stop_reason hoạt động như thế nào?
Sau mỗi request gửi đến Claude, model sẽ trả về một giá trị stop_reason để cho biết trạng thái hiện tại của quá trình suy luận, hai trạng thái trả về:
1. tool_use – Tiếp tục Agentic Loop
Khi stop_reason = tool_use, điều đó có nghĩa là Claude chưa thể đưa ra câu trả lời cuối cùng và cần sử dụng một hoặc nhiều tool để thu thập thêm thông tin hoặc thực hiện một hành động.
Lúc này, Coordinator Runtime sẽ:
2. end_turn – Kết thúc Agentic Loop
Khi stop_reason = end_turn, điều đó có nghĩa là Claude đã hoàn tất quá trình suy luận.
Coordinator Runtime lúc này chỉ cần:
VÍ DỤ MINH HỌA:
Giả sử người dùng hỏi: "Hôm nay thời tiết thế nào? Có nên mang ô không?"
Luồng thực thi sẽ diễn ra như sau:
Bước 1:
Bước 3:
Claude tiếp tục suy luận dựa trên dữ liệu mới:
stop_reason = end_turn
Cùng với câu trả lời:
Tại sao phải append tool results vào conversation history?
Đây là điểm rất quan trọng nhưng cũng thường bị bỏ qua.
Claude không ghi nhớ kết quả của tool một cách tự động. Mỗi lần suy luận mới, model chỉ nhìn thấy những gì có trong conversation history.
Nếu Coordinator chỉ thực thi tool mà không đưa kết quả trở lại conversation, Claude sẽ không biết:
Việc sử dụng giá trị stop_reason giúp tránh các anti-patterns:
Một Agentic Loop được thiết kế đúng sẽ không cố gắng tự đoán trạng thái của model.
Ví dụ, đây đều là những anti-pattern phổ biến:
Thay vào đó, Coordinator Runtime chỉ cần dựa vào stop_reason mà model trả về. Đây là tín hiệu điều khiển (control signal) được thiết kế riêng để orchestration, giúp vòng lặp hoạt động ổn định, rõ ràng và đáng tin cậy hơn.
KẾT LUẬN:
Trong Agentic Architecture, Coordinator Runtime không quyết định thay cho model nên làm gì tiếp theo. Vai trò của nó là điều phối vòng lặp dựa trên tín hiệu stop_reason.
Điểm thú vị là Coordinator Runtime không tự suy đoán xem model đã làm xong hay chưa. Thay vào đó, toàn bộ luồng thực thi được điều khiển bởi một tín hiệu mà Claude trả về sau mỗi lần suy luận, đó là stop_reason. stop_reason hoạt động như thế nào?
Sau mỗi request gửi đến Claude, model sẽ trả về một giá trị stop_reason để cho biết trạng thái hiện tại của quá trình suy luận, hai trạng thái trả về:
1. tool_use – Tiếp tục Agentic Loop
Khi stop_reason = tool_use, điều đó có nghĩa là Claude chưa thể đưa ra câu trả lời cuối cùng và cần sử dụng một hoặc nhiều tool để thu thập thêm thông tin hoặc thực hiện một hành động.
Lúc này, Coordinator Runtime sẽ:
- Thực thi các tool mà Claude yêu cầu.
- Thu thập kết quả từ các tool.
- Append các tool results vào conversation history.
- Gửi toàn bộ context đã được cập nhật trở lại cho Claude.
- Claude tiếp tục suy luận và quyết định bước tiếp theo (next action).
2. end_turn – Kết thúc Agentic Loop
Khi stop_reason = end_turn, điều đó có nghĩa là Claude đã hoàn tất quá trình suy luận.
Coordinator Runtime lúc này chỉ cần:
- Kết thúc vòng lặp.
- Trả câu trả lời cuối cùng cho người dùng.
VÍ DỤ MINH HỌA:
Giả sử người dùng hỏi: "Hôm nay thời tiết thế nào? Có nên mang ô không?"
Luồng thực thi sẽ diễn ra như sau:
Bước 1:
- Coordinator gửi yêu cầu đến Claude.
- Claude nhận thấy mình không có dữ liệu thời tiết theo thời gian thực nên trả về:
- stop_reason = tool_use
- Tool: get_weather("Đà Nẵng")
- Coordinator thực thi get_weather().
- Kết quả trả về:
- Nhiệt độ: 31°C
- Khả năng mưa: 85%
Bước 3:
Claude tiếp tục suy luận dựa trên dữ liệu mới:
- Nhiệt độ cao.
- Khả năng mưa lớn.
stop_reason = end_turn
Cùng với câu trả lời:
"Hôm nay Đà Nẵng có khả năng mưa khoảng 85%. Bạn nên mang theo ô nếu ra ngoài."
Toàn bộ Agentic Loop kết thúc tại đây (terminates). Tại sao phải append tool results vào conversation history?
Đây là điểm rất quan trọng nhưng cũng thường bị bỏ qua.
Claude không ghi nhớ kết quả của tool một cách tự động. Mỗi lần suy luận mới, model chỉ nhìn thấy những gì có trong conversation history.
Nếu Coordinator chỉ thực thi tool mà không đưa kết quả trở lại conversation, Claude sẽ không biết:
- Tool vừa trả về điều gì.
- Có cần gọi thêm tool khác hay không.
- Có đủ dữ liệu để trả lời người dùng chưa.
Việc sử dụng giá trị stop_reason giúp tránh các anti-patterns:
Một Agentic Loop được thiết kế đúng sẽ không cố gắng tự đoán trạng thái của model.
Ví dụ, đây đều là những anti-pattern phổ biến:
- Đọc nội dung phản hồi của assistant rồi suy luận rằng "có vẻ đã xong".
- Kiểm tra xem phản hồi có chứa những từ như "Completed", "Done", "Finished" để quyết định kết thúc.
- ví dụ: Trong response có chứa từ "completed" hoặc "done" sẽ dừng tuy nhiên phản hồi có thể trả về 1 từ đồng nghĩa như "success" sẽ khiến coordinator runtime hiểu sai về response của model -> sai next action.
- Thiết lập số vòng lặp cố định (ví dụ tối đa 5 lần) làm cơ chế dừng chính.
Thay vào đó, Coordinator Runtime chỉ cần dựa vào stop_reason mà model trả về. Đây là tín hiệu điều khiển (control signal) được thiết kế riêng để orchestration, giúp vòng lặp hoạt động ổn định, rõ ràng và đáng tin cậy hơn.
KẾT LUẬN:
Trong Agentic Architecture, Coordinator Runtime không quyết định thay cho model nên làm gì tiếp theo. Vai trò của nó là điều phối vòng lặp dựa trên tín hiệu stop_reason.
- tool_use → thực thi tool, append kết quả vào conversation history và để Claude tiếp tục suy luận.
- end_turn → kết thúc vòng lặp và trả kết quả cho người dùng.