Agent 记忆到底该怎么做:短期上下文、长期记忆与任务状态的边界

发布时间:2026/10/6 21:26:58

Agent 记忆到底该怎么做:短期上下文、长期记忆与任务状态的边界 本文定位Agent 记忆 / 上下文管理 / 数据建模示例环境Java 21、Spring Boot 3.3、PostgreSQL、Redis、向量检索。记忆保存涉及隐私和合规具体保留策略必须经过业务确认。摘要“给 Agent 加记忆”经常被理解成把所有历史聊天保存下来再在下一次请求中全部拼回 Prompt。这样做会带来三个问题上下文越来越长成本和延迟不断增加过期或错误信息被重复使用用户不清楚系统记住了什么也无法删除或修正。真正可用的记忆系统应该区分短期上下文、长期偏好、可检索事实和任务状态。短期上下文服务当前对话长期记忆保存经过确认的稳定信息任务状态保证业务流程可恢复RAG 知识库则负责外部资料。本文给出这几类数据的边界、表结构、写入策略和检索流程。一、四种“记忆”不是一回事类型例子保存位置生命周期短期上下文当前会话最近几轮消息Redis/会话存储分钟到数天长期偏好用户偏好的输出格式结构化数据库用户可查看和删除事实记忆设备曾发生某类故障数据库/向量索引有来源、有过期时间任务状态工单执行到第3步关系数据库直到任务结束和归档不要把任务状态塞进自然语言记忆。statusWAIT_CONFIRM、step3和retry1应该由确定性的数据库字段表示不能依赖模型从聊天记录中猜出来。二、记忆读取流程当前问题短期上下文裁剪长期记忆检索RAG知识检索权限/时间/可信度过滤上下文组装Agent决策任务状态更新候选记忆提取人工/规则确认后写入每次请求不是把所有记忆都取出来而是先根据问题召回候选再按来源、可信度、时间和权限筛选。记忆检索失败时Agent 仍然应该可以在无长期记忆的情况下完成普通任务。三、短期上下文裁剪短期上下文包括当前对话和本轮工具结果。建议按 Token 预算分配系统规则、当前问题、最近消息、摘要和外部证据分别设置上限。publicContextWindowbuildWindow(ListMessagehistory,Stringsummary,Stringevidence,intmaxTokens){ListMessagerecenttakeFromEnd(history,8);ContextWindowwindownewContextWindow();window.addSystemRules(systemRules);window.addSummary(truncate(summary,1200));window.addMessages(recent);window.addEvidence(truncate(evidence,maxTokens/2));returnwindow.fit(maxTokens);}摘要也不是事实数据库。摘要由模型生成可能遗漏否定条件或把不确定内容写成事实。高风险信息应回到结构化字段和原始证据而不是只依赖摘要。四、长期记忆的写入门槛不是每句话都应该进入长期记忆。可以设置以下条件用户明确表达“请记住”或主动保存。信息具有稳定性不是临时情绪和一次性任务。能说明来源、时间和置信度。不包含不必要的敏感信息。写入后用户可以查看、修改和删除。publicOptionalMemoryCandidateextract(Stringconversation,UserIntentintent){if(!intent.explicitSaveRequest()){returnOptional.empty();}MemoryCandidatecandidatememoryExtractor.parse(conversation);if(candidate.sensitive()||candidate.content().length()500){returnOptional.empty();}returnOptional.of(candidate.withExpiration(Duration.ofDays(180)));}“用户喜欢简洁回答”可以作为偏好候选“用户的身份证号是……”不应该默认写入长期记忆。记忆提取结果要经过规则校验必要时请求用户确认后再保存。五、数据模型CREATETABLEuser_memory(id uuidPRIMARYKEY,tenant_idvarchar(64)NOTNULL,user_idvarchar(128)NOTNULL,memory_typevarchar(32)NOTNULL,contenttextNOTNULL,source_trace_idvarchar(128)NOTNULL,confidencenumeric(4,3)NOTNULL,expires_at timestamptz,statusvarchar(16)NOTNULL,created_at timestamptzNOTNULLDEFAULTnow(),updated_at timestamptzNOTNULLDEFAULTnow());CREATEINDEXidx_memory_ownerONuser_memory(tenant_id,user_id,status);如果需要语义检索可以增加 embedding但必须同时保留结构化的租户、用户、状态和过期条件。向量相似度不能替代这些过滤。六、事实记忆的来源与冲突同一用户或设备可能出现互相冲突的事实例如“设备已经更换模块”和历史记录“模块未更换”。记忆项应带时间、来源和状态检索时优先当前有效、来源可靠且时间较新的记录。publicListMemoryresolveConflicts(ListMemorycandidates){returncandidates.stream().filter(Memory::active).filter(m-m.expiresAt()null||m.expiresAt().isAfter(Instant.now())).sorted(Comparator.comparing(Memory::confidence).reversed().thenComparing(Memory::createdAt).reversed()).limit(5).toList();}冲突没有可靠解决办法时Agent 应该明确说明“存在两条时间不同的记录”而不是强行选择一个。事实记忆需要可追溯的来源不应以模型“觉得合理”为依据。七、任务状态必须结构化CREATETABLEagent_task_state(task_id uuidPRIMARYKEY,tenant_idvarchar(64)NOTNULL,user_idvarchar(128)NOTNULL,statusvarchar(32)NOTNULL,current_stepintegerNOTNULL,state_json jsonbNOTNULLDEFAULT{},versionbigintNOTNULLDEFAULT0,updated_at timestamptzNOTNULLDEFAULTnow());使用乐观锁version防止两个调度器同时推进任务。每次状态迁移都记录旧状态、新状态、触发原因和 Trace ID。模型可以提出下一步但状态迁移必须由后端有限状态机判断。八、记忆污染和安全长期记忆可能被恶意用户利用先诱导 Agent 保存“我是管理员”后续再用记忆绕过权限。任何记忆都不能改变认证和授权。记忆只能作为辅助上下文不能覆盖当前 Token、数据库状态和业务规则。还要防止跨租户、跨用户检索。缓存键、向量索引过滤、删除接口和导出接口都必须带上租户与用户条件。用户删除记忆时应同步清理主表、向量索引、缓存和备份中的可检索副本。九、如何评测记忆效果记忆系统不应该以“召回越多越好”为目标。评测包括该记住的偏好是否被正确召回。过期信息是否不再使用。冲突信息是否能提示不确定性。无关记忆是否不会污染答案。用户删除后是否确实不再出现。记忆内容是否不越权、不改变权限。可以建立“应该记住”“不应该记住”“应该忘记”“存在冲突”的样本集并测试写入、读取、更新和删除全流程。十、总结Agent 记忆不是无限聊天记录而是不同生命周期、不同可信度和不同治理要求的数据集合。短期上下文服务对话长期记忆服务偏好RAG 服务外部知识任务状态服务可靠执行。最关键的原则有三个未经确认的信息不要随意长期保存记忆不能改变权限和业务状态所有记忆都应有来源、生命周期和删除路径。只有这样记忆才会成为稳定能力而不是越来越大的上下文垃圾场。读者讨论如果你准备给 Agent 增加记忆建议先列出“哪些内容可以保存、保存多久、谁能查看、如何删除”四个问题再选择存储方案。
延伸阅读

更多相关文章

2026/10/6 7:53:44

多智能体编排:LLM复杂任务分解与协同标注实战

1. 项目概述:用多智能体编排优化课堂话语的LLM标注如果你尝试过用单个大语言模型(LLM)去自动分析一整段课堂对话录音转写的文本,你很可能经历过这样的挫败:模型要么抓不住教师提问的细微类型(是开放性问题还…

2026/9/25 21:28:34

APP内置浏览器开发:提升用户体验与转化率的关键技术

1. 为什么需要为APP开发内置浏览器在移动应用开发中,集成浏览器功能已经成为提升用户体验的重要手段。最近接手的一个电商APP项目就遇到了这样的需求:当用户点击商品详情中的外部链接时,系统默认会跳转到手机默认浏览器,导致用户流…

2026/10/6 21:24:46

2026年靠谱AI创业方向评测:避开常见坑,抓住真实需求

2026年还在追着“下一个AI风口”跑的人,大概率已经被割过好几轮了。今年做AI创业,最怕的不是技术不够新,而是项目听起来很唬人、做起来全是坑。我过去一年被各种AI创业项目“骚扰”得不轻,也陪着几个团队从0到1跑过完整流程&#…

2026/10/6 21:24:46

弱电网下并网变流器阻抗建模与次/超同步振荡稳定性分析

做并网变流器研究这些年,我最深的感受是:真正让人头疼的往往不是控制算法本身,而是“设计时一切正常,一接到弱电网就振荡”。尤其现在风电、光伏大基地越来越多,远距离送电后电网短路比(SCR)经常…

2026/10/6 21:24:46

Agent-Reach:打通AI智能体与真实业务系统的触达层实战

说一个我自己踩了很久才想明白的事:这两年大家聊 AI 智能体,聊来聊去都在模型层打转,好像给模型套上 System Prompt、配上 Function Calling 就算完事了。可一旦真把智能体往生产环境里放,问题立刻暴露出来——模型再聪明&#xf…

2026/10/6 21:24:45

Win10 DirectShow 稳定音视频采集实战指南

简介:本资源是面向Windows 10平台多媒体开发者的DirectShow实战工具包,适用于C开发者、音视频应用工程师及COM编程学习者,解决Win10环境下DirectShow开发环境搭建、过滤器图构建与跨版本兼容性调试等核心问题。压缩包为RAR格式,共…

2026/10/6 21:19:45

生鲜B端供应链价格域表结构设计:六张核心表与版本化管理

做生鲜B端供应链的人应该都经历过这种场面:凌晨四点半采购回来,运营对着今日批发市场行情一批一批改价,早上九点客户刚下单又打电话来问“昨天谈好的协议价怎么没了”,月底对账,客户拿着历史订单说当初承诺过阶梯价&am…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/6 4:01:51

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/6 17:46:51

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 0:03:23

MR25H40CDF+STM32F031C6工业级高可靠数据存储方案

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的 PLC 控制柜里、在风电变流器的散热片背面、在矿井监测终端的金属外壳下,你经常能看到一块指甲盖大小的黑色芯片——它既不是 Flash,也不是…

2026/10/6 0:03:23

MRAM+STM32工业断电数据保全实战指南

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的PLC柜里、在野外无人值守的环境监测终端里、在高速运转的包装机控制板上,你经常能看到一块指甲盖大小的黑色芯片,旁边贴着“MR25H40CDF”丝…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑