載入中

我們目前所寫的程式碼模擬了與 Claude 之間非常簡單的交流。但是當您想要繼續一段對話時會發生什麼呢?當您在問了「1+1 是多少?」之後,又問了一個後續問題,例如「再加 3 呢?」,您可能會期望 Claude 理解您是在詢問將 3 加到先前結果 2 上。

然而,關於 Bedrock API 和 Claude 本身,有一件關鍵的事情您需要了解。

沒有訊息儲存

Bedrock 和 Claude 不會儲存任何訊息。您發送的訊息不會被儲存,您收到的回應也不會被儲存。每次 API 呼叫都是完全獨立的。

要進行一段包含多則訊息並維持上下文的對話,您需要:

  • 在您的程式碼中手動維護一份所有訊息的清單
  • 在每次後續請求中提供該完整的訊息清單

為什麼上下文很重要

讓我們看看在沒有適當上下文的情況下會發生什麼。如果您只發送「再加 3 呢?」作為一則獨立的訊息,Claude 完全不知道您指的是什麼。它會盡力回應,但答案不會有意義,因為它缺乏您先前對話的上下文。

當您只發送後續問題時,Claude 只會看到那則孤立的訊息,並試圖在不知道先前「1+1 是多少?」交流的情況下做出回應。

建立對話上下文

要維持上下文,您需要在每次請求中包含完整的對話歷史。以下是運作方式:

您的訊息清單應包含所有先前的交流——包括使用者訊息和助手回應。當您發送這個完整的上下文時,Claude 就能理解「再加 3 呢?」指的是將 3 加到先前結果 2 上。

用於訊息管理的輔助函式

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

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

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

def chat(messages):
    response = client.converse(
        modelId=model_id,
        messages=messages
    )
    return response["output"]["message"]["content"][0]["text"]

實作多輪對話

以下是逐步建立對話的方法:

python
# 建立一個初始訊息列表
messages = []

# 加入使用者最初的問題「What's 1+1?」
add_user_message(messages, "What's 1+1?")

# 將訊息列表傳入 chat 以取得答案
answer = chat(messages)

# 取得答案並將其作為 assistant 訊息加入我們的列表
add_assistant_message(messages, answer)

# 加入使用者的後續問題
add_user_message(messages, "And 3 more added to that?")

# 再次呼叫 chat 並傳入訊息列表以取得最終答案
answer = chat(messages)
print(answer)

這種方法確保 Claude 擁有完整的上下文,並能適當地回應:「從 1+1 = 2 的結果開始,如果我們再加 3,我們得到:2 + 3 = 5」

訊息角色交替

在建立您的訊息清單時,請務必確保訊息角色正確交替:

您的對話應遵循以下模式:使用者 → 助手 → 使用者 → 助手。絕不要連續出現兩則使用者訊息或兩則助手訊息。這種交替模式是 API 所要求的,也反映了自然的對話流程。

雖然這種手動訊息管理一開始可能看起來很繁瑣,但您很快就會習慣。這種模式是建構任何需要與 Claude 維持對話上下文的應用程式的基礎。