📖 Nội dung bài học
Tóm tắt
Để xây dựng hệ thống hội thoại có sử dụng tool, bạn cần triển khai một vòng lặp gọi Claude liên tục cho đến khi nó ngừng yêu cầu sử dụng tool. Khi Claude không còn yêu cầu tool nữa, điều đó báo hiệu nó đã sẵn sàng đưa ra phản hồi cuối cùng cho người dùng.
Phát hiện yêu cầu Tool
Điểm mấu chốt để biết Claude có muốn sử dụng tool hay không nằm ở trường stop_reason trong tin nhắn phản hồi. Khi Claude quyết định cần gọi một tool, trường này sẽ được đặt thành "tool_use". Điều này cho phép chúng ta kiểm tra xem có cần tiếp tục vòng lặp hội thoại hay không:
if response.stop_reason != "tool_use":
break # Claude đã xong, không cần thêm tool nào nữa
Vòng lặp Hội thoại
Hàm hội thoại chính tuân theo một mẫu đơn giản:
def run_conversation(messages):
while True:
response = chat(messages, tools=[get_current_datetime_schema])
add_assistant_message(messages, response)
print(text_from_message(response))
if response.stop_reason != "tool_use":
break
tool_results = run_tools(response)
add_user_message(messages, tool_results)
return messages
Vòng lặp này tiếp tục cho đến khi Claude đưa ra câu trả lời cuối cùng mà không yêu cầu thêm tool nào.
Xử lý nhiều lệnh gọi Tool
Claude có thể yêu cầu nhiều tool trong một phản hồi duy nhất. Nội dung tin nhắn chứa một danh sách các block, và chúng ta cần xử lý từng block sử dụng tool một cách riêng biệt:

Hàm run_tools xử lý việc này bằng cách lọc các block sử dụng tool và xử lý từng cái một:
def run_tools(message):
tool_requests = [
block for block in message.content if block.type == "tool_use"
]
tool_result_blocks = []
for tool_request in tool_requests:
# Xử lý từng yêu cầu tool...
Các Block Kết quả Tool
Với mỗi block sử dụng tool, chúng ta cần tạo một block kết quả tool tương ứng. Các block này có các trường bắt buộc cụ thể:

Block kết quả tool phải bao gồm cùng ID với block sử dụng tool ban đầu, nhưng trong trường tool_use_id:
tool_result_block = {
"type": "tool_result",
"tool_use_id": tool_request.id,
"content": json.dumps(tool_output),
"is_error": False
}
Xử lý Lỗi
Việc thực thi tool một cách mạnh mẽ đòi hỏi phải xử lý các lỗi tiềm ẩn. Khi một tool gặp lỗi, chúng ta vẫn cần trả về một block kết quả tool, nhưng có kèm thông tin lỗi:
try:
tool_output = run_tool(tool_name, tool_input)
tool_result_block = {
"type": "tool_result",
"tool_use_id": tool_request.id,
"content": json.dumps(tool_output),
"is_error": False
}
except Exception as e:
tool_result_block = {
"type": "tool_result",
"tool_use_id": tool_request.id,
"content": f"Error: {e}",
"is_error": True
}
Định tuyến Tool có khả năng mở rộng
Để hỗ trợ nhiều tool, hãy tạo một hàm định tuyến riêng thay vì mã hóa cứng tên tool:
def run_tool(tool_name, tool_input):
if tool_name == "get_current_datetime":
return get_current_datetime(**tool_input)
elif tool_name == "other_tool":
return other_tool_function(**tool_input)
# Thêm nhiều tool khi cần
Cách tiếp cận này giúp dễ dàng thêm các tool mới mà không cần sửa đổi logic hội thoại cốt lõi.
Quy trình Hoàn chỉnh
Hội thoại đa lượt hoàn chỉnh hoạt động như sau:
- Gửi tin nhắn người dùng tới Claude cùng các tool khả dụng.
- Claude phản hồi bằng văn bản và/hoặc các block sử dụng tool.
- Thực thi bất kỳ tool nào được yêu cầu và tạo các block kết quả tool.
- Gửi kết quả tool trở lại Claude dưới dạng tin nhắn người dùng.
- Lặp lại cho đến khi Claude cung cấp phản hồi cuối cùng mà không yêu cầu tool.
Điều này tạo ra trải nghiệm liền mạch, nơi Claude có thể thực hiện nhiều lệnh gọi tool qua nhiều lượt hội thoại để thu thập tất cả thông tin cần thiết trước khi đưa ra câu trả lời cuối cùng toàn diện cho người dùng.
Tải xuống
🔁 Bài học liên quan
- Bài tiếp: Using multiple tools
- Bài trước: Multi-turn conversations with tools
- Cùng section: Making a request · Multi-turn conversations · Chat exercise
- Thuộc lộ trình: Path C
- Docs tham khảo: Glossary · Skills atlas · By use-case
📚 Nguồn & ghi nhận
- Bài học gốc Anthropic Academy: https://anthropic.skilljar.com/claude-with-google-vertex/289182
- © 2025 Anthropic. Chỉ dùng cho mục đích giáo dục, fair-use.
- Crawl: — · Chuẩn hoá: 2026-05-01