到目前为止,我们编写的代码模拟了与 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)
# 获取答案并将其作为助手消息添加到列表中
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 保持对话上下文的应用程序的基础。