全书目录

第四编 系统层

第 18 章 状态与记忆:短期状态、会话状态、长期记忆、反思记忆

9 分钟 3,778 字 第 19 / 161 个阅读单元

状态是 Agent 和普通聊天系统真正拉开差距的地方。

如果一个系统没有状态,它就只能在每一轮重新解释世界;如果一个系统没有记忆,它就只能不断重复已经做过的判断。前者导致任务推进困难,后者导致长期任务无法积累。于是,Agent 一旦从单轮问答走向多步执行,就必须回答一个根本问题:哪些内容应该只在当前步骤有效,哪些内容应该在本次任务里持续,哪些内容值得跨会话保留,哪些经验应该沉淀为下一次做事的方法。

所以,本章讨论的“状态与记忆”,绝不是一个大而化之的概念,而是四层不同对象。

第一层,是短期状态。

它对应当前执行步的工作现场。当前子任务是什么,刚才调用了哪个工具,工具返回了什么,本轮还缺哪个字段,当前审批是否卡住,下一步准备执行什么动作,这些都属于短期状态。它像系统的 scratchpad,也像执行器手边的工作台。它最强调的是即时性与精确性,而不是可长期复用。

第二层,是会话状态。

它对应本次任务线程的连续性。这个客户问题已经查到哪一步,哪些证据已经收集过,哪些动作已经成功执行,哪些分支被否决过,哪些中间结论仍待确认,这些都不该只留在某一步的临时变量里,而应该成为 thread 级对象。会话状态的作用不是让模型显得“记性很好”,而是让系统在暂停、恢复、交接和重放时,仍能回到同一个任务进程上。

第三层,是长期记忆。

这部分信息跨会话仍然有价值。用户偏好、账户配置、组织规则、稳定的业务背景、可复用的领域知识、经过验证的事实摘要、经常召回的上下文索引,都可能属于长期记忆。长期记忆的核心不在“保存得久”,而在“值得被未来读取”。它不是原始历史的仓库,而是被筛选后的可持续知识层。

第四层,是反思记忆。

这层最容易被低估,因为它记录的不是对象事实,而是行为经验。上次失败的原因是什么,哪种规划顺序更稳,哪个工具在什么条件下容易报错,哪类异常应该尽早升级,面对同类任务时哪些步骤应优先验证,这些都不是世界知识,而是关于“如何更好地行动”的经验知识。反思记忆一旦形成,Agent 的改进就不必完全依赖模型升级,也可以通过经验沉淀实现。

这样一来,我们就能看清一个经常被混淆的问题:状态不等于记忆,记忆也不等于聊天历史。

短期状态更像执行中的工作内存,会话状态更像当前任务线程的连续快照,长期记忆更像被抽取和组织后的跨任务知识,反思记忆则更像经验层的策略沉淀。它们的生命周期不同,写入条件不同,读取频率不同,安全要求也不同。把它们混成一团,系统就会要么过度遗忘,要么无限堆积,要么让错误经验反复回流。

这也是为什么主流框架近两年都在把 state、session、thread、checkpoint、memory、store 显式拆开。因为生产系统已经发现,“把全部历史消息不断拼回 prompt”只适合 demo,不适合长流程。随着任务拉长,历史会无限膨胀,成本会上升,关键事实会被旧内容淹没,模型对中段内容的利用也会迅速下降。到最后,系统看起来像有记忆,实际上只是把更多文本重新贴回去。

所以,真正成熟的状态系统首先解决的不是“记不记得”,而是“如何恢复”。

一旦 Agent 需要等待人工审批、等待外部系统回调、跨天继续执行、从失败步骤恢复、把任务转交给另一个 Agent,状态就必须可持久化、可恢复、可重放。这时,thread、checkpoint 和 resume 变成基础设施,而不是高级功能。没有这些机制,系统所有“多步能力”都会变成表演:一暂停就断,一中断就丢,一交接就散,一报错就只能从头来。

从这个角度看,会话状态的价值并不是“让模型记住刚刚说过什么”,而是让整个任务拥有连续身份。

一个审批流就是很好的例子。系统先收集资料,再生成判断,再等待审批,再根据审批结果继续执行。若没有 thread 级状态,审批人看到的可能不是稳定版本;若没有 checkpoint,恢复时可能拿不到当时的证据组合;若没有 replay,出了问题就无法追溯系统究竟在何时基于何种状态作出决策。也就是说,真正需要被保存的不是一句话,而是一次任务执行的轨迹。

这就引出长期记忆的另一个关键原则:长期记忆不应该是历史原文的无限堆积,而应该是选择性抽取。

如果系统把所有历史对话、所有工具结果、所有检索内容都无差别写入长期记忆,那么所谓“记忆增强”很快就会退化成“污染增强”。真正值得跨会话保留的,应该是稳定事实、持久偏好、经验证规则、长期关系、结构化画像和高价值经验,而不是一次性的噪声、未核实的猜测、过期的上下文和局部失败的偶然细节。

所以,长期记忆设计的关键不只是存储介质,而是写入策略。

哪些内容允许进入长期层,进入前是否要压缩或结构化,是否保留证据来源,是否设置过期时间,是否允许后续修订,是否要求与用户或租户隔离,是否要在写入前做安全筛查,这些问题决定长期记忆是资产还是负担。没有 admission policy 的长期记忆,最终通常都会演化成一座难以治理的垃圾场。

同样,反思记忆也不是“失败后写一句总结”那么简单。

真正有价值的反思记忆,应该把一次任务中的反馈提炼成可迁移经验。它不是简单记录“上次错了”,而是把错误归因到策略、顺序、证据不足、工具选择、权限限制、状态遗漏或验证缺失上。只有这样,反思才会变成下一次决策时可调用的经验层,而不是一堆情绪化的自我评价。

近年来很多语言 Agent 研究都在往这个方向收敛:把失败经历写成 episodic reflection,再逐步沉淀成更稳定的 semantic guidance,甚至形成类似技能库、经验库、指令库的结构。这说明一个很重要的事实:Agent 的“学习”未必总是参数更新,也可以是状态与记忆结构的演化。

但记忆能力越强,也越容易出现另一种误判:把所有问题都交给记忆去解决。

这同样是危险的。长期记忆会过时,会冲突,会被污染,会泄露隐私;摘要会丢信息,会引入偏置,会错误覆盖原始事实;反思会过拟合,会把一次局部经验误当成普遍规律;跨会话用户画像如果缺少权限与保留边界,还会直接演化成合规风险。记忆系统不是越多越好,它和输入系统一样,需要严格边界。

因此,状态与记忆真正困难的地方,从来不在“能不能存”,而在五个机制。

第一,什么时候写。并非每次交互都值得写入,尤其不应把未经验证的内容直接写进长期层。

第二,什么时候读。不是所有记忆都该在每一轮回流,很多记忆只该按任务相关性按需召回。

第三,什么时候压缩。历史一长,必须做 summary、collapse、repack 或结构提炼,否则上下文会腐烂。

第四,什么时候淘汰。过期规则、版本管理、遗忘策略和删除语义,是长期记忆能否长期健康的关键。

第五,什么时候禁止回流。存在安全风险、权限不匹配、来源不可信、与当前任务无关的内容,必须被隔离在本轮上下文之外。

把这五件事做清楚,状态与记忆才是能力源;做不清楚,它们就会从能力源变成污染源。

这一点在长期对话和长任务评测里已经越来越明显。很多基准都表明,随着会话拉长,模型不仅会遗忘早期事实,还会在时间、因果、角色关系、多方协作和隐式状态跟踪上迅速退化。更麻烦的是,这种退化并不总能通过更长上下文自动解决。上下文越长,位置偏置、噪声积累和摘要失真反而可能更严重。

所以,compaction 不是小修小补,而是记忆系统的核心机制。

但 compaction 也不能被理解成“把历史压短”这么简单。真正的 compaction 是一种受控的信息重构:哪些原文删除,哪些事实保留,哪些结构上升为摘要,哪些证据必须仍可追溯,哪些结论需要保留不确定性,哪些事件需要维持时间顺序。如果压缩只追求短,而不追求可恢复与可解释,那么它只是高效地制造遗忘。

多 Agent 系统又把问题再推进一步。因为一旦发生 handoff,系统就必须决定:下一位 Agent 该继承什么状态,继承多少历史,是否只拿摘要,是否保留工具结果,是否保留失败轨迹,是否带上审批上下文。这个问题的本质和单 Agent 一样,仍然是状态分层与记忆边界,只是它不再发生在“过去的我和现在的我”之间,而是发生在“一个 Agent 和下一个 Agent”之间。

企业系统里,这套分层尤其关键。

例如一个面向大客户的支持 Agent,短期状态可能包括当前工单、当前错误码、刚完成的日志查询;会话状态包括本次排障已经尝试过哪些操作、哪些负责人已被通知、哪些结论仍待验证;长期记忆包括客户环境偏好、历史事故模式、合同支持等级和稳定配置;反思记忆则可能记录“这类错误先查权限同步,再查缓存延迟,比先重启服务更稳”。只有把这四层拆开,系统才能既连续、又可靠、又可治理。

因此,本章最终要建立的结论是:

text
Agent 的状态与记忆,不是一个更长的聊天记录,而是一套分层的运行时连续性系统。

短期状态保证当前步能推进,会话状态保证任务线程不断裂,长期记忆保证系统可以跨会话复用有效知识,反思记忆保证系统能把经历转化为经验。而 checkpoint、resume、compaction、retrieval、admission、forgetting、audit,正是让这套系统真正可用的关键机制。

所以,状态层之所以重要,并不是因为“有记忆更像人”,而是因为“没有分层状态与记忆,就无法做可靠、可恢复、可演化的 Agent 系统”。