在调用 OpenAI 的接口进行多轮对话时,管理会话状态(Conversation State) 是实现流畅人机交互的关键。本文将详细介绍几种实用的对话状态管理方式,并结合代码案例展示如何操作,帮助你构建更自然、记忆感更强的多轮对话系统。

💡 本文默认你已接入 OpenAI API。如果还没有稳定接入通道,可参考我们推荐的国内 API 中转站:首页 - 灵客 API - 统一大模型接口网关,企业级 AI 接口服务平台(推荐 baseURL 为 https://api.aaaaapi.com,稳定、低延迟)。


一、手动管理对话历史:构建多轮会话

OpenAI 的每次响应请求都是“无状态”的。这意味着你每次调用接口时,模型不会记住之前的内容。要实现连续对话,我们需要手动传入历史消息列表来“模拟记忆”。

例如下面的 Knock-Knock 笑话:

JavaScript 示例

import OpenAI from "openai";

const openai = new OpenAI({ baseURL: "https://api.aaaaapi.com" });

const response = await openai.responses.create({
  model: "gpt-4o-mini",
  input: [
    { role: "user", content: "knock knock." },
    { role: "assistant", content: "Who's there?" },
    { role: "user", content: "Orange." }
  ]
});

console.log(response.output_text);

Python 示例

from openai import OpenAI

client = OpenAI(base_url="https://api.aaaaapi.com")

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

print(response.output_text)

二、通过响应结果动态更新上下文

假如你想让模型记住之前的回答,在下一次请求中继续上下文,可以将模型的输出内容追加进历史对话中

示例:让模型接着讲笑话

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

const response = await openai.responses.create({
  model: "gpt-4o-mini",
  input: history,
  store: true
});

console.log(response.output_text);

// 把模型的回答追加进历史对话中
history = [...history, ...response.output.map(el => ({
  role: el.role,
  content: el.content
}))];

// 用户再发一句
history.push({
  role: "user",
  content: "tell me another"
});

const secondResponse = await openai.responses.create({
  model: "gpt-4o-mini",
  input: history,
  store: true
});

console.log(secondResponse.output_text);

三、使用 previous_response_id 管理对话线程

OpenAI 提供了一个方便的参数:previous_response_id,可以用来自动衔接之前的对话上下文

你无需每次手动传入完整历史,只需将 previous_response_id 指定为上一次回复的 ID,模型会自动读取前文上下文。

示例:解释为什么笑话好笑

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

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

四、关于数据保留与隐私

  • 默认情况下,响应对象会在 OpenAI 后台 保留 30 天,用于查询、调试;

  • 你可以通过 store=False 关闭存储;

  • OpenAI 不会用于训练模型,除非你明确授权。


五、理解上下文窗口与 Token 限制

每次模型请求都受“上下文窗口”限制:

模型 上下文窗口 最大输出
gpt-4o-2024-08-06 128K tokens 16,384 tokens

上下文窗口包括:

  • 输入 tokens

  • 输出 tokens

  • Reasoning tokens(某些推理模型使用)

你可以使用 Tokenizer 工具 估算当前 token 数。

超出上下文限制的内容将被截断,因此建议控制历史消息长度。


六、小结与推荐


📌 参考资料


需要更深入地集成对话状态管理?欢迎留言交流,或关注我们后续实战系列内容。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐