Browse this library

Chinese source article

3.2 · 长期记忆与技能

拆解记忆的写入、检索、更新与遗忘,并区分事实状态和流程技能。

View original Markdown ↗

1. 记忆类型

1.1. 事件与事实

事件记录某时发生的观察或动作,事实是经过归并后可复用的状态。事实必须保留来源事件、时间和适用范围,以便更新与撤销。

用户偏好属于带主体和情境的事实,不应从一次选择推导为永久规则。写入时需要显式置信度与生命周期。

记忆记录可表示为 m=(content,kind,subject,scope,source,time,validity,confidence,version)m=(content,kind,subject,scope,source,time,validity,confidence,version)。kind 区分事件、事实与偏好,scope 限制适用任务,source 指回原始观察,validity 给出生效与过期条件。向量只负责候选召回,不能承载全部治理字段。

事件保持“何时观察到什么”,事实由一个或多个事件支持。把事件直接改写成无时间事实,会让“用户今天选择深色主题”变成永久偏好。合并器保留事件,并单独维护当前事实视图。

1.2. 程序性知识

程序性知识描述任务步骤、检查项和工具组合。它比普通事实更接近技能,但仍需经过成功轨迹和失败边界验证。

直接把一次成功对话保存为流程,会夹带偶然步骤和环境特例。提炼时应保留前置条件、输入输出和验收方式。

技能与程序性记忆接近,但发布后的技能是受版本控制的执行资产。它包含指令、脚本、模板和参考资料,可以被发现、加载、组合和回归测试。长期记忆由任务运行持续写入,技能默认不能由任意 observation 自动改写。

Voyager 在 Minecraft 中把成功生成且通过环境反馈的代码保存进技能库,后续任务按描述检索并组合已有技能。技能库帮助新世界中的任务迁移。关键在于可执行技能经过环境验证并有明确功能描述,而非单纯保存成功对话。

2. 记忆操作

2.1. 写入与更新

写入门控检查新颖性、证据质量、作用域和敏感性。更新时建立版本关系并调整当前有效状态,避免追加互相矛盾的文本。

删除和过期同样属于一等操作。无法撤销的长期记忆会持续污染后续任务,也难以满足用户更正要求。

写入候选先检查来源、新颖性、敏感性和预计复用价值。用户明确提供的稳定偏好、工具确认的资源事实与模型猜测使用不同阈值。接受、合并、隔离或拒绝都记录理由,模型生成的摘要需要重新绑定源事件。

去重先按主体、谓词、作用域和时间筛选,再判断表达差异。“项目部署在上海区域”和“用户住在上海”包含相同地名,却不是同一事实。完全重复时增加证据与最近观察时间;集合、计数和版本配置分别使用适合自身类型的合并规则。

新证据与当前事实冲突时,系统比较来源、时间、作用域和显式更正。用户说“以后不要邮件提醒”会终止旧偏好的有效期,而不是删除旧事件;两个工具同时报告不同余额时,需要重读权威源,不能以到达顺序决定。

遗忘包括过期、降权、归档和删除。用户撤销或合规删除要从事实视图、向量索引、缓存和派生摘要传播。删除源事件后,依赖它的合并事实重新计算;只删一个索引条目会让信息继续从摘要路径返回。

2.2. 检索与使用

检索可以综合语义、实体、时间与任务阶段。返回结果还要通过权限和冲突检查,再由上下文构造器选择必要片段。

记忆命中率不能单独表示有效性。真正指标是被读取的记忆是否改善动作、减少重复,并避免引入过期信息。

读取分成候选召回、治理过滤、重排和上下文装配。候选可结合向量、关键词、实体和时间;过滤检查主体、权限、有效期与冲突;重排依据当前子目标;装配只选择预算内必要片段。每一步的拒绝原因进入 trace。

Generative Agents 的 memory stream 记录经历,并在检索时结合相关性、时近性与重要性;系统还生成 reflection 与计划。论文消融显示观察、规划和反思组件都影响行为可信度。该实验说明长期事件需要选择机制,也提醒我们面向角色模拟的可信行为指标与工具任务的事实正确率不同。

3. 技能系统

3.1. 按需加载

技能目录只提供名称、适用条件与入口,完整说明在触发后加载。这样既减少基础上下文,也避免无关流程互相干扰。

技能可以引用脚本、模板和资料,但执行仍经过统一工具层。否则技能会形成未经审计的隐藏权限通道。

3.2. 发布与评测

技能变更需要版本和回归任务。评测应覆盖正常路径、缺失输入、工具故障和越权请求,确认说明能够引导策略正确停止。

生产轨迹可以发现技能缺口,但自动改写并立即生效风险较高。候选修改应在隔离环境验证,再进入受控发布流程。

4. 技能表示、发现与加载

4.1. 技能包结构

技能元数据包含名称、目的、触发条件、输入输出、前置能力、风险等级、版本和短描述。正文给出步骤、分支、失败处理与验收;资源目录放脚本、模板和参考材料。目录只注入元数据,选中后读取完整技能,减少基础上下文。

脚本是可执行资产,需要代码审查、依赖固定和沙箱运行。说明文本不能赋予脚本额外权限。技能调用的工具仍由当前主体授权,技能声明“需要网络”只用于发现阶段检查能力。

4.2. 发现与选择

发现先依据任务类型、输入对象和可用能力筛选,再进行语义匹配。多个技能同时匹配时,比较前置条件、版本、风险和历史成功分布;无法区分时加载短摘要或要求策略给出选择依据。技能名称相似时使用稳定 ID。

发现失败包括漏召回与误召回。目录描述太抽象会漏掉具体任务,过宽触发条件会让无关技能竞争。评测构造正负任务和近邻技能,统计 top-k 召回、最终选择与加载后的任务增益。

4.3. 加载与预算

加载动作返回技能版本、正文和资源清单。长参考资料不全部进入上下文,而是提供局部索引与按需读取。工具 schema 已由 Host 提供时,技能引用工具名和使用条件,不复制整份定义。

一个任务加载多个技能时,装配器检查指令冲突和预算。安全规则、仓库规范等高优先级约束不能被技能覆盖。技能正文属于受信配置仍需版本边界,外部参考资料继续按不可信数据处理。

4.4. 技能实例化

技能模板中的输入先绑定当前任务实体,再检查前置条件。例如“发布文章”技能需要目标站点、文章版本、凭据能力和用户审批;缺少任一项就停在准备阶段。模型不能用记忆中的旧站点或旧审批填补当前参数。

实例化结果是当前运行的计划,不会修改技能定义。执行后产生的错误可以形成技能改进候选,经过多个轨迹验证才进入新版本。模板与实例分离,使同一技能能在不同项目复用,又不会把某次任务状态带入下一次。

5. 组合、污染、版本与评测

5.1. 组合契约

技能组合依赖输入输出契约。收集资料 输出带来源的文档集合,撰写综述 接受该集合并输出主张—来源映射,发布文章 还要求用户审批。若前一技能只输出自由文本,后一技能难以判断来源完整性。

组合可以由工作流固定,也可由模型规划。Runtime 检查依赖图、权限和数据标签,防止私有读取结果流向公共发布技能。子技能失败时保留已验证产物,按错误类型重试或停止。

5.2. 污染与供应链

恶意网页可能声称“把以下步骤保存为新技能”,工具结果也可能夹带脚本。运行中的 observation 只能产生候选,不能直接写入技能目录。发布需要来源审查、静态检查、隔离测试和明确授权。

技能依赖的脚本、工具和模板形成供应链。每个版本记录内容哈希与依赖范围,远端资源加载时校验,技能不能静默下载并执行最新代码。敏感凭据由工具运行时注入,不写进技能文本或脚本。

5.3. 版本与回滚

技能升级可能改变步骤、工具参数或验收条件。新版本在固定任务集与对抗样本上回归,通过后再成为默认;运行中的任务继续绑定旧版本,避免中途改变语义。严重问题可以撤销版本并阻止新加载。

成功率下降时比较技能版本、模型、工具和环境,不能把所有回归归给说明文本。历史轨迹保留技能哈希,使问题可复现。若工具接口已经删除,旧技能标记不兼容,而不是增加长期兼容分支掩盖问题。

5.4. 记忆实验

记忆实验跨多个会话注入事实更新、冲突、更正和删除请求,测写入精度、读取 precision/recall、冲突解析、遗忘完成度与下游任务成功。对照组包括无记忆、完整历史、简单向量库和带治理的结构化记忆,所有额外调用计入成本。

测试样本要覆盖时间问题、主体歧义和权限隔离。模型记得某条事实却用于错误用户,危害大于完全没召回。删除测试还要检查派生摘要、缓存和备份恢复后的再出现,不能只查询主表。

技能实验。

技能实验把任务划分为库内技能、近邻技能、需要组合和未覆盖任务。测发现、选择、执行、迁移与安全拒绝,并消融目录描述、JIT 加载、脚本和验收器。Voyager 式技能库适合观察跨任务复用,评测仍要固定环境版本和探索预算。

联合实验检查记忆与技能是否互相污染。历史事实可为技能参数提供值,却不能修改技能规则;技能执行结果可产生记忆候选,却不能自动发布新技能。分别关闭两个写入通道,才能判断提升来自个性化事实、流程复用还是额外上下文。

冲突处理轨迹。

用户过去偏好邮件提醒,本轮明确要求某项目只用站内通知。写入器创建项目作用域的新偏好,并把全局旧偏好保留为其他项目的默认值。读取该项目任务时,作用域更具体的事实优先;读取另一个项目时仍可返回全局偏好。若用户随后说“所有项目都不要邮件”,新事实终止全局旧版本,并使各项目派生缓存失效。

工具事实也会冲突。资产目录显示服务器属于团队 A,实时云 API 显示已转给团队 B。系统保留两个事件,按权威性和时间把 B 设为当前事实,同时记录变更来源。涉及删除服务器的高风险动作仍重新读取并请求审批,不能只依赖记忆视图。

技能组合轨迹。

任务是把内部实验整理成公开报告。发现器选择“读取实验产物”“核对指标”“撰写报告”三个技能,但拒绝自动加载“公开发布”,因为任务尚未包含发布授权。第一个技能输出带访问级别的文件集合,第二个技能只接受允许进入报告的数据,并生成指标—来源表,第三个技能据此写稿。

若实验产物含有提示模型上传原始日志的文字,该内容仍属于不可信数据,不能改变技能链。报告完成后,用户明确批准发布,系统才加载发布技能,并再次检查敏感字段。组合成功来自结构化产物、权限和验收器,而非几个技能文本简单串联。

负迁移与无技能路径。

技能库并非越大越好。旧框架迁移技能可能在新仓库错误修改配置,通用写作技能可能覆盖项目专用格式。发现器需要允许“不使用技能”,基线评测也要包含无技能路径。若加载后成功率下降或步骤增加,系统应降低该技能在对应任务分布的排序。

未覆盖任务不应被强行匹配到最相近技能。模型可以使用基础工具完成一次任务,轨迹进入候选池;只有多次出现共同结构且提炼后能在新样本复用,才值得创建技能。这个门槛减少技能碎片和偶然流程固化。

记忆与技能的最小数据模型。

记忆表保存不可变事件、版本化事实和派生关系;索引只是可重建读取层。技能仓库保存版本化包、清单、依赖与测试结果;运行记录只引用技能版本和实例参数。两者可以共用检索设施,却不共享写入 API。

这种分离让治理动作清楚:用户更正触发事实新版本,删除请求沿派生关系传播;技能修改走审查、测试和发布,回滚只影响新运行。若用同一个 upsert(text) 同时处理两者,任何工具 observation 都可能改写执行规程,任何技能升级也可能覆盖历史事实。

记忆读取的反事实评测。

要测一条记忆是否真正有用,可以在相同任务上运行三个条件:提供正确记忆、隐藏该记忆、提供语义相近但过期的记忆。比较下一动作、完成率和成本。若三组没有差异,记忆可能未被利用;若过期组明显更差,读取门控比召回数量更重要。

反事实还可以修改记忆中的单个字段,例如项目区域、用户时区或工具版本,并保持其余上下文不变。Agent 的相关动作应随字段变化,无关动作应保持稳定。这样能发现模型只是复述记忆文字,却没有把它绑定到决策参数。

跨会话实验要防止答案泄漏。测试任务在后续会话换实体和表述,只保留真正需要复用的事实;技能任务则换输入但保留流程结构。若模型靠完整旧对话匹配表面文本,迁移后表现会下降,从而与结构化记忆和技能复用区分。

遗忘的完整性验证。

用户要求删除某偏好后,验证器依次查询当前事实、语义索引、关键词索引、摘要缓存和个性化推荐结果,并新建会话确认该信息不再影响动作。审计日志可以保留删除事件和不可逆摘要,但不保留已删除内容本身。

备份与离线训练集有独立周期。删除流程记录哪些副本无法即时物理清除、何时到期、恢复备份后如何重新应用墓碑。若历史数据已进入模型训练,普通数据库删除不能宣称从模型参数移除;系统要准确限定承诺范围。

遗忘也可由时间和任务结束自动触发。一次性验证码、临时路径和会话密钥从不进入长期记忆,项目关闭后其运行细节归档,稳定经验只有在重新验证后才保留。先减少不必要写入,比事后清理更可靠。

技能回归矩阵。

每个技能维护正常、缺输入、环境故障、权限拒绝、注入内容和版本不兼容六类任务。升级说明或脚本后,矩阵同时检查选择、加载、动作轨迹、终局与安全拒绝。只测试成功示例,会让新版技能在错误路径上无限重试或越权回退。

组合技能还要做成对测试。输入输出 schema 相容不代表语义相容,例如资料收集技能输出包含内部来源,公开写作技能虽能读取,仍不能发布。数据标签与权限作为组合契约的一部分,编排器在运行前检查,在发布前再次验证。

评测结果按技能版本、模型、工具版本和环境记录。技能升级提高成功率却显著增加 token 或网络读取,需要在成本曲线上比较;提高平均分却让少数高风险任务越权,则不能发布为默认。版本治理最终服务于可重复、可回滚的流程能力。

技能提炼的准入条件。

候选技能至少来自多条可验证轨迹,具有重复任务结构,并能写出稳定输入、输出和失败边界。只出现一次的特殊操作保留为事件或项目笔记;无法定义验收的经验继续作为参考资料。这个准入条件防止技能库被每次成功尝试切成大量碎片。

提炼时比较成功与失败轨迹,找出必要步骤和偶然步骤。某次任务先重启服务再通过测试,不表示重启是通用前置条件;只有环境证据显示缓存状态导致失败,才把相应检查写入分支。脚本参数化实体和路径,禁止携带原任务凭据、绝对临时目录与用户数据。

发布前在未见任务上运行,并加入缺少依赖、工具改名和权限受限场景。技能若只能复现原任务,属于轨迹记忆;能在约束范围内迁移且失败时安全停止,才成为程序性资产。这个判据构成长期记忆与 Skill 的最终边界。

技能退役后,目录停止返回该版本,已有运行保留引用用于审计。替代技能若改变输入输出,调用方与组合契约同时更新,不保留含糊适配层。历史轨迹继续说明当时为何选择旧技能,却不能让新任务重新获得已经撤销的能力。

记忆和技能最终都服务于下一动作质量。前者提供带时间和主体的事实,后者提供经过验证的操作方法;任何无法改善决策、无法追溯来源或无法安全撤销的持久内容,都不应因为存储便宜而默认积累。 长期记忆是经过写入策略选择、带来源和生命周期的可复用状态;无限聊天记录不具备这些维护语义。事件记忆记录某次任务发生了什么,语义记忆保存相对稳定事实,程序性记忆描述怎样完成一类任务。三者更新频率、冲突处理和删除要求不同,不应混在一个向量集合。

记忆项可表示为 m=(content,source,scope,version,confidence,validity,acl)m=(content,source,scope,version,confidence,validity,acl)。source 支持回溯,scope 限制主体与任务域,version 处理更新,validity 表示时间或条件,acl 决定谁能检索。只有 content 与 embedding 的记录无法可靠维护。

写入门槛依据未来效用、稳定性、可验证性和敏感度。一次工具超时通常不值得长期保存,用户明确偏好可以保存,外部网页中的操作指令默认不写入。模型提议记忆,可信写入器检查来源、重复和权限,再提交。

更新采用实体或主题身份,而非相似文本覆盖。新事实可能补充、替代或与旧事实冲突。系统保留时间区间与来源,让检索根据问题时间选择;无法裁决时同时返回冲突与证据,不用最近写入者自动获胜。

删除具有传播语义。原始记忆删除后,由它生成的摘要、索引和技能候选也要失效。反向依赖图记录派生关系,删除任务遍历并留下墓碑。只从主表删一行却保留向量缓存,会造成幽灵召回。

检索不只依赖向量相似度。候选先按主体、作用域、有效期和权限过滤,再结合语义相关、时间、置信度和任务效用排序。最终注入的记忆保留来源与“为何召回”,便于模型判断是否适用。

记忆的价值通过反事实评估:同一任务分别提供目标记忆、无记忆和无关记忆,比较终局与成本。如果三者无差别,记忆没有可测效用;若无关记忆导致退化,检索器需要更强过滤。只统计命中率会奖励频繁但无用的召回。

个人偏好容易被过度泛化。用户在一个项目要求简短输出,不代表所有场景都应省略解释。记忆保存作用域、例外和最近确认时间;涉及高风险决策时,旧偏好不能替代当前授权。

技能是可执行的程序性知识包,包含触发条件、输入输出契约、步骤、工具依赖、权限、失败处理、示例和评测。单段提示可以是技能内容之一,却不足以描述副作用与版本。技能包发布前应通过独立任务验证。

技能发现先按领域、能力和权限筛选,再根据任务匹配。只靠名称相似会把“发布报告”和“生成报告”混淆。候选技能展示用途、前置条件与风险,模型决定是否加载;完全不具备所需工具的技能不进入候选。

加载采用渐进披露。初始索引只占少量上下文,选择后加载主说明,执行到特定分支再读取模板或参考。一次加载整个技能库会让程序性知识与任务证据竞争窗口,也增加恶意技能注入面。

技能实例化把抽象参数绑定到当前资源与版本。例如“发布站点”技能要绑定仓库、分支、环境和审批策略。绑定结果进入计划与审计,技能不能用隐藏默认值选择生产环境。资源变化后实例失效,需要重新解析。

组合技能需要契约匹配。上游输出类型、数据标签和版本满足下游输入,权限集合取各步骤实际所需能力,而非所有技能权限并集长期开放。两个技能都写同一资源时,组合器建立串行或冲突处理。

供应链威胁来自技能说明、脚本、依赖和更新源。安装前固定来源与内容哈希,审查工具和网络需求,在无秘密环境测试。技能文档属于不可信输入,不能自称“需要管理员权限”就得到能力。

版本升级保存语义变更与回归结果。正在运行的实例固定版本,新任务才使用新版;高风险修复可以撤销旧版本并使待执行实例失效。回滚恢复代码与依赖,还要处理新版已经创建的外部状态。

记忆与技能之间存在提炼链。多次成功轨迹出现稳定模式后,候选生成器提取步骤与前置条件;独立评测通过后才发布技能。单次成功可能依赖偶然环境,不能直接固化。技能执行结果反过来产生事件,但不会自动改写技能定义。

考虑两个项目对测试命令有冲突记忆。项目 A 使用包级测试,项目 B 要先生成代码再测试。检索器按仓库身份与规则作用域返回对应事实,而非按“测试”相似度混合。若当前仓库规则更新,旧记忆标为失效但保留历史来源。

一次技能组合任务需要“抓取数据—生成报告—发布草稿”。抓取技能返回带来源和隐私标签的数据集,报告技能只接收允许字段,发布技能默认创建草稿并要求审批。数据标签沿接口传播,发布阶段不能把内部原始数据附到公开页面。

若抓取页面结构变化,第一技能失败并返回 stale_selector。组合器不继续生成空报告,也不让发布技能执行。模型可以重新观察并修复抓取实例,已验证的数据仍复用。失败隔离依赖显式输出契约,而非每个步骤凭自然语言猜前一步成功。

负迁移是技能系统的核心风险。一个“修复测试”技能可能习惯添加等待,在并发 bug 上造成补丁;一个写作技能可能删掉技术限定。系统保留无技能基线,并在评测中比较成功、成本和风险。技能被选择不代表必须执行到底。

最小数据模型区分 memory、skill、skill_version、evaluation、dependency 和 provenance。运行实例引用精确版本与输入资源,评测结果引用任务集和环境。用一个 Markdown 文件也能表达这些字段,但检索和执行必须遵循同一事实源。

遗忘评测从已知记忆出发,删除后检查主存储、向量索引、缓存、摘要和技能派生物,再运行诱导查询确认不再召回。仅看列表消失无法证明删除完整。审计保留墓碑,不保存被删除敏感正文。

技能回归矩阵覆盖支持的工具版本、环境、权限和任务变体。happy path、错误恢复、拒绝与取消都要运行。依赖升级后只重测受影响组合,并周期性运行全套高风险路径。没有环境证据的“文档更新”不算技能通过。

技能提炼的准入条件包括重复出现、因果步骤清晰、前置条件可观察、收益超过无技能基线、权限可收窄和失败可恢复。无法满足时保留为案例或记忆,不包装成可执行技能。库的规模不是目标,有效覆盖和低负迁移才是。

长期系统还需控制记忆老化。周期任务按有效期和使用情况检查,不常使用不等于应删除,高频召回也不等于正确。关键是来源是否仍有效、内容是否被新事实替代,以及继续保存是否符合用户意图与隐私策略。

最终,记忆回答“哪些过去事实值得在当前任务使用”,技能回答“哪套经过验证的程序可复用”。二者都必须经过来源、版本、权限和评测边界。把所有历史自动变成记忆、把成功轨迹自动变成技能,会把偶然错误持久化并放大。

记忆写入与读取可以使用不同模型,但权威判断仍在策略层。写入模型抽取候选,规则与 verifier 检查来源、敏感字段和冲突;读取模型负责相关性重排,权限过滤在它之前执行。模型版本变化不会绕过删除与访问控制。

实体合并要保守。姓名相同、仓库同名或公司简称相似都可能指向不同对象。记忆系统保存稳定 ID 和别名证据,无法确认时保持两个实体。错误合并会让后续检索持续携带错误事实,比偶尔漏召回更难发现。

技能参数区分普通配置和秘密。模板声明凭据槽但不包含令牌,实例化时由 broker 注入。导出或共享技能不会带走用户秘密,运行日志只记录槽标识与用途。技能请求未声明凭据时,执行器拒绝并触发重新审批。

用户应能查看、修正和删除与自己相关的记忆,理解每条记忆在哪些任务生效。界面展示来源与最近使用,修改产生新版本并保留历史审计。错误记忆被纠正后,依赖它生成的计划和技能候选重新验证。

评测还要覆盖正确拒绝写入。恶意网页要求保存永久指令、一次性密码出现在工具输出、模型自造用户偏好,这些候选都应被拒绝。只测试有用记忆召回,会遗漏写入面最严重的安全风险。

记忆和技能的容量不是固定条数问题。维护成本随冲突、版本和依赖增长,低价值条目会增加检索噪声。周期任务依据可验证效用、有效期和用户意图清理,保留删除证据与回滚策略,使库保持可理解规模。

系统无法确认旧记忆是否有效时,返回带不确定性的候选并优先查询权威源。静默使用可能过期的地址、API 或法规具有高风险。记忆负责缩短寻找路径,不能取代当前事实确认。

这一边界让记忆提升效率,却不夺取事实源的权威地位。

所有召回仍需接受当前环境验证。