ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

agentmemory 精确记忆删除实战:forget 技能完整指南(搜索—确认—删除工作流)

agentmemory 精确记忆删除实战:forget 技能完整指南(搜索—确认—删除工作流) agentmemory 精确记忆删除实战forget 技能完整指南搜索—确认—删除工作流【免费下载链接】agentmemory#1 Persistent memory for AI coding agents based on real-world benchmarks项目地址: https://gitcode.com/GitHub_Trending/age/agentmemory本指南围绕 agentmemory 的forget技能展开讲解如何在不破坏记忆库的前提下安全、可审计地删除 Agent 持久记忆中的指定内容。你将掌握memory_smart_search定位记忆、memory_governance_delete精准删除的完整调用链理解先展示匹配结果、再获取显式确认、最后按 memoryId 删除的规范化流程并深入mem::governance-delete底层实现弄清删除一条记忆时索引、访问日志与审计记录是如何保持一致性的。forget 技能是什么forget是 agentmemory 内置的一项 MCP 技能Skill其元数据定义在 plugin/skills/forget/SKILL.mdnameforget适用场景用户说 forget this、delete memory、remove that note或出于隐私考虑要求清除特定数据时argument-hint[what to forget - session ID, file path, or search term]——即遗忘目标可以是会话 ID、文件路径或搜索词user-invocabletrue用户可直接触发它回答的是一个核心问题当 Agent 需要从持久记忆中删除数据时如何确保删除是精确的、被授权的、且可追溯的配套的示例文档 plugin/skills/forget/EXAMPLES.md 提供了三种典型场景的完整对话与工具调用范本是本指南的主体。从技能设计上看forget与remember写入侧互为逆操作与recall精确定位记忆 ID协同工作——正如 SKILL.md 的 See also 一节所声明的remember: the write side; forget is its undo、recall: find the exact memory id before deleting。为什么删除必须先确认SKILL.md 的Why一节给出了三条刚性原则删除是破坏性且不可逆的——执行前必须向用户展示将要删除的确切内容必须获得显式确认——得到明确的 yes 才能调用删除只能按 memory ID 删除绝不能传裸的 sessionId——MCP 层根本不接受{ sessionId: ... }这样的删除请求。这一原则在源码中得到了印证memory_governance_delete工具的输入 Schema 只声明了memoryIds必填与reason可选两个字段见 src/mcp/tools-registry.ts不存在任何按会话删除的入口。所有删除都必须先落到具体的记忆 ID 上。完整工作流六步删除法SKILL.md 的Workflow一节定义了标准流程逐条展开如下搜索定位调用memory_smart_search将用户的原始描述作为query并设置limit: 20展示并确认向用户列出命中的内容——会话 ID、记忆 ID、标题——然后明确询问是否删除。禁止在用户沉默或含糊回应如 sure, whatever的情况下继续执行删除确认后调用memory_governance_delete参数为memoryIds数组或逗号分隔字符串与可选的reason默认值plugin skill request整会话删除若要删除整个会话需从搜索结果中收集该会话的全部记忆 ID 并一并传入。MCP 不接受裸的sessionId经验Lessons单独处理memory_governance_delete不会触碰 Lessons删除经验需使用memory_lesson_delete配合其lessonId回执数量向用户报告实际删除数量。删除数为 0 表示这些 ID 不存在应如实说明而不是谎报删除了。快速开始模板SKILL.md 给出的最小可运行示例memory_smart_search { query: old api key in config, limit: 20 }展示匹配项、获得确认后memory_governance_delete { memoryIds: [abc12345, def67890], reason: user privacy request }预期输出Found 2 matching memories. Confirmed. Deleted 2 memories.实战示例一删除泄露的密钥源自 plugin/skills/forget/EXAMPLES.md 的场景 1。用户说Forget that note where I pasted the API key.忘掉我粘贴 API 密钥的那条笔记。第一步搜索定位memory_smart_search { query: api key, limit: 20 }第二步返回结果{ results: [ { id: abc12345, sessionId: 7f3a9c21, title: Pasted staging API key, narrative: STAGING_KEYsk-live-... } ] }第三步展示匹配项并请求确认注意要带上记忆 ID 与会话 ID 供用户核对Found 1 match:abc12345(session7f3a9c2) Pasted staging API keyDelete this memory? (yes/no)第四步用户确认后执行删除memory_governance_delete { memoryIds: [abc12345], reason: user privacy request }第五步删除结果{ deleted: 1 }第六步向用户回执Deleted 1 memory (abc12345).整个链路的关键在于泄露密钥这一类敏感内容不能靠模糊的 forget it 就删除必须让用户看到具体是哪一条记忆、来自哪个会话确认无误后才动手。实战示例二删除整个会话的观测源自 EXAMPLES.md 的场景 2。用户说Delete everything from the throwaway spike session.删除那个一次性 spike 会话里的所有内容。第一步搜索并识别会话memory_smart_search { query: spike prototype throwaway, limit: 20 }第二步假设返回 4 条结果且sessionId均为c98f1100。此时应把四条全部展示给用户、获得 yes然后一次性传入所有 IDmemory_governance_delete { memoryIds: [m1, m2, m3, m4], reason: drop throwaway spike session }关键注意事项原文档强调绝不发送{ sessionId: c98f1100 }这种请求——MCP 只按记忆 ID 删除。删除整会话的唯一正确姿势就是像上文一样把会话内所有记忆 ID 收集齐后批量传入。实战示例三用户反悔怎么办源自 EXAMPLES.md 的场景 3。用户说Actually, on second thought, keep them.算了还是保留吧。此时不要调用任何删除工具直接确认即可Understood, nothing deleted. The 4 memories from sessionc98f110are intact.这个示例点明了流程设计的本质确认环节不仅是安全阀也是回退点。在用户给出显式 yes 之前系统状态完全没有被改动。反模式什么情况绝不能做SKILL.md 的Anti-patterns一节用对比方式给出了红线错误示范WRONG——搜索返回匹配后不展示、不等待确认立即调用memory_governance_delete正确示范RIGHT——先列出匹配项询问 Delete these 2? (yes/no)只有在获得明确 yes 之后才执行删除。删除前检查清单SKILL.md 的Checklist提供了可逐项自检的四条匹配项在删除前已经展示给用户收到了显式的 yes而不是默认假设同意memoryIds中存放的是搜索返回的真实 ID绝非裸的sessionId最终消息如实报告了实际删除的数量。底层原理mem::governance-delete 到底做了什么memory_governance_delete在 MCP 层被路由到内部函数mem::governance-delete其实现位于 src/functions/governance.ts。从源码可以完整还原一次删除的真实副作用for (const id of data.memoryIds) { const mem await kv.getMemory(KV.memories, id); if (mem) { await kv.delete(KV.memories, id); // 1. 删除 KV 主存储 await deleteAccessLog(kv, id); // 2. 清除访问日志 getSearchIndex().remove(id); // 3. 从 BM25 全文索引移除 vectorIndexRemove(id); // 4. 从向量索引移除 deleted; } } if (deleted 0) await flushIndexSave(); // 5. 落盘索引几点值得注意的实现细节参数校验memoryIds必须是非空数组否则直接返回{ success: false, error: memoryIds array is required }幂等语义对每个 ID 先kv.get判存在不存在的 ID 会被静默跳过最终通过deleted与total请求总数的差值反映真实情况索引一致性一次删除会同步清理三处冗余KV 主存储、访问日志access-tracker、BM25 搜索索引与向量索引search.ts 中的getSearchIndex/vectorIndexRemove并在删除成功后flushIndexSave落盘避免删除后仍被memory_smart_search或memory_recall召回审计留痕无论删除是否成功都会调用recordAudit写入一条delete类型审计记录携带reason默认manual deletion与deleted数量供 memory_audit_query 追溯。MCP 层src/mcp/server.ts还做了输入规范化memoryIds接收逗号分隔字符串会经过split(,)→trim()→filter(Boolean)清洗后再透传给内部函数。因此调用方传数组或 CSV 字符串均可底层最终统一为 ID 数组。工具参数参考工具参数类型说明memory_smart_searchquerystring必填搜索词来自用户的原始描述limitnumber默认 101–100返回结果上限forget 流程建议 20expandIdsstring逗号分隔的观测 ID用于渐进式展开memory_governance_deletememoryIdsstring必填逗号分隔的记忆 ID 列表reasonstring删除原因写入审计记录其中memory_smart_search的描述为 Hybrid semantickeyword search with progressive disclosure混合语义 关键词的渐进式披露搜索见 src/mcp/tools-registry.ts其limit在 MCP 层被钳制在 1–100 之间src/mcp/server.ts。经验Lessons的单独删除路径SKILL.md 明确指出memory_governance_delete不触碰Lessons。删除一条经验要走独立工具memory_lesson_delete传入lessonId底层函数mem::lesson-delete定义在 src/functions/lessons.ts删除后同样会写入lesson_delete类型的审计记录MCP 工具注册见 src/mcp/tools-registry.ts 附近路由处理见 src/mcp/server.ts。因此在执行遗忘类请求时先判断目标属于普通观测Observation还是经验Lesson再选择对应的删除工具。相关技能与排障forget与其它记忆技能构成完整闭环remember写入侧负责把观测沉淀为记忆forget是其撤销操作recall精确定位记忆 ID 的入口删除前用它确保拿到真实存在的 ID通用排障手册若memory_smart_search或memory_governance_delete不可用按该文档排查 MCP 工具注册与连接问题。小结agentmemory 的forget技能把删除记忆这一高风险操作收敛为可复制的规范流程搜索展示 → 显式确认 → 按 ID 删除 → 数量回执。背后有mem::governance-delete的多索引同步清理与审计留痕做保障配合memory_lesson_delete覆盖 Lessons 场景既满足了隐私擦除如泄露密钥的刚性需求又杜绝了误删与不可追溯的操作——这正是 Agent 长期记忆系统写得多、忘得准的关键一环。【免费下载链接】agentmemory#1 Persistent memory for AI coding agents based on real-world benchmarks项目地址: https://gitcode.com/GitHub_Trending/age/agentmemory创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表