简介:本教程面向开发者和架构师,系统讲解如何为AI智能体增加记忆能力:先厘清短期记忆、长期记忆与外部知识库三类方案的选型思路,再按步骤实现会话状态管理、记忆抽取、向量存储与检索注入的完整链路,并配套结果验证方法、常见问题排查思路与性能、安全、成本优化建议,帮助你从零搭建可记忆、可演进的智能体系统。
大语言模型本质上是“无状态”的:每次请求只依赖当次输入的上下文,会话一旦结束,“记忆”也随之消失。要让智能体具备跨轮次、跨会话甚至跨任务的经验积累能力,必须在其外部构建一套记忆系统。读完本教程,你将能够:
适合读者:具备一定后端开发经验、调用过大模型API的应用开发者;负责智能体系统设计的架构师;需要评估智能体落地方案的技术负责人与企业用户。
以下几类场景对记忆能力的需求最为迫切:
1. 基础环境
2. 基础知识
3. 权限与数据合规
动手前先做选型,避免“上来就堆技术栈”。
1. 短期记忆(工作记忆)
2. 长期记忆
3. 外部知识库记忆(检索增强)
4. 混合方案(生产推荐)
实践中通常三者叠加:短期记忆保证当轮对话连贯,长期记忆承载用户个性化信息,知识库提供领域事实。多数主流开源智能体框架(如自主决策类、多智能体协作类、状态机编排类框架)都内置了记忆管理组件或扩展点,可基于框架实现,也可自研轻量方案。本教程以通用自研方案为主线,思路可直接迁移到任何框架。
先定结构再写代码,记忆系统的可维护性很大程度上取决于数据结构。推荐统一用“条目 + 元数据”描述一切记忆:
{"memory_id": "m_20240501_0001","user_id": "u_10086","session_id": "s_abc123","type": "fact | preference | event | summary","content": "用户偏好简洁的技术回答","importance": 8,"created_at": "2024-05-01T10:00:00Z","last_used_at": "2024-05-01T10:05:00Z","expire_at": null,"embedding": [0.12, -0.45, "..."]}
注意:type字段区分事实、偏好、事件、摘要;importance用于后续淘汰排序;last_used_at用于热度统计;建议同时保留记忆的来源信息(哪次会话、哪条消息),便于事后审计。
做什么:以session_id为主键维护消息列表。为什么:大模型API无状态,会话连贯性完全靠客户端拼接历史消息。
class SessionMemory:def __init__(self, store, max_recent=20):self.store = store # 键值存储组件self.max_recent = max_recentdef append(self, session_id, role, content):msgs = self.store.get(session_id) or []msgs.append({"role": role, "content": content})if len(msgs) > self.max_recent:overflow, msgs = msgs[:-self.max_recent], msgs[-self.max_recent:]summary = self.store.get(session_id + ":summary") or ""summary = llm_summarize(summary, overflow)self.store.set(session_id + ":summary", summary)self.store.set(session_id, msgs)def render(self, session_id):summary = self.store.get(session_id + ":summary")msgs = self.store.get(session_id) or []head = [{"role": "system", "content": "历史摘要:" + summary}] if summary else []return head + msgs
注意事项:
做什么:每轮对话结束后(异步执行),用抽取提示词让模型判断“哪些信息值得跨会话长期记住”。为什么:把原始对话全部入库会导致检索噪声大、成本高,抽取后的结构化条目更干净、更可检索。
抽取提示词示例:
你是一个记忆抽取器。请阅读下面的对话,提取"值得长期记住"的信息,以JSON数组输出,每条格式为:{"content": "...", "type": "fact/preference/event", "importance": 1-10}判断标准:- 用户明确表达的稳定偏好、重要事实、关键决策结论 → 值得记住- 闲聊、临时性、一次性的信息 → 不要记住- 若没有值得记住的信息,输出 []对话内容:{dialog}
注意事项:抽取应在响应返回后异步执行,避免增加用户可感知的延迟;importance低于阈值(如3分)的条目建议直接丢弃。
做什么:为每个记忆条目生成向量并写入向量数据库。
def save_memory(entry):entry["embedding"] = embedding_model.encode(entry["content"])vector_db.upsert(collection="agent_memory",id=entry["memory_id"],vector=entry["embedding"],metadata={k: v for k, v in entry.items() if k != "embedding"})
注意事项:
做什么:每轮对话开始前,用当前问题检索相关记忆并注入提示词。
def build_prompt(user_id, question, session_id):q_vec = embedding_model.encode(question)hits = vector_db.search(collection="agent_memory",vector=q_vec,filter={"user_id": user_id},top_k=5)memories = [h for h in hits if h.score >= 0.75]mem_text = "\n".join(f"- [{h.importance}] {h.content}" for h in memories)system = f"以下是关于该用户的已知记忆,若与当前问题相关请合理参考:\n{mem_text}"messages = [{"role": "system", "content": system}]messages += session_memory.render(session_id)messages.append({"role": "user", "content": question})return messages
注意事项:
主流智能体框架普遍采用“感知—决策—执行”循环:感知阶段读取输入与记忆,决策阶段由模型推理(可结合思维链与工具调用),执行阶段调用工具并更新状态。记忆系统有两个接入点:
如果是多智能体架构,建议增加“共享记忆区”(例如以任务ID为命名空间的记忆集合),让协作的多个智能体读取同一份任务状态与中间结果,避免各自为政。
长期记忆不是只增不减,必须设计淘汰机制,否则越积越脏:
按以下清单逐项验证:
问题1:智能体记不住刚说过的信息。
排查顺序:短期记忆是否正确回传messages → 截断策略是否截掉了关键信息 → 摘要是否遗漏关键事实。
问题2:新会话检索不到该有的长期记忆。
排查:抽取任务是否真的执行(查异步任务日志)→ 记忆是否成功写入(按memory_id查库)→ 检索时的user_id过滤与相似度阈值是否过严 → 写入与检索是否使用了同一个嵌入模型。
问题3:回答中出现其他用户的信息。
排查:检索filter是否缺失、user_id类型是否不一致(字符串与数字混用)。这是严重安全问题,上线前必须用自动化测试覆盖。
问题4:记忆越积越多,回答开始“跑偏”。
排查:注入记忆过多或过时记忆未清理。降低top_k、提高阈值、启用淘汰策略,并在提示词中强调“以用户当前表述为准”。
问题5:对话延迟明显上升。
排查:抽取是否异步化;热点记忆是否可缓存;嵌入调用与向量检索是否可并行;高频问题是否可加“问题→记忆”结果缓存。
问题6:抽取出的记忆噪声大。
排查:优化抽取提示词的判断标准并补充示例;提高importance丢弃阈值;写入前增加去重或合并环节。
性能:为高频用户的近期记忆增加本地缓存;抽取与写入全链路异步化;采用批量向量化与批量写入降低调用次数。
安全与合规:对写入记忆的内容做敏感信息脱敏(如手机号、证件号),记忆库的治理标准应等同业务数据库;严格命名空间隔离并为检索逻辑增加越权测试;支持用户“查看与删除我的记忆”的能力,满足数据可删除的合规要求。
稳定性:记忆系统故障时可降级为“无记忆模式”继续回答,而非整体报错;写入增加重试与死信队列,避免静默丢失。
成本控制:用摘要替代原始对话存储,显著减少token与存储开销;按importance分层存储,高价值记忆常驻,低价值记忆归档。
可维护性:记忆读写全链路打日志(谁、何时、写入或检索了什么),使智能体行为可解释、可回放;抽象统一的MemoryStore接口,底层实现可替换,避免与特定组件强耦合。
为智能体增加记忆,本质上是把“无状态的模型调用”升级为“有状态的智能体系统”。核心链路只有五步:设计数据结构 → 管住短期记忆 → 抽取沉淀长期记忆 → 检索并注入上下文 → 维护记忆生命周期。在此基础上,再叠加企业知识库检索增强与多智能体共享记忆,即可支撑从个人助手到企业级智能体的完整场景。后续值得深入的方向包括:记忆重排序策略、基于用户反馈的记忆强化(让智能体记住“哪些做法有效”)、以及图结构记忆(用实体—关系图承载更复杂的知识关联)。动手时建议先跑通“短期记忆 + 最简长期记忆”的最小闭环,再逐步引入摘要压缩、淘汰机制与缓存优化,避免一开始就过度设计。