先说结论:上一期的Agent是个"金鱼脑",聊完就忘。今天改几行代码,让它记住你说过的每一句话。
上期回顾
上一期我们搭了一个能对话的Agent,20行代码跑起来,体验不错。但用着用着你会发现一个尴尬的问题——
你跟它说"我叫小明",下一句问"我叫什么名字?"
它一脸茫然:抱歉,我不知道你的名字。
为什么?因为每次你提问,Agent都把之前的对话忘得一干二净。对它来说,每次都是"初次见面"。
这就是今天要解决的问题。
什么是Agent的"记忆"?
一句话讲清楚:把聊天记录存下来,每次提问时一起发给模型。
ChatGPT为什么能记住你说过的话?不是它真的"记得",而是每次对话时,系统自动把之前的聊天记录打包发给模型。模型读到完整上下文,自然就能"接上话"了。
我们的Agent也要做同样的事。原理就这么简单——不需要数据库,不需要向量检索,一个列表就够了。
动手改造:3处改动装上记忆
打开上一期的 first_agent.py,我们在原代码基础上改3个地方。
改动一:新建对话历史列表
在代码开头加一个列表,用来存所有对话:
# 新增:对话历史,记住你说过的话 |
conversation_history = [ |
{"role": "system", "content": system_prompt} |
] |
这个列表一开始就放好了Agent的"人设"(system_prompt),后面每说一句话,就往里追加一条。
改动二:每次提问前,把你的话存进历史
# 把你说的话存进历史 |
conversation_history.append({"role": "user", "content": user_input}) |
改动三:发送完整历史,并把回复也存进去
response = client.chat.completions.create( |
model="deepseek-chat", |
messages=conversation_history # 关键:从单条消息变成完整历史 |
) |
reply = response.choices[0].message.content |
# 把AI的回答也存进历史 |
conversation_history.append({"role": "assistant", "content": reply}) |
就这3处改动,Agent就从"金鱼脑"变成了"记性好"。
完整代码
把改好的代码另存为 agent_with_memory.py:
from openai import OpenAI |
client = OpenAI( |
api_key="你的API密钥", # 替换成你自己的Key |
base_url="https://api.deepseek.com" |
) |
agent_name = "小白学习助手" |
system_prompt = "你是一个温柔耐心的AI学习助手,用通俗易懂的语言回答问题" |
# 新增:对话历史,用来记住你说过的话 |
conversation_history = [ |
{"role": "system", "content": system_prompt} |
] |
print(f"{agent_name} 已启动!输入「退出」结束对话\n") |
while True: |
user_input = input("我:") |
if user_input.lower() in ["退出", "exit", "quit"]: |
print("再见~") |
break |
# 把你说的话存进历史 |
conversation_history.append({"role": "user", "content": user_input}) |
# 把完整对话历史发给模型 |
response = client.chat.completions.create( |
model="deepseek-chat", |
messages=conversation_history |
) |
reply = response.choices[0].message.content |
# 把AI的回答也存进历史 |
conversation_history.append({"role": "assistant", "content": reply}) |
print(f"{agent_name}:{reply}\n") |
运行后试试这样对话:
我:我叫小明,今年大二,数学专业 |
小白学习助手:你好小明!大二数学专业,很厉害呀~ |
我:我之前学过一点Python,能帮我规划一下Agent学习路线吗? |
小白学习助手:好的小明!既然你有Python基础,我建议这样安排…… |
我:对了,我叫什么名字来着? |
小白学习助手:你叫小明呀,你刚才告诉我的~ |
它记住了!因为你说的每一句话、它回的每一句,都存在 conversation_history 里,每次提问时整个列表一起发给了模型。
代码解读:到底发生了什么?
对比上一期,核心变化就3处:
对比项 | 上一期 | 本期 |
对话存储 | 没有,每次只发当前一条消息 | 用列表存所有对话记录 |
发送内容 | messages = system + 当前消息 | messages = conversation_history(完整历史) |
回复处理 | 打印完就丢 | 打印后存进历史列表 |
conversation_history 这个列表是整个"记忆"功能的核心:
1. 初始化时:放入system设定(Agent人设)
2. 你说话时:追加 role: user 到列表
3. AI回复后:追加 role: assistant 到列表
4. 下次提问时:整个列表一起发给模型
就这么一个列表,存取追加,Agent就有了"记忆"。所有AI对话产品的记忆功能,底层都是这个逻辑——不是什么高科技,就是存个聊天记录。
一个要提前知道的问题:聊太多会"撑爆"
你可能会想到:聊100轮,历史不就越来越长?
没错。对话历史越长,每次发送的数据量越大,带来两个后果:
1. 费用增加:模型按token计费,历史越长,每次花的钱越多
2. 超限报错:超过模型的上下文窗口上限会报错
不过别担心,日常学习场景几十轮对话完全够用。等系列后面讲到"长期记忆"时,我们会解决这个问题——只记住重要的内容,忘掉无关的闲聊。
本期小结
知识点 | 一句话总结 |
Agent记忆的本质 | 把聊天记录存成列表,每次一起发给模型 |
role字段 | system=人设,user=你的话,assistant=AI回复 |
实现方式 | 追加到列表→ 发送完整列表 → 回复也追加 |
局限性 | 历史太长会超限,后续用"长期记忆"解决 |
下期预告
有了记忆,Agent已经像个"能聊天的朋友"了。但它还只会说,不会做。
下一期,我们给Agent加上工具调用能力——让它能联网搜索信息、读取本地文件、甚至帮你写代码。从"聊天机器人"正式升级为"能干活的Agent"。
如果这篇对你有帮助,欢迎关注「慕亭的AI笔记」,我们下期见。
夜雨聆风