載入中

使用工具的多輪對話

第 27 課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"]
    )

此函式會找出訊息中所有的文字區塊並將它們連接在一起,這在您需要向使用者顯示最終回應時非常有用。

為什麼這些變更很重要

這些重構步驟讓您的程式碼準備好應對啟用工具對話的實際情況:

  • 每則訊息包含多個區塊 - Claude 的回應可以同時包含文字和工具使用區塊
  • 靈活的訊息處理 - 您的函式現在可以處理各種訊息格式
  • 完整訊息保留 - 您保留了 Claude 提供的所有資訊,而不僅僅是文字部分
  • 工具列表支援 - 您的聊天函式現在可以接收並使用多個工具

有了這些基礎,您就準備好實作完整的對話迴圈,自動處理多個工具呼叫,創造出無縫的體驗,讓 Claude 能夠使用任何所需的工具來完整回答使用者的問題。