为什么?
因为窗口再大也只能是临时的短期记忆。况且这个窗口不能无限大,DeepSeek V4 的窗口已经很大了,也只有 1 兆 token;另外,新开一个窗口,之前的临时记忆也会消失。真正的记忆,要靠 Harness Engineering 和 Context Engineering。
哈喽大家好,我是二哥呀。前两期我们讲了,LLM 是没有记忆的,上下文窗口是有大小限制的。今天讲最关键的一期——怎么样才能让 Agent 真正拥有记忆?
面试官问这道题,考三层:第一,短期记忆和长期记忆分别解决了什么问题;第二,各自怎么实现;第三,记忆存多了怎么维护。
好,接下来给你满分回答,照着背就完事了。
LLM 是无状态的。Agent 想要拥有记忆,需要在工程层面维护两样东西:短期记忆和长期记忆。
先说短期记忆。短期记忆解决的是一次对话内的问题——怎么在有限的上下文窗口里,保留尽可能多的有效信息。
两个办法。
第一个,滑动窗口。只保留最近 N 轮对话,最早的直接丢掉。简单粗暴,但有用。大部分场景下,最近几轮的上下文是会比开头的更重要。
第二个,摘要压缩。用 LLM 把早期的 20 轮对话压缩成一段 200 字的摘要,塞回窗口继续用。token 省了,关键信息还在。Claude Code 就是这么干的,对话太长的时候,系统会自动把前面的内容压缩成摘要。
再说长期记忆。长期记忆解决的是跨对话的问题——你今天告诉 Agent 你叫什么、做什么工作,下次新开对话,它还认识你。
怎么做到?四步。
第一步,提取。Agent 从对话中识别出关键信息。比如“用户是程序员”“偏好用 Python”“项目用的是 Spring AI”。
第二步,存储。把这些信息写进外部文件或者数据库,持久化保存。对话结束了,信息还在。
第三步,检索。下次新开对话,根据用户当前的输入,找出相关的记忆。
第四步,注入。把检索到的记忆塞进 system prompt。模型一读,就“看到”了你的历史信息。
举个例子。Claude Code 的记忆系统就是把关键信息写成 markdown 文件存在本地项目里。每次新对话启动,自动把这些文件加载进上下文。模型本身还是无状态的,但你感觉它“认识”你。
面试官如果追问:“记忆存多了、过时了怎么办?”
告诉他——靠记忆反思(Memory Reflection)。Agent 会定期回顾已有的记忆,做三件事:
- 第一,更新过时信息,比如用户换了工作,旧的职位要标记为过期;
- 第二,合并重复内容,五次对话都提到“偏好 Python”,合成一条就够了;
- 第三,发现矛盾主动修正,存着“用户是素食主义者”,但用户问“附近哪家牛排馆好”,Agent 会主动确认。
QoderWork 就有记忆反思功能,Agent 会主动检查每条记忆还准不准确、有没有和新的对话矛盾。
最后送大家一句口诀——短期靠压缩,长期靠外存;提取存检索,注入变记忆。
这道题你学废了吗?想解锁更多 Agent 面试题的源码级拆解,点赞关注,我是二哥,下期见!
