加载中

Multi-turn conversations with tools

第 26 课10 分钟

在构建具有多个工具的应用程序时,您需要处理Claude可能需要按顺序调用多个工具才能回答单个用户问题的场景。例如,如果用户问"从今天起103天后是星期几?",Claude需要先获取当前日期,然后再加上103天。

这会创建一个多轮对话模式,Claude在提供最终答案之前会发出多个工具请求。您的应用程序需要自动处理这种情况。

多轮工具模式

以下是当Claude需要多个工具时幕后发生的情况:

  1. 用户问:"从今天起103天后是星期几?"
  2. Claude响应一个请求get_current_datetime的工具使用块
  3. 您的服务器调用该函数并返回结果
  4. Claude意识到它需要更多信息,并请求add_duration_to_datetime
  5. 您的服务器调用该函数并返回结果
  6. Claude现在有足够的信息来提供最终答案

构建对话循环

要处理这种模式,您需要一个对话循环,该循环会持续进行,直到Claude停止请求工具:

python
def run_conversation(messages):
    while True:
        response = chat(messages)

        add_assistant_message(messages, response)

        # 伪代码
        if response isn't asking for a tool:
            break

        tool_result_blocks = run_tools(response)
        add_user_message(messages, tool_result_blocks)
        
    return messages

重构辅助函数

在实现对话循环之前,您需要更新辅助函数,以正确处理多个消息块。

更新消息处理程序

您的add_user_message和add_assistant_message函数目前假定您始终处理纯文本。更新它们以处理完整的消息对象:

python
from anthropic.types import Message

def add_user_message(messages, message):
    user_message = {
        "role": "user",
        "content": message.content if isinstance(message, Message) else message
    }
    messages.append(user_message)

这允许您传入字符串、块列表或完整的消息对象。

更新聊天函数

修改您的聊天函数以接受工具列表,并返回完整消息而不仅仅是文本:

python
def chat(messages, system=None, temperature=1.0, stop_sequences=[], tools=None):
    params = {
        "model": model,
        "max_tokens": 1000,
        "messages": messages,
        "temperature": temperature,
        "stop_sequences": stop_sequences,
    }
    
    if tools:
        params["tools"] = tools
        
    if system:
        params["system"] = system
        
    message = client.messages.create(**params)
    return message

从消息中提取文本

由于您现在返回完整的消息对象,创建一个辅助函数以在需要时提取文本:

python
def text_from_message(message):
    return "\n".join(
        [block.text for block in message.content if block.type == "text"]
    )

此函数会查找消息中的所有文本块并将它们连接在一起,这在您需要向用户显示最终响应时非常有用。

关键改进

这些重构步骤为您的代码实现稳健的工具处理做好了准备:

  • 灵活的消息处理 - 您的辅助函数现在可以处理不同的消息格式
  • 聊天中的工具支持 - 聊天函数可以接收并传递工具模式(schema)
  • 完整消息返回 - 您获得完整的消息对象而不仅仅是文本,保留所有块
  • 文本提取实用工具 - 从复杂消息中获取可读文本的简便方法

有了这些基础,您就可以实现自动处理多个工具调用的对话循环,从而创造一种无缝的体验,让Claude可以使用任意数量的工具来回答用户问题。