如何让基于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
相关产品推荐
相关产品推荐

