For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
主导航

对话状态

了解如何在与模型交互时管理对话状态。

OpenAI 提供了几种管理对话状态的方式。对话状态对于在多条消息或多轮对话之间保留信息至关重要。

排查 GPT-5.5 将中途的进度更新误当作 最终回答的问题时,请确认您的集成正确保留了助手消息的 phase 字段。详情请参阅阶段 参数

手动管理对话状态

虽然每个文本生成请求都是独立且无状态的,但您仍可以将额外的消息作为参数传入文本生成请求,实现 多轮对话 。以一个敲门笑话为例:

手动构建历史对话
from openai import OpenAI

client = OpenAI()

response = client.responses.create(
    model="gpt-6-astra",
    input=[
        {"role": "user", "content": "knock knock."},
        {"role": "assistant", "content": "Who's there?"},
        {"role": "user", "content": "Orange."},
    ],
)

print(response.output_text)

通过交替使用 userassistant 消息,您可以在向模型发送的一次请求中包含对话的先前状态。

要手动在生成的响应之间共享上下文,请将模型上一次响应的输出作为输入,追加到您的下一次请求中。

对于无状态的推理模型请求,请保留响应中 output 数组的每一项。Responses API 默认返回加密的推理项。重新传入完整输出可以完整保留推理项和助手的 phase 值。支持持久化推理的模型可以使用 reasoning.context: "all_turns",将先前轮次中可用的推理内容纳入下一次采样。请参阅在调用之间保留推理

在以下示例中,我们先请模型讲一个笑话,然后再请它讲一个。以这种方式将先前的响应追加到新请求中,有助于使对话保持自然,并保留先前交互的上下文。

使用 Responses API 手动管理对话状态。
from openai import OpenAI

client = OpenAI()

history = [{"role": "user", "content": "tell me a joke"}]

response = client.responses.create(
    model="gpt-6-astra",
    input=history,
    store=False,
)

print(response.output_text)

# Add all response output items, including encrypted reasoning items, to the conversation
history += response.output

history.append({"role": "user", "content": "tell me another"})

second_response = client.responses.create(
    model="gpt-6-astra",
    input=history,
    store=False,
)

print(second_response.output_text)

用于管理对话状态的 OpenAI API

我们的 API 让自动管理对话状态变得更简单,您无需在每一轮对话中手动传入输入。

使用 Conversations API

Conversations APIResponses API 配合使用,将对话状态持久化为一个长期存在的对象,并为其分配持久标识符。创建对话对象后,您可以在不同会话、设备或作业中持续使用它。

对话存储的条目可以是消息、工具调用、工具输出及其他数据。

创建对话
conversation = openai.conversations.create()

在多轮交互中,您可以将 conversation 传入后续响应,以持久化状态并在后续响应之间共享上下文,无需将多个响应项串联起来。

使用 Conversations API 和 Responses API 管理对话状态
response = openai.responses.create(
    model="gpt-6-astra",
    input=[{"role": "user", "content": "What are the 5 Ds of dodgeball?"}],
    conversation=conversation.id,
)

传递上一次响应的上下文

另一种管理对话状态的方式是使用 previous_response_id 参数,在生成的响应之间共享上下文。此参数可让您串联响应,创建前后关联的对话。

传入上一次响应的 ID,串联多轮响应
from openai import OpenAI

client = OpenAI()

response = client.responses.create(
    model="gpt-6-astra",
    input="tell me a joke",
)
print(response.output_text)

second_response = client.responses.create(
    model="gpt-6-astra",
    previous_response_id=response.id,
    input=[{"role": "user", "content": "explain why this is funny."}],
)
print(second_response.output_text)

在以下示例中,我们先请模型讲一个笑话,然后在另一次请求中请它解释笑点。模型拥有给出良好回答所需的全部上下文。

使用 Responses API 手动管理对话状态
from openai import OpenAI

client = OpenAI()

response = client.responses.create(
    model="gpt-6-astra",
    input="tell me a joke",
)
print(response.output_text)

second_response = client.responses.create(
    model="gpt-6-astra",
    previous_response_id=response.id,
    input=[{"role": "user", "content": "explain why this is funny."}],
)
print(second_response.output_text)

WebSocket 模式下的 previous_response_id

如果您使用 Responses API 的 WebSocket 模式,续接时的 previous_response_id 语义与 HTTP 模式相同,但交互通过持久套接字上重复发送的 response.create 事件进行。

连接本地缓存会在内存中保留最近的响应,以便低延迟地续接。使用 stream_id 时,每个通道都可以保留其最新响应;previous_response_id 仍控制响应的继承关系,因此只要另一通道上的某个响应仍然可用,新通道就可以从该响应派生。如果无法解析某个未缓存的 ID,请发送新一轮请求,将 previous_response_id 设为 null,并传入完整的输入上下文。

即使使用 previous_response_id,响应链中所有先前的输入 Token 仍会在 API 中按输入 Token 计费。

管理上下文窗口

了解上下文窗口有助于您顺利创建前后关联的对话,并在与模型的多次交互之间管理状态。

上下文窗口 是单次请求中可使用的最大 Token 数,包括输入、输出和推理 Token。要了解您所用模型的上下文窗口,请参阅模型详情

管理文本生成的上下文

随着输入变得更复杂,或对话轮次增多,您需要同时考虑 输出 Token上下文窗口 的限制。模型的输入和输出以 Token 为单位计量。输入被解析为 Token,以分析其内容和意图;输出则由 Token 组合而成,以呈现合乎逻辑的结果。模型对文本生成请求整个生命周期内的 Token 用量设有限制。

  • 输出 Token 是模型响应提示时生成的 Token。每个模型的输出 Token 上限各不相同。例如,gpt-4o-2024-08-06 最多可生成 16,384 个输出 Token。
  • 上下文窗口 表示输入和输出可使用的 Token 总量(某些模型还包括推理 Token)。您可以比较我们各个模型的上下文窗口上限。例如,gpt-4o-2024-08-06 的上下文窗口总量为 128k Token。

如果您创建了很长的提示,通常是因为为模型添加了额外的上下文、数据或示例,就可能超出模型的上下文窗口限制,导致输出被截断。

您可以使用基于 tiktoken 库构建的 Token 化工具,查看特定文本字符串包含多少个 Token。

例如,使用支持推理的模型(如 o1 模型)向 Responses API 发出 API 请求时,以下 Token 数量会计入上下文窗口总量:

  • 输入 Token(您在 Responses APIinput 数组中包含的输入)
  • 输出 Token(为响应您的提示而生成的 Token)
  • 推理 Token(模型用于规划响应的 Token)

生成的 Token 中超出上下文窗口限制的部分可能会在 API 响应中被截断。

上下文窗口可视化

您可以使用 Token 化工具估算消息将使用的 Token 数量。

压缩

详细的压缩指南现已移至 压缩

后续步骤

如需更多具体示例和使用场景,请访问 OpenAI Cookbook,或进一步了解如何使用 API 扩展模型能力: