← 全部文章

技术笔记 · 2026-09-15

Agent 的上下文与记忆:保存过,不等于这一轮看得到

区分模型当前输入、任务执行状态和跨会话记忆,用资料笔记的续写案例讨论检索、摘要、来源、有效期与冲突,避免把聊天历史当作唯一记忆。

延伸分析 · 从项目场景展开的原理与方案讨论。

  • AI 学习
  • Context engineering
  • Memory
  • 状态持久化

资料整理助手已经读过十个页面,为什么接下来又问同一个问题?一种可能是它没有拿到那部分信息:内容保存到了磁盘或数据库,却没有被选入当前模型输入。另一种可能是它读到了旧摘要,但摘要漏掉了关键条件。

研究这类问题,先区分“系统保存了什么”和“这轮模型实际收到了什么”。不能只看聊天界面上还能不能翻到旧消息。

可以把当前上下文比作桌面上正在看的几页资料,把持久保存的信息比作文件柜里的资料。 文件柜里有一本书,不代表你这一刻正在读它;程序还要把有关的内容找出来,放进这次模型调用。这个比喻只解释信息怎样被使用,不意味着模型具有人类式的记忆。

三层信息,生命周期不同

层次 这个例子中的内容 要回答的问题
当前上下文 当前目标、有关的资料段落、近期工具结果 这一轮决策需要看到什么?
执行状态 已读来源、待查问题、草稿位置、剩余预算 任务中断后如何继续?
跨会话记忆 用户明确偏好的语言、长期项目约定 下次任务还能复用什么?

这是便于学习的划分,实际系统可能把多类数据放在同一存储中。LangChain 的记忆概览区分线程内与跨线程的记忆范围;存储范围和模型本轮输入仍然需要分别考虑。

用户本次说“请写英文摘要”,不一定意味着永久偏好已经改成英文。搜索返回的页面告诉读者“忽略前文”,也不应该因此成为系统的执行规则。记录范围与信息来源,会影响后面怎样使用这条内容。

保存整份网页与发送整份网页是两次选择

原始资料适合留作核对依据,当前输入可以只装入与问题有关的片段。Anthropic 的上下文工程文章讨论过按需加载资料、压缩历史和保留结构化笔记等方式。

假设助手要补写“工具重试”一节,一轮输入可以这样组织:

任务约束:写学习笔记;保留来源;不要发布
当前子问题:保存操作超时后怎样判断是否成功
已有证据:资料 A 的相关段落和出处
当前产物:草稿路径,以及该节已有内容
尚未确定:目标服务有没有查询操作状态的接口

这里不需要同时塞进另外九个页面全文,也不需要重复前面已经解决的排版讨论。选择片段时仍要保留条件和否定词,避免把“仅在服务支持幂等时可重试”压缩成“可重试”。

摘要应该保留能改变动作的事实

比较两种交接摘要:

版本 A:已经研究了重试,继续完善文章。

版本 B:草稿已保存;其中一个写入接口结果不明,尚未确认是否支持幂等;下一步先查操作状态,避免直接重复提交。

版本 B 不只是信息更多,而是保留了影响下一步行为的状态。对于长任务,目标、约束、未完成项、证据位置、未知结果,往往比全部寒暄和中间措辞更需要保留。

压缩以后可以做一个小检查:只把摘要交给另一个无历史上下文的执行器,它是否知道不能做什么、哪里需要核实?如果这些条件丢失,摘要再通顺也不适合恢复任务。

记忆要能追溯,也要能失效

下面是自拟的记录示例,字段用于说明设计,并非某个框架要求的数据格式:

{
  "scope": "project:research-notes",
  "key": "preferred_language",
  "value": "zh-CN",
  "source": "user-confirmation:message-17",
  "confirmedAt": "2026-09-15",
  "status": "confirmed"
}

偏好、事实、模型推测可以分别标记。发布地址和依赖版本这类会变化的事实,在重要操作前要查实时状态;一个旧记录的时间更新得更晚,也不自动让它比原始证据更可靠。

若新信息与旧记录冲突,可以保留冲突来源并等待核实,或者按明确规则更新特定范围,不能总是默默用最后一句覆盖全部。跨用户记忆还需要用户或租户范围;即使向量相似度很高,也不能拿另一个人的资料来回答当前问题。

检索也不必一开始就用向量数据库,也就是按内容的相似程度帮助查找资料的存储工具。明确的配置项可以按键读取,来源 URL 可以按 ID 查找;需要按含义找资料时,再检查会不会漏掉有用资料、搜出无关资料。找到相似文本只说明检索匹配,并不证明内容正确。

持久化与模型学习也不同

把偏好写入存储,不等于修改模型训练时学到的参数,也就是模型权重。后续执行仍然需要检索并选择它。仅存内存的状态在进程退出后会丢失;需要重启后继续,就要确认数据确实保存到了磁盘或数据库。LangGraph 的持久化说明区分了保存当前线程进度的 checkpoint(检查点)和跨线程保存信息的 store(存储),也指出内存实现不提供进程重启后的保存能力。

可以用三次提问检验设计:同一会话继续写、重启进程后继续写、新建会话要求另一种语言。观察哪些事实应该保留、哪些应该重新确认,以及临时要求有没有错误地覆盖长期偏好。

执行记录怎样协助恢复,见 harness;检索出错怎样进入可重复的测试,见 agent 评测