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

然而,關於 Bedrock API 和 Claude 本身,有一件關鍵的事情您需要了解。
沒有訊息儲存
Bedrock 和 Claude 不會儲存任何訊息。您發送的訊息不會被儲存,您收到的回應也不會被儲存。每次 API 呼叫都是完全獨立的。

要進行一段包含多則訊息並維持上下文的對話,您需要:
- 在您的程式碼中手動維護一份所有訊息的清單
- 在每次後續請求中提供該完整的訊息清單
為什麼上下文很重要
讓我們看看在沒有適當上下文的情況下會發生什麼。如果您只發送「再加 3 呢?」作為一則獨立的訊息,Claude 完全不知道您指的是什麼。它會盡力回應,但答案不會有意義,因為它缺乏您先前對話的上下文。

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

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

您的訊息清單應包含所有先前的交流——包括使用者訊息和助手回應。當您發送這個完整的上下文時,Claude 就能理解「再加 3 呢?」指的是將 3 加到先前結果 2 上。
用於訊息管理的輔助函式
為了讓對話管理更容易,您可以建立輔助函式:
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"]實作多輪對話
以下是逐步建立對話的方法:
# 建立一個初始訊息列表
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 維持對話上下文的應用程式的基礎。