判断一套 Agent 记忆设计好不好,有一个很实用的标准:
用户三个月前说过一句偏好,你现在能不能准确地取回来,同时不把上周已经改过的旧值也带回来?
答不上来,通常不是检索算法的问题,而是把性质完全不同的记忆塞进了同一个容器。
所以记忆设计的第一步不是选向量库,而是分层。
短期记忆是什么:当前会话或任务正在使用的信息。生命周期等于任务或会话,会话结束即丢弃(除非主动保存)。
存储:
检索方式:
关键取舍:
一句话:短期记忆是“舞台”,任何长期记忆最终都要被注入这里才生效,但它本身不需要检索,需要的是装配。
长期记忆是什么:跨会话、跨任务需要保留的信息。典型内容:用户偏好、账号属性、领域事实、明确要求。
存储:
检索方式:
关键取舍:
一句话:长期记忆是“档案柜”,按 key 精确查,写入要审批,不能用语义相似度替代精确性。
情景记忆是什么:具体事件的记录。“上个月处理过一笔类似的退款,当时走了人工审批”。特点是量大、允许模糊、主要访问方式是相似度检索。
存储:
向量库适合做语义召回入口。
但向量只能解决“和当前情况看起来像的历史案例”,解决不了关系传导。如果问题涉及“A 和 B 相关、B 又和 C 相关”,答案在结构里,不在语义里。所以情景层的常见组合是:向量做入口召回,图做多跳扩展。
写入时打标签:时间、主体、动作类型。检索时先按标签过滤再算相似度,能砍掉大部分噪声。
检索方式:
向量相似度召回 + 元数据过滤 + 重排序。
按事件切分,不按 token 数切。固定长度切片会把一次完整交互切成碎片,检索回来每块都不完整。
关键取舍:
向量擅长语义相似,不擅长关系推理。
上图的时机不是一开始,而是当关系型问题反复出现、向量明显答不对的时候。
一句话:情景记忆是“案例库”,用向量找相似案例,用图找关系邻居,用元数据过滤噪声。
记忆污染是指:错误、过时、过度泛化的知识条目被写入长期记忆,后续通过检索不断被读到,错误级联放大。
(1)写入闸门(Write Gate)
不要让所有生成的内容都入库。研究提出的 Failure-Gated Hierarchical Memory 用专门的 Critic 模型对所有从情景缓冲写入长期记忆的候选条目做裁决:APPROVE、REJECT_REDUNDANT、REJECT_CONFLICT。
工程上的轻量做法:
(2)冲突裁决
同一事实有多个来源时,按“来源可信度 + 时间新旧”择一。长期记忆的更新不是简单覆盖,而是裁决。
(3)定期清理与归档
(4)反思与提炼
Reflexion 式的反思日志可以存入情景记忆,但反思本身也可能污染。低质量的反思如果被当作事实存储,会误导后续决策。所以反思应该标记为“经验/假设”,而不是“事实”。
上下文爆炸的本质是:所有可用的记忆都想挤进有限的 token 窗口。
(1)预算分配,而不是全量注入
给上下文窗口划预算:对话历史、检索知识、长期记忆各占一定比例。长期记忆虽然分配最少,但信息密度最高,三句话的用户画像可能比 30 轮历史更有价值。
(2)按需检索,而不是每轮全量注入
(3)排序不只看相似度
向量距离衡量的是语义相似,不衡量“是否仍然真实”“是否曾经重要”“是否被后续事实推翻”。按相似度检索后,应该用置信度 × 时间衰减 × 类别权重重排。半衰期是最值得测量而不是猜测的参数。
(4)去重
两条记录用不同措辞表达同一事实,都会获得高分,浪费两份预算。排名后、组装前要去重。
(5)短期记忆压缩
历史对话不是越长越好。递归摘要、滑动窗口、关键信息提取,都是控制短期记忆规模的手段。
Agent 记忆要分三层设计:短期记忆是上下文窗口,靠装配和压缩,不靠检索;长期记忆是精确的事实与偏好,用结构化存储按 key 查,写入要闸门;情景记忆是事件案例库,用向量召回 + 元数据过滤 + 图扩展。避免污染靠写入裁决和冲突管理,避免上下文爆炸靠预算分配、按需检索、多维排序和去重。
结构完整:三层记忆的存储/检索 + 两个工程难题,覆盖了记忆系统的核心。
区分度很好:
初级:能说短期放上下文、长期放向量库。
中级:能说长期记忆不该用向量、写入要有控制。
高级:能说写入闸门、冲突裁决、预算分配、多维排序、情景层向量+图组合。
贴近真实痛点:记忆污染和上下文爆炸是 Agent 上线后最常见的两个问题。
有追问空间:可以追问写入闸门的具体实现、长期记忆的 schema 设计、向量+图怎么组合、遗忘策略。
偏难:如果候选人只做过简单 RAG,可能只答“短期上下文 + 长期向量库”,后两问答不好。
容易混淆概念:短期/工作/长期/情景/语义/程序,术语多,候选人可能混着说。
缺少场景约束:没问“你实际项目记忆规模多大?遇到过污染吗?”
没覆盖程序记忆:技能/工作流这类“怎么做事”的记忆也是 Agent 记忆的一部分,题目没提。
质量:上。 适合中高级岗位,能有效区分“知道记忆分层概念”和“真正设计过 Agent 记忆系统”的人。建议追问:
“长期记忆的写入闸门具体怎么实现?”
“情景记忆什么时候需要图,什么时候向量就够了?”
“时间衰减的半衰期怎么定?”
“记忆污染你实际遇到过吗?怎么发现的?”
“程序记忆(技能)怎么管理?”
“Agent 记忆要分三层,因为性质完全不同。短期记忆是当前任务的上下文,生命周期等于会话,靠上下文窗口和压缩,不需要检索。长期记忆是跨会话的稳定事实和偏好,量少但必须准确,用结构化存储按 key 查,不要用向量库。情景记忆是过去的事件案例,量大允许模糊,用向量召回 + 元数据过滤,需要关系推理时加图。”
“长期记忆用向量会出两个问题:取回来的字段不确定,无法做精确覆盖更新。所以用关系表或文档,按主体键直接查,写入不让模型直接写,模型输出候选 + 置信度,规则层裁决。”
“避免污染的核心是写入闸门。模型的一次幻觉如果直接落库,后续所有任务都会读到脏值。要有 Critic 或规则层裁决,冲突按来源可信度和时间裁决,保留变更历史。”
“避免上下文爆炸靠预算分配和按需检索。给对话历史、检索知识、长期记忆分预算,长期记忆虽然分得少但信息密度高。排序不只看相似度,还要乘置信度和时间衰减。排名后去重。”
“我们实际用 SQLite 存长期记忆,情景记忆用向量 + 时间/主体过滤,需要关系时加图。写入走规则闸门,每周人工抽查。”
评论专区
评论加载中...登录后即可发表评论