You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在OpenAI重复API调用中维护对话历史上下文?

重复调用OpenAI API时维护对话上下文的实现方式

核心思路

本质是每次调用API时,把完整的对话历史作为参数传给OpenAI接口,而不是只传当前的单条消息。结合你提到的Demo源码,具体实现分为客户端和后端两部分:


1. 客户端维护对话历史

  • 在前端用状态管理(比如React的useState)保存对话数组,数组里的每一项都包含role(角色:user/assistant/system)和content(消息内容)两个字段。
  • 用户发送新消息时,先把这条消息追加到对话数组里,再将整个数组传给后端API。
  • 收到后端返回的AI回复后,再把AI的消息也追加到对话数组,更新前端状态,这样下一次请求就能带上完整的历史。

2. 后端API处理对话历史

  • 后端接口接收客户端传来的对话数组,直接将其作为OpenAI API的messages参数传入。
  • 调用OpenAI的chat.completions.create方法时,模型会基于传入的完整对话上下文生成回复。

关键代码示例

客户端请求逻辑(简化版)

// 假设用React状态管理对话历史
const [chatHistory, setChatHistory] = useState([]);

const sendNewMessage = async (userInput) => {
  // 追加用户消息到历史
  const tempHistory = [...chatHistory, { role: 'user', content: userInput }];
  
  // 调用后端接口,传入完整对话历史
  const res = await fetch('/api/chat', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ messages: tempHistory })
  });
  
  const data = await res.json();
  // 追加AI回复到历史,更新状态
  setChatHistory([...tempHistory, { role: 'assistant', content: data.answer }]);
};

后端接口逻辑(Next.js/TypeScript版)

import { OpenAI } from 'openai';

const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });

export default async function handler(req, res) {
  const { messages } = req.body;
  
  try {
    const completion = await openai.chat.completions.create({
      model: 'gpt-3.5-turbo',
      messages: messages, // 直接传入完整对话历史
      temperature: 0.7
    });
    
    res.status(200).json({ 
      answer: completion.choices[0].message.content.trim() 
    });
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
}

注意事项

  • Token限制:对话历史会占用模型的token额度,比如gpt-3.5-turbo的上限是4096token。如果对话过长,需要做截断处理(比如只保留最近5-10条消息),避免触发API报错。
  • 持久化上下文:如果需要用户刷新页面后仍能继续对话,可以把对话历史存在客户端localStorage或后端数据库中,下次加载时恢复。

内容的提问来源于stack exchange,提问作者jhvgh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 07:50:36