G36:Agent Memory Schema、Tool Contract 与状态边界
Agent memory 是带来源、时效和写入规则的外部状态系统,tool contract 则明确动作参数、返回、错误与副作用;二者共同限制 Agent 能记住什么、相信什么和改变什么。
内容类型:预习教材(不代表已完成)
日期:2027-03-29
阶段:P3 · AGI Foundations 90
总路线:Day 216 / 360
周次:W6 · Memory、Planning 与 Tool Use
节奏:周一概念与论文
状态:教材已备;学习未完成
标签:agent-memory、tool-contract、state、permission、provenance
一句话定义
Agent memory 是带来源、时效和写入规则的外部状态系统,tool contract 则明确动作参数、返回、错误与副作用;二者共同限制 Agent 能记住什么、相信什么和改变什么。
学习目标
- 区分 working、episodic、semantic 与 procedural memory,以及模型 context 和系统持久状态。
- 为工具定义 precondition、input schema、postcondition、error、idempotency 与 permission。
- 理解记忆写入、检索、压缩和遗忘各自可能引入的失真。
- 画出显式状态、模型生成文本、工具事实和人工决定之间的信任边界。
核心知识
- Working memory 保存当前任务的短期变量;episodic memory 保存带时间和来源的事件;semantic memory 保存经验证、可复用的事实;procedural memory 保存操作规则或策略。分类是系统设计语言,不代表人类记忆的完整认知模型。
- Context window 是本次推理输入,不自动成为长期记忆。持久 memory 需要明确
write/read/update/delete,否则每次摘要都会悄悄改写事实。 - 一条可审计记忆至少含
content, source, observed_at, valid_from, expires_at, confidence, scope, supersedes。模型生成的推测不能与工具返回、用户确认或数据库事实共用同一信任等级。 - Tool contract 不只是函数签名。它还需描述只读或写入、副作用是否幂等、超时后状态是否未知、允许的主体、速率和人工确认点。
- Planner 只能提出动作,runtime 才执行经过策略检查的 contract。把自然语言计划直接解释成任意代码,会把模型误差扩大为系统副作用。
机制与推导
把 Agent 的显式状态写成:
[ x_t=(g_t,w_t,e_t,k_t,p_t) ]
其中 (g_t) 是目标,(w_t) 是 working state,(e_t) 是事件引用,(k_t) 是检索到的语义事实,(p_t) 是权限上下文。一次安全状态转移不是单纯 LLM(x)->x',而是:
propose(x_t) -> action candidate
validate(schema, precondition, permission)
execute(idempotency_key, timeout)
observe(typed result | typed error | unknown)
commit(event, source, timestamp)
reduce(x_t, event) -> x_{t+1}
若工具超时,系统可能处于 unknown,不能直接重试有副作用动作。用幂等键 (k) 可要求同一逻辑操作满足:
[ execute(k,a);execute(k,a)\equiv execute(k,a) ]
但这只在工具端真正实现幂等时成立。客户端重复携带键不构成保证。
记忆检索可写为候选集合 (M_q=\operatorname{topK}_m score(q,m))。真实效用不只由相似度决定,还受时效、权限和来源影响:
[ U(m\mid q)=\alpha sim(q,m)+\beta relevance(m)-\lambda age(m)-\rho risk(m) ]
这些权重不是通用真理。更重要的是先过滤无权限或已过期条目,再排序;不能让高向量相似度覆盖策略禁令。
最小练习或观察步骤
- 选择一个本地“阅读案件摘要并提出下一步问题”的合成任务,列出 working、episodic、semantic、procedural 四类候选状态。
- 定义两个 stub:
lookup_case只读,append_note有本地副作用。为每个工具写 JSON-like input/output、错误枚举、timeout 与 permission。 - 构造三条同内容不同来源的记忆:用户确认、工具返回、模型推测。设计检索输出必须保留来源标签。
- 为
append_note加 idempotency key,手推成功、明确失败、超时未知、重复请求四条状态路径。 - 设一条过期事实和一条新事实,检查系统是覆盖、并存还是标记 superseded;禁止静默改写旧事件。
- 只记录结构化 action/result,不要求保存隐藏思维链;没有实际运行就不填写成功率或恢复时间。
常见误区与边界
- 把完整 transcript 当作完美记忆,忽略噪声、冲突、token 成本和跨 session 状态。
- 模型说“我记得”就当事实已持久化;没有外部存储与来源便不可审计。
- 把向量相似度当真实性,返回过期、越权或被污染的高相似文本。
- 工具返回 HTTP 成功就等于业务后置条件满足;还需验证 typed result 与系统状态。
- 所有动作失败都自动重试,导致重复扣款、重复提交或状态冲突。
- 本日只构建本地 stub 与边界,不授予网络、凭证、资金或生产写权限。
研究/系统场景连接
金融调查 Agent 的“客户地址”“风险意见”“主管决定”不能同权存储:地址可能来自主数据,风险意见来自模型,主管决定来自授权人工。检索时必须保留 provenance,写工具默认只允许追加草稿而不改变案件状态。研究场景中,实验 Agent 可把论文元数据、本人观察与模型总结分层;若不分层,后续自我引用会把生成文本伪装成外部证据。记忆架构因此不等于“更多上下文”,而是可追溯的知识状态管理。
自检问题
- context window 与 persistent memory 的所有权和生命周期有何区别?
- 为什么 tool schema 不能替代 permission 与 side-effect contract?
- 超时后为何可能进入
unknown而不是failed? - 同内容不同来源的记忆应怎样表示?
- 哪些信息绝不应由模型自行升级为事实?
专业课程对齐
- 阅读 ReAct 原始论文,关注 reasoning/acting/observation 的交替接口,不把可见轨迹等同于完整内部机制。
- 阅读 Toolformer 原始论文,区分“学会在文本中插入 API 调用”与生产系统中的权限、验证和副作用控制。
- 阅读 MemGPT 原始论文,观察其 memory tier 隐喻如何组织有限上下文,并列出该隐喻没有自动解决的真实性与治理问题。
深入学习提示
深入时可研究 event sourcing、temporal database、capability-based security 与 retrieval policy,但每加入组件都先回答它拥有哪类状态、谁能写、怎样撤销。可以用状态机手推替代完整框架安装。真正需要理解的是错误如何从记忆或工具跨越边界传播,而不是背诵 Agent 框架名字。
学后填写区
- 实际定义的 memory schema:
- 实际定义的 tool contract:
- 一个来源冲突:
- 一个 timeout/幂等边界:
- 未授予的权限:
- 尚未理解的问题: