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

如何让基于OpenAI的基础ChatBot具备对话记忆功能?

如何为基于OpenAI的ChatBot添加对话记忆

你的问题根源在于text-davinci-003这类基础Completion模型本身没有内置对话上下文记忆——每次API请求都是独立的,模型无法关联之前的对话内容,所以当你问“它的最新版本是什么?”时,模型无法理解“它”指的是Python,只能做无上下文的猜测,导致回答错误。

要实现对话记忆,需要手动维护对话历史,并将历史内容拼接进每次请求的prompt中,让模型能基于完整的对话上下文生成回复。以下是两种可行的实现方案:

方案1:基于Completion接口(适配你原有的text-davinci-003模型)

修改代码,用列表存储对话历史,每次请求时将历史内容格式化为模型可识别的对话格式:

import openai

openai.api_key = "sk-xxx"
# 初始化对话历史,可加入系统提示(可选,用来定义AI的角色)
conversation_history = []

while True:
    user_input = input("User: ")
    # 将用户输入加入历史
    conversation_history.append(f"User: {user_input}")
    
    # 拼接对话历史为完整的prompt,结尾留空让AI继续生成
    full_prompt = "\n".join(conversation_history) + "\nAI:"
    
    response = openai.Completion.create(
        model="text-davinci-003",
        prompt=full_prompt,
        max_tokens=150,  # 适当调高,避免截断回复
        temperature=0.7,  # 可根据需求调整,0更严谨,1更灵活
        stop=["\nUser:"]  # 指定停止符,避免AI模仿用户输入
    )
    
    # 提取并清理AI的回复
    ai_response = response.choices[0].text.strip()
    print(f"AI: {ai_response}")
    
    # 将AI回复加入对话历史,供下次请求使用
    conversation_history.append(f"AI: {ai_response}")

方案2:基于ChatCompletion接口(推荐,适配gpt-3.5-turbo/gpt-4模型)

OpenAI的ChatCompletion接口专门为对话场景设计,内置了对话格式的支持,使用起来更高效且成本更低:

import openai

openai.api_key = "sk-xxx"
# 初始化对话历史,包含系统角色定义(可选)
conversation_history = [
    {"role": "system", "content": "你是一个专业的技术助手,回答准确简洁。"}
]

while True:
    user_input = input("User: ")
    # 添加用户消息到历史
    conversation_history.append({"role": "user", "content": user_input})
    
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=conversation_history,
        max_tokens=150,
        temperature=0.7
    )
    
    # 提取AI回复
    ai_response = response.choices[0].message["content"].strip()
    print(f"AI: {ai_response}")
    
    # 添加AI回复到历史
    conversation_history.append({"role": "assistant", "content": ai_response})

注意事项

  • Token限制:所有模型都有最大token限制(比如text-davinci-003是4097,gpt-3.5-turbo是4096),对话历史累积过多会超过限制。可以在每次请求前检查token总数,对历史进行截断(比如只保留最近N轮对话)。
  • 成本控制:Completion接口的token消耗比ChatCompletion更高,推荐优先使用gpt-3.5-turbo这类对话模型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 03:36:29