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

Handling tool use responses

📖 Nội dung bài học

Giảm cỡ chữ chú thích-

Tăng cỡ chữ chú thích+ hoặc =

Tóm tắt

Khi Claude quyết định dùng một tool, nó trả về một cấu trúc phản hồi đặc biệt cần được xử lý cẩn thận. Việc hiểu định dạng phản hồi này và triển khai quản lý hội thoại thích hợp là rất quan trọng để xây dựng các ứng dụng hỗ trợ tool mạnh mẽ.

Cấu hình Chọn Tool

Trước khi đi sâu vào các phản hồi, bạn nên hiểu cách kiểm soát khi nào Claude dùng tool. Tham số toolChoice cung cấp cho bạn ba tùy chọn:

  • auto - Claude quyết định có dùng tool hay không (hành vi mặc định)
  • any - Claude phải dùng tool nhưng có thể chọn tool nào
  • specific tool - Buộc Claude dùng một tool cụ thể theo tên

Tùy chọn thứ ba đặc biệt hữu ích để kiểm tra khi bạn muốn đảm bảo Claude gọi một hàm cụ thể.

Cấu trúc Tin nhắn Nhiều Phần

Khi Claude muốn dùng một tool, nó trả về một tin nhắn trợ lý với nhiều phần nội dung thay vì chỉ văn bản:

Phản hồi chứa hai phần:

  • Phần Văn bản - Giải thích dễ đọc cho con người như "Tôi có thể giúp bạn tìm ra thời gian hiện tại. Để tôi tìm thông tin đó cho bạn"
  • Phần ToolUse - Dữ liệu có cấu trúc cho bạn biết tool nào cần chạy và với những đối số nào

Tìm hiểu về Phần ToolUse

Phần ToolUse chứa ba thông tin chính:

  • toolUseId - Một định danh duy nhất bạn cần khi gửi lại kết quả tool
  • name - Tên tool chính xác từ lược đồ JSON của bạn mà Claude muốn gọi
  • input - Một từ điển các đối số Claude muốn truyền cho hàm tool của bạn

Luồng Hội thoại với Tools

Việc dùng tool tuân theo một mẫu hội thoại cụ thể, yêu cầu duy trì toàn bộ lịch sử tin nhắn:

Khi bạn nhận được yêu cầu dùng tool, bạn cần:

  1. Trích xuất thông tin tool từ phần ToolUse
  2. Chạy hàm tool thực tế của bạn
  3. Gửi lại tin nhắn ToolResult cùng với lịch sử hội thoại đầy đủ
  4. Bao gồm tin nhắn người dùng gốc và tin nhắn dùng tool của trợ lý trong yêu cầu tiếp theo của bạn

User message + tools schema

Bedrock Converse API: text part + ToolUse part

1. Extract toolUseId, name, input từ ToolUse part

2. Run tool function thực tế

3. Gửi ToolResult message + full history

4. Final response từ Claude

Cập nhật Hàm Trợ giúp

Để xử lý đúng cách các tin nhắn nhiều phần, bạn cần cập nhật các hàm xử lý tin nhắn của mình. Sau đây là cách làm cho các hàm của bạn đủ linh hoạt để xử lý cả nội dung văn bản đơn giản và nội dung nhiều phần phức tạp:

def add_user_message(messages, content):
    if isinstance(content, str):
        user_message = {"role": "user", "content": [{"text": content}]}
    else:
        user_message = {"role": "user", "content": content}
    messages.append(user_message)

def add_assistant_message(messages, content):
    if isinstance(content, str):
        assistant_message = {"role": "assistant", "content": [{"text": content}]}
    else:
        assistant_message = {"role": "assistant", "content": content}
    messages.append(assistant_message)

Bạn cũng sẽ muốn cập nhật hàm chat của mình để trả về cả văn bản và danh sách đầy đủ các phần:

def chat(messages, system=None, temperature=1.0, stop_sequences=[], tools=None):
    # ... existing setup code ...
    
    response = client.converse(**params)
    
    text = response["output"]["message"]["content"][0]["text"]
    parts = response["output"]["message"]["content"]
    
    return text, parts

Kiểm tra Lý do Dừng

Luôn kiểm tra trường stopReason trong phản hồi của Claude. Khi nó bằng "tool_use", bạn biết Claude muốn gọi một tool thay vì chỉ cung cấp phản hồi văn bản. Đây là tín hiệu của bạn để trích xuất thông tin tool và thực thi hàm được yêu cầu.

Với các mẫu này, bạn đã sẵn sàng xử lý các yêu cầu dùng tool của Claude và duy trì luồng hội thoại thích hợp trong suốt các tương tác tool nhiều lượt.

🔁 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?