Bỏ qua đến nội dung chính

Implementing multiple turns

📖 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

📚 Nguồn & ghi nhận

Bài học có hữu ích không?

Góp ý / Báo lỗiPhát hiện sai sót hoặc có ý tưởng cải thiện?