恭喜你!当你发现 AI "记不住前文"时,你已经触碰到了大模型应用开发中最核心的逻辑------状态管理。
今天(第4天)的任务是:赋予你的 AI "记忆力"。我们将从原理出发,通过改造代码,让你的机器人能接住你抛出的"烂梗"或连续的业务逻辑。
第一站:解密大模型------为什么它是"鱼的记忆"?
1. 大模型(LLM)到底是什么?
从工程角度看,大模型本质上是一个巨大的数学函数。
f(输入文本)=输出文本f(输入文本) = 输出文本f(输入文本)=输出文本
它不是一个一直运行、有自我意识的实体,而是一个"即用即走"的推理机。
2. 为什么大模型"无记忆"?
- 技术原因(无状态性): 为了保证服务器能同时处理全球数百万人的请求,模型被设计为"无状态(Stateless)"的。这意味着服务器不会为每个用户开辟专门的存储空间来记聊天记录。对它来说,每一次请求都是全新的、独立的。
- 类比: 就像一个极其聪明但只有"秒瞬记忆"的教授。你推门进去问他问题,他答完你就被推出来了;你第二次推门进去,他根本不记得你刚才来过。
第二站:如何赋予它"记忆"?(核心操作)
1. 为什么这么设计?
既然模型记不住,我们就在每次请求时,把之前的聊天记录全部打包发给它。
就像你第二次推门进教授办公室时,手里拿着一张纸,上面写着:"我刚才问了A,你回答了B,现在我想问C。" 教授读完这张纸,就能接上话了。
2. 具体操作:维护 messages 列表
在 OpenAI 的标准接口中,messages 字段是一个列表,它可以按顺序存放多条消息:
{"role": "user", "content": "..."}:用户说的话。{"role": "assistant", "content": "..."}:AI 说的话(必须存进去,否则 AI 记不住自己刚才承诺过什么)。{"role": "system", "content": "..."}:系统指令(设定 AI 的身份,如"你是一个材料学专家")。
🚀 今日最终里程碑:编写"有记忆"的聊天机器人
在 Cursor 中新建文件 day4_memory_bot.py。我们将引入一个全局列表 history 来存储对话。
python
import requests
def start_memory_bot():
url = "https://api.siliconflow.cn/v1/chat/completions"
api_key = "你的API_KEY"
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
# --- 关键:创建一个列表来存放对话上下文 ---
# 我们先放一个 system 消息,设定它的专家身份
history = [
{"role": "system", "content": "你是一位资深的高分子材料研发工程师,擅长PI、CPI等材料的合成与性能分析。"}
]
print("=== 记忆助手已启动 (输入 'clear' 重置记忆,'quit' 退出) ===")
while True:
user_input = input("\n👤 你: ")
if user_input.lower() in ["quit", "退出"]:
break
# 增加一个重置记忆的功能
if user_input.lower() == "clear":
history = [{"role": "system", "content": "你是一位资深工程师。"}]
print("✨ 记忆已清空!")
continue
# 1. 把用户的新问题 append 到 history 列表中
history.append({"role": "user", "content": user_input})
payload = {
"model": "Qwen/Qwen2.5-7B-Instruct",
"messages": history, # 2. 发送的是整个列表,而不仅仅是最后一句话
"temperature": 0.7
}
try:
response = requests.post(url, headers=headers, json=payload)
if response.status_code == 200:
res_json = response.json()
ai_reply = res_json["choices"][0]["message"]["content"]
print(f"🤖 AI: {ai_reply}")
# 3. 重要!把 AI 的回答也 append 到 history 中
# 这样下次提问时,模型才知道它刚才说了什么
history.append({"role": "assistant", "content": ai_reply})
else:
print(f"请求失败: {response.status_code}")
except Exception as e:
print(f"错误: {e}")
if __name__ == "__main__":
start_memory_bot()
验证环节:如何证明它有记忆了?
运行代码后,请按顺序输入以下问题进行测试:
- 输入: "你好,我叫王小明,我正在研究聚酰亚胺的透光率。"
- AI 回答: 应该会以专家身份欢迎你。
- 输入: "我刚才说我叫什么名字?我在研究什么?"
- 验证: 如果 AI 能准确答出"你叫王小明"和"研究聚酰亚胺透光率",说明 上下文记忆功能成功跑通!
- 输入: "clear"
- 再问: "我是谁?"
- 验证: AI 应该表示不认识你。
💡 学习技巧:注意"长度爆炸"
这种把所有记录都发过去的方法有一个缺陷:对话越长,消耗的 Token 越多,且模型会有长度限制(Context Window)。
在实际项目中(比如第 6 周),我们会学习如何"裁剪"这个列表,只保留最近的几轮对话。但今天,请先尽情享受这种"能接话"的快感!