在 Agent 开发中“长短期记忆”决定了智能体能否在对话与任务中保持上下文、积累经验。下面我从概念划分、实现方案、代码思路三个层面一步步说明怎么做。一、先理清长短期记忆分别承担什么角色记忆类型 时效 容量 存储内容 典型载体短期记忆 单次会话或最近 N 轮 有限受 token 数限制 当前对话历史、中间推理步骤、暂存变量 消息列表、滑动窗口、工作内存长期记忆 跨会话持久化 理论上无限 用户偏好、历史事件、学到的知识、技能 向量数据库、知识图谱、关系数据库这两者经常协同短期记忆保证当前任务的连贯长期记忆提供跨时间的背景和积累的经验。二、短期记忆怎么做最主流的方式是在 LLM 的提示词中保留最近一段对话历史。滑动窗口式缓冲直接将最近 K 轮对话完整放入上下文。· 实现用一个队列deque保存用户消息和助手回复超出长度就弹出最早的。· 优点简单直接。· 缺点当对话很长时旧信息会丢失且 token 消耗增长快。示例Python 伪代码fromcollectionsimportdeque short_termdeque(maxlen10)# 保留最近10条消息defadd_message(role,content):short_term.append({role:role,content:content})defget_context():returnlist(short_term)摘要压缩式记忆当原始对话过长时用 LLM 定期生成摘要用摘要 最近几轮原始对话代替完整历史。· 做法每累计 N 轮对话调用一次 LLM 将旧历史压缩成一段简短总结保存在“摘要变量”中新的上下文由 [摘要] 最近 K 轮原始消息 拼成。· 工具参考LangChain 的 ConversationSummaryMemory 就是这么做的。结构化工作内存ScratchpadAgent 在执行复杂任务时可以显式维护一个“记事本”对象随时读写。· 比如让 Agent 输出 thought: … 和 action: … 时也保留一个 memory: {…} 字段来存储当前任务的关键实体、状态。· 这个内存跟着任务走任务结束就清空属于典型的短期工作记忆。三、长期记忆怎么做长期记忆的核心是持久化存储 按需检索让 Agent 能“记住”跨会话的信息。基本流程用户输入 → 结合输入检索相关长期记忆 → 将记忆拼入提示词与短期记忆一起 → LLM 生成回答 → 从交互中提取值得记住的信息存入长期记忆存储形式选择· 向量数据库最常用将记忆片段用 Embedding 模型向量化存入 Chroma / Pinecone / Milvus / Weaviate 等。检索时用语义相似度查找“和当前输入最相关的记忆”。· 知识图谱适合存储实体、关系如“用户喜欢咖啡” → (User, likes, Coffee)便于精确查询和推理。· 关系数据库 / 文档存储适用于结构化偏好、用户档案、事实性条目如“用户生日5月1日”。· 混合方案向量库负责模糊泛化的经验记忆情节记忆知识图谱负责精确的事实、关系。记忆的生命周期管理写入记忆形成每次对话结束后可以让 Agent 做“反思”从中提取可以留存的记忆。· 提取的内容可包含重要的用户信息、做出的决策、学到的教训、待办事项等。· 为每条记忆添加元数据时间戳、重要性、来源、记忆类型等。检索记忆召回根据当前用户输入和短期上下文从长期存储中召回最相关的若干条记忆。· 可以用多策略检索语义检索为主辅以时间过滤最近 7 天、重要性排序、关键词匹配。· 召回的记忆直接拼入系统提示或作为背景知识提供给 LLM。遗忘 / 更新· 时间衰减对太久远且未被再次激活的记忆降低权重。· 重要性评估用 LLM 给每条记忆打分低分记忆可以不进上下文或被清理。· 记忆合并新记忆与旧记忆冲突或重复时合并或覆盖。一个具体实现框架以 LangChain 为例fromlangchain.memoryimportVectorStoreRetrieverMemoryfromlangchain.embeddingsimportOpenAIEmbeddingsfromlangchain.vectorstoresimportChroma# 准备向量存储vectorstoreChroma(embedding_functionOpenAIEmbeddings())retrievervectorstore.as_retriever(search_kwargs{k:5})# 包装成长期记忆long_term_memoryVectorStoreRetrieverMemory(retrieverretriever,memory_keylong_term_context# 提示词中的变量名)# 手动写入记忆long_term_memory.save_context({input:我喜欢爬山},{output:已记住你的爱好})# 后续对话中long_term_memory 会根据输入自动检索相关条目# 你可以将检索结果和短期记忆拼装成完整 prompt更前沿的做法· MemGPT让 LLM 自行管理一个“虚拟内存分页”系统把长期记忆存储在外部向量库由 LLM 主动决定何时“换页”、何时提取记忆。· 生成式 Agent 的“记忆流”如斯坦福小镇记录所有事件的时间流检索时综合时效性、重要性、相关性三个维度评分再取最高分的记忆放入上下文。四、短长结合一个完整的 Agent 记忆循环启动/接收输入用户发送消息 → Agent 获取当前短期记忆窗口 工作内存。检索长期记忆使用当前输入及短期上下文如最近几轮对话作为查询从向量库 / 知识图谱拉取最相关的 N 条记忆。构建提示词[系统人设] [检索到的长期记忆] [短期记忆摘要 最近几轮对话] [用户新输入]LLM 推理与行动生成回复同时可能输出需要记住的内容。记忆更新后处理· 将新一轮交互压入短期记忆必要时触发摘要压缩。· 判断是否有值得长期保存的信息调用 LLM 提取事实、偏好、事件赋予重要性评分与时间戳写入长期存储。· 可以定期触发“高层反思”综合近期记忆提炼出更概括的见解如用户性格、长期目标。五、避坑建议· 检索噪音不要把所有长期记忆都塞进提示必须严格控制数量如 3~5 条且保证高度相关。· 记忆膨胀定期清理低价值、重复的记忆防止存储无限增长。· 隐私与安全涉及敏感个人数据时避免明文持久化可做脱敏或限定存储范围。· 延迟与成本每次检索都会增加 Embedding 调用与推理 token 数需要权衡检索频率和深度。总结一句话短期记忆用有限的上下文窗口 压缩摘要长期记忆用向量检索等外部存储再通过“交互→回忆→拼入提示→写入更新”的循环把它们串联起来。这套模式已经在大量生产级 Agent 中落地你可以直接用 LangChain、LlamaIndex 或自建类似机制快速上手。