載入中

Multi-turn conversations

第 4 課7 分鐘

在使用 Anthropic API 和 Claude 時,有一個您需要理解的關鍵概念:Claude 不會儲存您任何的對話歷史記錄。您發出的每個請求都是完全獨立的,對先前的交流沒有任何記憶。

這意味著如果您想要進行多輪對話,讓 Claude 記住先前訊息中的上下文,您需要自行處理對話狀態。

無狀態對話的問題

假設您問 Claude「什麼是量子計算?」並得到了一個很好的回應。然後您接著問「再寫一句話」——Claude 完全不知道您指的是什麼。它會寫出一句完全隨機的句子,因為它對量子計算的討論沒有任何記憶。

多輪對話如何運作

要維持對話上下文,您需要做兩件事:

  • 手動在您的程式碼中維護所有訊息的列表
  • 在每個請求中傳送完整的訊息歷史記錄

以下是實際可行的流程:

  1. 將您的初始使用者訊息傳送給 Claude
  2. 取得 Claude 的回應,並將其以助手訊息的形式加入您的訊息列表
  3. 將您的後續問題作為另一個使用者訊息加入
  4. 將整個對話歷史記錄傳送給 Claude

建立輔助函式

為了讓對話管理更容易,您可以建立三個輔助函式:

python
def add_user_message(messages, text):
    user_message = {"role": "user", "content": text}
    messages.append(user_message)

def add_assistant_message(messages, text):
    assistant_message = {"role": "assistant", "content": text}
    messages.append(assistant_message)

def chat(messages):
    message = client.messages.create(
        model=model,
        max_tokens=1000,
        messages=messages,
    )
    return message.content[0].text

整合所有內容

以下是如何使用這些函式來維持對話:

python
# 從空的訊息清單開始
messages = []

# 加入初始的使用者問題
add_user_message(messages, "Define quantum computing in one sentence")

# 取得 Claude 的回應
answer = chat(messages)

# 將 Claude 的回應加入對話歷史記錄
add_assistant_message(messages, answer)

# 加入後續問題
add_user_message(messages, "Write another sentence")

# 在完整上下文下取得後續回應
final_answer = chat(messages)

現在 Claude 會理解「再寫一句話」指的是擴展量子計算的定義,因為您已經提供了完整的對話上下文。

重點摘要

請記住,每次對 Claude 的 API 呼叫都是獨立的。如果您想要對話上下文,您必須:

  • 在您的應用程式中本地儲存所有訊息
  • 在每個請求中傳送完整的訊息歷史記錄
  • 使用「user」和「assistant」角色正確格式化訊息

這些輔助函式在您使用 Claude 的整個過程中都將是必不可少的,它們能讓您更輕鬆地建立感覺像是自然對話,而非孤立問答交流的應用程式。