Agent 开发实战 · 第 5 篇

上下文、记忆与可恢复状态

分开即时上下文、短期记忆、长期记忆和程序运行状态。

35 分钟开发进阶

学完能做什么

你会区分当前上下文、短期记忆、长期记忆和运行状态,能设计一份既可恢复又不过度收集数据的任务记录,并避免把全部历史对话无限塞回模型。

四个概念解决不同问题

概念回答的问题生命周期
上下文模型这一次需要看到什么单次调用
短期记忆当前任务前面发生了什么一次任务或会话
长期记忆跨任务值得保留的稳定信息是什么明确保留期限
运行状态程序执行到哪一步、能否恢复任务创建到归档

把四者都做成“聊天记录”会导致成本上涨、信息冲突、隐私扩大和难以恢复。

上下文要按需组装

每次调用前,从不同来源选出最小必要信息:

text
系统规则
+ 当前任务与验收条件
+ 最近的关键步骤
+ 当前工具结果
+ 检索到的少量材料
+ 用户已确认的约束
= 本次模型上下文

旧工具原始输出、重复寒暄和已经失效的计划不应默认保留。重要事实用结构化字段保存,避免依赖模型从长对话里重新猜。

为任务建立可恢复快照

json
{
  "task_id": "task_20260819_001",
  "status": "WAITING_CONFIRMATION",
  "step": 4,
  "objective": "生成周报草稿",
  "constraints": ["只使用已批准材料", "不得自动发送"],
  "completed_actions": [
    {"tool": "search_docs", "result_ref": "result_31"}
  ],
  "pending_action": {
    "tool": "save_draft",
    "arguments_hash": "sha256:..."
  },
  "budgets": {"steps_left": 4, "model_calls_left": 2},
  "updated_at": "2026-08-19T08:30:00Z",
  "version": 3
}

原始大结果存到受控对象存储,状态只保存引用、摘要和校验值。恢复时重新校验权限和数据版本,不直接执行旧的待处理动作。

摘要不是事实数据库

对话变长时可以摘要,但摘要会遗漏或改写细节。稳妥做法是分层:

  • 任务目标、约束、决策和确认保留结构化原文;
  • 普通过程压缩成滚动摘要;
  • 工具结果保留不可变引用和内容哈希;
  • 摘要记录来源步骤和生成版本;
  • 关键动作前回看原始证据,不只信摘要。

长期记忆需要明确写入规则

适合保存的通常是用户主动确认的稳定偏好,例如语言、日期格式或长期项目术语。不适合自动记住临时情绪、一次性密码、未经确认的推断和敏感身份信息。

每条长期记忆至少应有:

text
内容 + 来源 + 创建时间 + 适用范围 + 置信状态 + 到期时间 + 删除方式

用户应能查看、修改和删除。系统也要有自动过期和组织保留策略。

处理并发和重复恢复

同一任务可能被两个工作进程同时恢复。使用版本号或租约避免重复执行:

python
snapshot = store.load(task_id)

if snapshot.version != expected_version:
    raise ConcurrentUpdate("任务已被其他执行器更新")

store.compare_and_swap(
    task_id=task_id,
    expected_version=snapshot.version,
    next_state=updated_snapshot,
)

有副作用的工具仍要使用幂等键。状态锁只能减少并发,不足以覆盖网络超时后的未知结果。

恢复前重新确认现实世界

暂停期间,文件可能被修改、用户权限可能被撤销、余额可能变化。恢复时检查:

  • 当前身份和授权是否仍有效;
  • 输入材料的版本或哈希是否变化;
  • 待执行参数是否仍与用户确认的一致;
  • 幂等键是否已有成功结果;
  • 时间、成本和步骤预算是否仍充足。

如果关键条件改变,回到等待确认,而不是沿用旧批准。

数据最小化与删除

在设计表结构时同时设计删除路径:

  • 把身份信息与任务内容分开,便于按用户删除;
  • 敏感字段加密并限制查询角色;
  • 日志只保存必要摘要;
  • 临时工具结果设置短期过期;
  • 备份遵循同样的保留和删除策略;
  • 训练、分析等其他用途必须单独说明和授权。

状态设计练习

为“用户上传材料后生成合同检查清单”设计:

  1. 本次模型上下文必须包含什么?
  2. 哪些内容留在任务短期记忆?
  3. 哪些信息绝不能成为长期记忆?
  4. 在等待用户确认时保存哪些恢复字段?
  5. 文件变化或权限撤销后如何处理?
  6. 任务结束 30 天后删除哪些数据?

完成检查清单

  • 上下文、短期记忆、长期记忆和运行状态已分开。
  • 关键目标、约束、确认和结果使用结构化记录。
  • 恢复时会重新校验权限、版本和幂等结果。
  • 长期记忆有来源、范围、过期和用户删除入口。
  • 日志、临时结果和备份都有数据保留策略。

下一步

下一篇将把检索和引用接入 Agent,让模型在受控材料范围内回答,并能追溯每条关键结论。