如何让OpenAI GPT-3 API模型记住对话及训练LLM存储特定上下文
如何让GPT-3 API记住过往对话及存储特定上下文
一、让GPT-3 API记住过往对话
GPT-3 API本身没有内置对话记忆能力,需要你手动维护对话历史上下文,并在每次API调用时将完整历史传入请求中。
具体实现分两种场景:
- 针对
gpt-3.5-turbo/gpt-4系列模型(推荐使用,原生支持对话格式),通过messages参数传递结构化对话历史,数组元素包含role(user/assistant/system)和content字段:
import openai openai.api_key = "你的API密钥" # 初始化对话历史 conversation_history = [ {"role": "system", "content": "你是一个专业的故事答疑助手。"}, {"role": "user", "content": "我正在看《小王子》,想和你聊这本书的内容。"}, {"role": "assistant", "content": "好的,随时欢迎你的提问。"} ] # 新增用户提问 new_question = "小王子第一次离开星球时,带走了什么?" conversation_history.append({"role": "user", "content": new_question}) # 调用API获取回复 response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=conversation_history ) # 将助手回复加入历史,用于后续对话 assistant_reply = response.choices[0].message["content"] conversation_history.append({"role": "assistant", "content": assistant_reply})
- 针对纯文本补全的GPT-3模型(如
text-davinci-003),需将对话历史格式化为连续文本传入prompt:
prompt = """ 你是一个专业的故事答疑助手。 用户:我正在看《小王子》,想和你聊这本书的内容。 助手:好的,随时欢迎你的提问。 用户:小王子第一次离开星球时,带走了什么? 助手: """ response = openai.Completion.create( model="text-davinci-003", prompt=prompt, max_tokens=100 )
注意:对话历史会占用token额度,当历史长度超出模型token上限时,需对历史进行截断或摘要压缩(比如用LLM自动生成早期对话的摘要,替换原始内容),避免请求失败。
二、让LLM记住特定长篇故事(无需每次输入完整内容)
针对长篇故事的高频提问需求,有三种主流解决方案:
1. 检索增强生成(RAG)
这是当前最实用的方案,无需修改模型本身,核心逻辑如下:
- 将长篇故事拆分为若干短片段(按段落、逻辑节点分割);
- 使用Embedding模型(如OpenAI的
text-embedding-ada-002)将片段转换为向量,存入向量数据库(如FAISS、Chroma); - 用户提问时,先通过向量数据库检索与提问最相关的故事片段;
- 将检索到的片段与提问组合成prompt,传给LLM生成回答。
该方案成本低、灵活性高,支持超长篇文本,还能随时更新故事内容。
2. 微调模型(Fine-tuning)
若使用OpenAI的GPT-3模型,可通过微调让模型“记住”故事内容:
- 准备微调数据集:将故事内容拆解为多组样本,每组样本为
用户提问对应基于故事的精准回答(例如:用户:故事中主角在第几章发现了秘密花园?→助手:主角在第五章发现了秘密花园。); - 通过OpenAI微调API上传数据集,训练自定义模型;
- 训练完成后,直接调用微调后的模型提问,无需再输入故事内容。
注意:微调需要一定的数据准备成本,模型仅能记住训练数据中的内容,泛化性有限,适合对特定内容有高频提问需求的场景。
3. 利用长上下文窗口模型
如果故事长度在模型上下文窗口范围内(如GPT-4 Turbo支持128k token,约9.6万字),可在首次对话时将完整故事传入上下文,后续提问时携带该上下文继续交互。但此方法仅适用于故事长度未超上限的场景,且token消耗较高。
内容的提问来源于stack exchange,提问作者nerdlyfe
相关产品推荐
相关产品推荐

