为什么?
因为 LLM 是无状态的。每一次 API 调用,它都不记得你上一句说了什么。你觉得它“记住”了,其实是 Agent 把整段对话历史偷偷重发了一遍。
哈喽大家好,我是二哥呀。今天用 3 分钟,带你搞清楚 Agent 短期记忆的实现原理。
面试官问这道题,考三层:第一,短期记忆的底层原理你懂不懂;第二,上下文窗口的物理限制你清不清楚;第三,窗口不够用了你怎么处理。
好,接下来给你满分回答,照着背就完事了。
第一,搞清楚短期记忆到底是什么。
答案就四个字——messages 数组。
LLM 是无状态的,每次调用从零开始。所谓的“记忆”,是因为 Agent 维护了一个 messages 数组,按顺序存着每一轮对话。数组里有四种角色:system 是系统指令,user 是用户输入,assistant 是模型回复,tool 是工具调用的返回结果。
每次调 API,应用把整个数组全量发给模型。模型读完所有消息,才能“知道”你前面说过什么。
打个比方。模型是一个每次考试都被清空记忆的考生,Agent 是帮他把之前所有答卷重新抄一遍的助手。模型“记住你的名字”,不是因为它有记忆,是因为你说名字的那条消息还在 messages 数组里,每次都被重新发过去了一遍。
第二,上下文窗口的大小决定了短期记忆的最大容量。
数组越长,token 就越多。但上下文窗口是有上限的——DeepSeek V4 是 1M token。听起来很大,但长对话和复杂任务会比你想象的更快把它填满。
还有个问题就是:Lost in the Middle。研究表明,LLM 对上下文的注意力呈 U 形分布——开头和结尾关注度高,中间容易被忽略。你以为信息“在窗口里”就万事大吉,但模型可能根本没注意到。
第三,窗口不够用了怎么办?三种策略。
第一种,滑动窗口。只保留最近 N 轮对话,早期的直接丢掉。Spring AI 的 MessageWindowChatMemory 就是这个思路,默认保留 20 条消息,按轮次丢弃——一个 UserMessage 加上后面所有的 assistant 回复和 tool 调用算一轮,但不会从对话中间切断。零成本,但早期的信息会彻底消失。
第二种,摘要压缩。用 LLM 把早期对话压缩成一段摘要,替换掉原始消息。Claude Code 就是这么干的——上下文到 83% 容量时自动触发,把前面的对话压缩成一份九段式结构化摘要,覆盖核心任务、技术上下文、文件变更等关键信息。token 省了,语义还在。代价是细节丢失——就像高清照片压成了缩略图,容易糊。
第三种,混合策略。旧的消息压缩成摘要,近期的消息保留原文。LangChain 的 ConversationSummaryBufferMemory 就是这个思路——远的记大意,近的留原话。这是生产环境最常用的一种。
面试官如果追问:“三种策略怎么选?”
告诉他——看场景。短对话、十轮以内,滑动窗口就够用了。长对话、几十轮往上,就选混合策略,兼顾全局语义和近期细节。还有一个维度:任务型 Agent 只关心当前指令和最近几步结果,早期上下文不重要,滑动窗口就够用。对话型 Agent 需要理解用户偏好和历史意图,全局语义很关键,必须用摘要兜住早期信息。
最后送大家一句口诀——模型无状态,记忆靠数组;窗口装不下,压缩是出路。
这道题你学废了吗?想解锁更多 Agent 面试题的源码级拆解,点赞关注,我是二哥,下期见!

