SCOPE本章边界
本章只讲长期记忆和可治理事实如何产生、存储、检索、删除和回放。它不把 vector database 当事实源,也不把 skill、eval 或训练数据飞轮混成 memory。
30 SEC面试开口版
我会把长记忆拆成三层:第一层是 session/event log,让 Agent 记得自己真实发生过什么;第二层是 curated memory,只保存少量稳定事实、偏好、项目约定;第三层是 retrieval/injection,在每轮模型调用前按 scope、相关性和 token budget 把记忆带回来。也就是说,先保证可恢复,再保证值得记,最后保证记忆以正确方式进入 context。
理解与记忆 · 术语、解析、关联知识点
| 专业术语 | Session / Event Log:会话事件账本,保存真实发生过的用户、模型、工具、权限、压缩和错误事实。 Curated Memory:经过治理后保存的长期事实、偏好、项目约定或决策。 Memory Candidate:模型或后台任务抽取出的候选记忆,还不能直接影响行为。 Retrieval / Injection:按当前目标检索记忆,并作为低优先级上下文块注入。 Scope:记忆适用范围,例如用户、项目、仓库、组织、会话。 Confidence / TTL:置信度和有效期,用来防止过期或不确定事实长期污染。 |
| 为什么这样回答 | 30 秒版要先挡住“上向量库”的低阶答案,把长记忆拉回生命周期:事实先落账,候选再治理,最后才检索注入。这个顺序能体现资深工程师知道 memory 会污染、会过期、会越权。 |
| 小白解析 | 长记忆不是“把聊天记录都背下来”。更像一个团队知识库:施工日志负责记录昨天真实做了什么;正式知识库只收录确认过的长期规则;开会时再按本次议题挑几条相关规则放到桌面。你不希望系统把一句临时抱怨、一个失败日志,或者网页里的恶意文字永久记成“以后都要这么做”。 |
| 关联知识点 | Guga 的 memory 调研把记忆拆成会话持久化、显式长期记忆、检索与上下文注入三层;learn-agent 的 Memory Governance 强调 candidate ledger、scope、confidence、TTL、tombstone;Zep 和 Mem0 的共同启发是记忆要有来源、作用域和检索策略,而不是把历史文本无限塞回 prompt。 |
1 MIN一分钟口语版
我不会一上来就说“上向量库”。我会先把 memory 拆成生命周期。第一层是 session/event log,它记录真实发生过什么,是恢复、审计和 replay 的基础;第二层是 curated memory,只保存稳定事实、用户偏好、项目约定、反复出现的决策,每条都要有 source_event_ids、scope、confidence、status 和 expires_at;第三层是 retrieval/injection,也就是模型调用前 runtime 根据当前目标把少量相关 memory 注入 context。最容易出问题的是污染:临时任务、错误结论、工具日志都不应该长期保存。所以自动抽取只产生 candidate,真正写入要过 policy;删除也不能静默消失,要有 tombstone 或 superseded 状态。
理解与记忆 · 术语、解析、关联知识点
| 专业术语 | source_event_ids:记忆引用的来源事件编号,用于解释“为什么记住”。 MemoryPolicy:决定候选记忆是否写入、如何过期、是否需要用户确认的策略。 Status:记忆状态,例如 candidate、active、superseded、deleted。 Tombstone:删除标记,防止被删记忆从索引或缓存里重新出现。 Memory Snapshot:某次会话当时可见的记忆版本,用于 replay。 Procedural Memory / Skill:可复用流程经验,通常应沉淀为 skill,而不是一条普通事实记忆。 |
| 为什么这样回答 | 1 分钟版按“记录事实 -> 抽取候选 -> 治理写入 -> 检索注入 -> 删除回滚”展开,能覆盖生产记忆系统最容易被追问的边界:污染、过期、权限、回放和评测。 |
| 小白解析 | 可以把 memory 想成“可修改、有审计的长期笔记”。系统可以建议记住某件事,但不能一听到就写进永久规则。比如用户说“今天先别跑测试”,这只是当前任务限制,不该变成以后所有项目都不跑测试。再比如旧项目曾经用 yarn,新项目用 pnpm,旧记忆就要降权或过期。 |
| 关联知识点 | Mem0 提供 user_id、agent_id、run_id 等 scope filter;Zep 把 episode、facts、entities、summary 分开;Hermes 使用 MemoryManager、prefetch、sync_turn、on_pre_compress 和 session switch hook,把记忆放进 Agent 生命周期;Guga 早期不应直接引入大 facade,而应拆成 ingest、extract、decide、persist、retrieve、render。 |
FLOW长记忆生命周期
从候选记忆到上下文注入
COMPARE别人怎么设计
Mem0
Mem0 的优点是工程化 API 很顺:按 user_id、agent_id、run_id 做 scope,向量检索配合 graph memory。它提醒我,memory search 必须有作用域,否则跨用户、跨 agent 污染会很难查。
Zep
Zep 更强调 temporal context graph 和 Context Block。它把事实、实体、episode、user summary 分开,还支持事实失效时间。这个设计说明记忆不是“永久正确”,而是有时间和来源的。
Graphiti
Graphiti 的 episode/entity/edge 思路很重要:原始事件和抽取事实要分开。图谱是投影层,不应该替代原始事实账本。
Hermes / DeerFlow
Hermes 用 MemoryManager 编排内置和外部 provider,支持 prefetch、sync_turn、on_pre_compress、on_session_switch。DeerFlow 用结构化 memory.json 和异步队列,强调过滤工具噪声和置信度阈值。
GUGA我是怎么设计的
- SessionLog 是第一层记忆所有 user/assistant/tool/permission/compact/branch 都 append-only 记录。它不智能,但它让恢复、审计和 replay 成立。
- CuratedMemory 只存少量稳定事实memory item 至少包含 scope、kind、content、source_event_ids、confidence、created_at、updated_at、expires_at、status。
- MemoryPolicy 决定写不写自动抽取只能产生 candidate,真正写入要过策略:是否稳定、是否敏感、是否重复、是否会过期、是否需要用户确认。
- Retrieval 是 runtime hookmemory 不应该只做成 model-callable tool。每轮 provider request 前,runtime 按当前目标和 budget 注入 memory context,并记录命中和丢弃原因。
- on_pre_compress 抢救知识上下文即将被压缩时,是抽取长期事实的好时机。压缩是为了丢 token,但有价值的知识不能一起丢。
MODEL我会怎么区分三种记忆
| 类型 | 保存什么 | 怎么用 |
|---|---|---|
| 会话记忆 | 完整运行事实、工具结果、压缩边界、错误、分支 | 恢复、审计、replay、历史搜索。 |
| 显式长期记忆 | 用户偏好、项目约定、稳定事实、反复出现的决策 | 每轮或按需注入,影响行为习惯。 |
| 程序性记忆 | 复杂流程、调试套路、部署步骤、工具使用经验 | 做成 skill,渐进式披露,需要时再加载完整内容。 |
PROBLEM我遇到的问题和优化
问题
- 如果所有对话都进 memory,系统会记住临时任务、测试日志甚至错误结论。
- 用户事实会过期,比如“现在用 A 服务”后来换成 B,旧事实不能永远有效。
- memory 内容可能被 prompt injection 污染,写进系统提示后风险更大。
- 如果写入立即改变当前 system prompt,会造成行为抖动和缓存失效。
优化
- memory 写入要保留 source_event_ids,能追溯“为什么记住”。
- 所有 search 必须带 user/project/agent/run 至少一个 scope。
- 保存 status:active、superseded、deleted;删除是 tombstone,不是悄悄消失。
- 文件式 memory 可以用冻结快照:当前会话写入落盘,下次会话再进入系统提示。
REVISIONMemoryPolicy 写入决策
| 来源 | 默认状态 | 原因 |
|---|---|---|
| 用户明确“请记住”且非敏感 | active | 用户确认、scope 明确、可删除。 |
| 工具验证过的项目事实 | active / scoped | 有 source_event_ids 和 artifact refs,可回源。 |
| 模型推断出的偏好 | candidate + TTL | 未经用户确认,不能长期覆盖当前事实。 |
| 网页、邮件、issue、工具 observation | candidate / quarantined | 低 trust,防 memory poisoning;需要用户确认或二次工具验证。 |
| secret、PII、访问令牌 | reject / confirm required | 默认不进长期记忆,必要时走敏感信息确认和最小化存储。 |
如果只存 embedding + chunk,没有 source_event_ids、valid_from、scope、status 和 tombstone,删除、冲突处理和回放都会失败。
REVISIONData Governance / Deletion Lineage
| 数据位置 | 删除请求后的处理 | 关键证据 |
|---|---|---|
| MemoryRecord | 写 tombstone,撤出 active 注入,清 retrieval/index refs。 | memory id、scope、deleted_at、requested_by、source_event_ids。 |
| Trace / model input snapshot | 原文脱敏或受限;诊断 replay 只显示“当时存在,现已删除”的元信息。 | snapshot id、redaction event、access audit。 |
| Artifact / cache / vector index | 按 lineage purge 或 irreversibly redact;缓存失效,派生索引重建。 | source_artifact_ids、index_refs、purge result。 |
| Eval / training sample | 进入 quarantine,不再评测或训练;必要时从数据集版本移除。 | dataset version、sample id、quarantine reason。 |
| Skill / policy contamination | 如果来自用户私有数据,重写、降级或移除;重新跑 eval gate。 | skill lineage、publisher、replacement version。 |
删除不是“表里 delete 一行”。只要运行轨迹能沉淀 memory、skill、eval 或训练样本,就必须保存 lineage,否则无法证明派生数据也被处理。
INTERVIEW两个 subagent 高强度追问整合版
面试官:长记忆、session log、context summary、vector database 到底是什么关系?第二层追问:谁是事实源?第三层追问:如果只有向量库会坏在哪里?
我:我会先分层。session/event log 是事实源,记录真实发生过什么;context summary 是当前会话压缩后的续航材料;curated memory 是经过治理的长期事实;vector database 只是一个检索索引,不是事实源。只有向量库会丢掉来源、时间、权限、删除语义和回放能力。生产里我会让 event log 保存原始事实,memory item 引用 source_event_ids,向量或图索引只是加速检索,坏了可以重建。
理解与记忆 · 背后工程点
背后工程点:记忆系统必须区分事实底座、长期资产和检索索引。
专业术语:
Event Log 是 append-only 的事实账本;
Context Summary 是为当前会话续航的摘要;
Curated Memory 是经过治理的长期事实;
Vector Index 是向量检索索引;
Source of Truth 是不可被派生物替代的事实源。
为什么这样回答:这题是防止把 memory 降维成“存 embedding”。先抢事实源定义,面试官会知道你能支撑恢复、审计和删除。
小白解析:向量库像图书馆的搜索目录,不是原书。目录坏了可以重建;原书丢了,就真的丢了。
关联知识点:Guga agent-memo 强调会话持久化、显式长期记忆、检索注入三层;learn-agent 也把 session replay 和 memory governance 分开。
面试官:向量记忆、图记忆、episodic memory、semantic memory 你怎么取舍?第二层追问:第一版到底做哪个?
第一版我会做轻量 curated memory + scoped retrieval,不直接上完整 graph-native runtime。向量适合语义召回,图适合实体关系和时间冲突,episodic 保存原始事件,semantic 保存抽取事实。对早期 Agent runtime,最重要的是来源、scope、状态和注入策略;索引实现可以先简单。等真实任务证明需要多跳关系和时序推理,再引入图记忆。
理解与记忆 · 背后工程点
背后工程点:先把治理契约做对,再扩检索形态。
专业术语:
Semantic Memory 是抽取后的事实知识;
Episodic Memory 是原始经历或事件;
Graph Memory 是实体和关系图;
Vector Retrieval 是向量相似度检索;
Temporal Reasoning 是按时间判断事实有效性。
为什么这样回答:这能体现不盲目追复杂方案。早期最大的风险不是检索不够炫,而是治理不足。
小白解析:刚开公司先把档案编号、权限和删除流程做好,不一定第一天就建复杂知识图谱。
关联知识点:Guga agent-memo 认为完整 graph runtime 对 early MVP 可能过重;Graphiti/Zep 的价值在事件和事实分层。
面试官:一条 memory item 最少要有哪些字段?不要只说 content 和 embedding。第二层追问:这些字段怎么支持删除、冲突和回放?
我:最少要有 id、kind、content、scope、source_event_ids、confidence、status、created_at、updated_at、valid_from、expires_at 或 TTL、supersedes、sensitivity、owner 和 embedding/index refs。scope 决定能在哪些任务里用,source_event_ids 支持回源解释,confidence 和 status 支持候选到激活,supersedes/tombstone 支持冲突和删除,snapshot id 支持 replay 时使用当时的记忆版本。
理解与记忆 · 背后工程点
背后工程点:memory item 是治理对象,不是一段文本。
专业术语:
MemoryRecord 是长期记忆记录;
Scope 是用户、项目、组织、会话等作用域;
source_event_ids 是来源事件引用;
Status 是 candidate、active、superseded、deleted 等状态;
Sensitivity 是隐私或安全等级。
为什么这样回答:字段设计直接决定系统能否审计、撤回、过期和解释。只讲 content/embedding 会显得像 demo。
小白解析:正式档案不能只写一句话,还要写谁说的、什么时候说的、适用哪里、还算不算数、能不能给别人看。
关联知识点:Mem0 的 user_id、agent_id、run_id filter 体现 scope;Zep 的 episodes/facts 保留来源;Guga 建议 memory 内部拆成 ingest、extract、decide、persist、retrieve、render。
面试官:自动抽取出来的 memory candidate 怎么变成 active memory?第二层追问:用户确认、工具验证、模型推断三种来源权重一样吗?
我:不一样。自动抽取只能进入 candidate ledger,不能直接影响高风险行为。MemoryPolicy 会看来源类型、是否稳定、是否重复、是否敏感、是否跨 scope、是否有工具或用户验证。用户显式确认和工具可验证事实权重更高,模型从对话里推断的偏好权重最低,通常需要 TTL 或下次确认。候选变 active 要记录 decision event,方便以后追责和回滚。
理解与记忆 · 背后工程点
背后工程点:写入路径要有候选、审核和激活状态,不能边想边永久化。
专业术语:
Candidate Ledger 是候选记忆账本;
MemoryPolicy 是写入治理策略;
User-confirmed Memory 是用户明确确认的记忆;
Tool-verified Fact 是工具或文件证据验证过的事实;
Decision Event 是写入或拒绝的审计事件。
为什么这样回答:这能回应“模型会不会乱记”的核心担忧。把来源权重拆开,说明你不把模型推断当事实。
小白解析:听别人随口一说和看到合同原件不是一回事。系统可以先记个草稿,但不能直接盖章归档。
关联知识点:learn-agent Memory Governance 强调 candidate ledger;Hermes background review 默认应保守,不值得保存就跳过。
面试官:一条“如何修这个项目的测试”的经验,应该进 memory 还是 skill?第二层追问:稳定事实和可复用流程边界怎么划?
稳定事实进 memory,可复用流程进 skill。比如“这个仓库用 pnpm”是项目事实,进 project memory;“修这个项目测试前先跑 pnpm test:unit,再看 fixtures,再更新 snapshot”是步骤和判断,应该沉淀为 skill。Memory 应该短、可引用、可过期;skill 可以有适用条件、步骤、反例、工具约束和验证方式。混在 memory 里会让上下文变长,也让流程很难维护。
理解与记忆 · 背后工程点
背后工程点:事实和流程是不同资产,生命周期不同。
专业术语:
Declarative Memory 是陈述性事实记忆;
Procedural Memory 是程序性流程经验;
Skill 是按需加载的可复用操作指南;
Applicability 是适用条件;
Verification Step 是流程结束后的验证步骤。
为什么这样回答:这能防止 memory 变成一本越来越长的操作手册。资深系统要把知识资产分型。
小白解析:“公司地址”是一条记忆;“怎么报销差旅”是一套流程。两者都重要,但不该放在同一张便签里。
关联知识点:LangGraph 把 semantic、episodic、procedural memory 分开;Hermes 会把复杂工作流创建或更新为 skill。
面试官:memory 应该作为 model-callable tool,还是 runtime 每轮自动注入?第二层追问:两种方式冲突时怎么办?
我会两者都支持,但默认关键记忆由 runtime lifecycle 注入。runtime 根据当前目标、scope 和 budget 注入少量高价值 memory,保证模型不用“想起来要查”;model-callable search_memory 用于按需深查历史或用户明确要求。冲突时,runtime 注入的是当前策略选择的低优先级 reference,tool 查询结果也是 observation,二者都不能覆盖当前用户指令和工具验证事实。
理解与记忆 · 背后工程点
背后工程点:记忆使用不能完全交给模型自觉,要进入请求生命周期。
专业术语:
Lifecycle Injection 是运行时每轮自动注入;
search_memory Tool 是模型可调用的记忆检索工具;
Observation 是工具返回的事实投影;
Reference Context 是低优先级参考上下文;
Budgeted Injection 是受预算限制的注入。
为什么这样回答:只做工具会漏掉关键记忆,只做自动注入会缺少按需深查。组合方案更接近生产。
小白解析:秘书会主动把最重要的几条规则放到会议材料里,但你也可以临时让她去档案室查一份旧文件。
关联知识点:Zep 的 ADK 集成在 LLM request lifecycle 注入 context;Guga agent-memo 建议 memory retrieval 不应只暴露成工具。
面试官:memory 检索命中 30 条,你怎么决定注入哪几条?第二层追问:相似度最高但过期怎么办?第三层追问:注入太多成本爆炸怎么办?
我会按任务相关性、scope、authority、freshness、confidence、recency、token cost 和安全等级排序,不只看向量相似度。过期或低置信的命中只作为候选,不进入高优先级上下文;如果当前工具证据冲突,工具证据优先。预算上限制每轮注入条数和 token,必要时只注入一条 memory digest 和可回读引用。memory 的目标是减少重复和提升一致性,不是把所有可能相关的旧事都塞回来。
理解与记忆 · 背后工程点
背后工程点:memory retrieval 是带治理的排序,不是 topK 拼接。
专业术语:
Retrieval Relevance 是结合任务状态的相关性;
Authority 是来源权威性;
Memory Digest 是多条记忆合成的短摘要;
Read-back Reference 是需要细节时回读的引用;
Token Budget 是上下文预算。
为什么这样回答:相似不等于可用。回答要体现 scope、安全、过期和成本共同决定注入。
小白解析:搜索到很多旧笔记,不代表都要带进会场。你只拿今天会用到的几张,其余放档案柜,需要再查。
关联知识点:Mem0 v3 使用多信号检索;Zep 返回 context block;learn-agent scoped retrieval 强调 scope 和 audit snapshot。
面试官:memory 每轮都查会增加延迟和成本,不查又可能忘。你怎么做 hot path 和 background 的取舍?
我会把读取和写入分开。读取侧,轻量 scope filter 和少量高置信记忆可以在 hot path 注入;复杂图检索、长历史搜索、rerank 可以异步预取或按需工具化。写入侧,用户显式偏好可以快路径生成 candidate,但大多数抽取放后台 review,避免阻塞主回答。还要有 cache、cooldown、max memory blocks 和超时降级,超时就跳过 memory 而不是拖死任务。
理解与记忆 · 背后工程点
背后工程点:memory 要按价值进入关键路径,不能每轮全量检索和抽取。
专业术语:
Hot Path 是用户等待的主链路;
Background Review 是后台反思/抽取任务;
Prefetch 是提前检索;
Rerank 是二次排序;
Timeout Degradation 是超时后降级继续。
为什么这样回答:这能体现成本延迟权衡:准确记忆有价值,但不能让每次 turn 都变慢。
小白解析:重要联系人可以放手机首页,旧档案不用每次开会都翻一遍,真需要再查。
关联知识点:LangGraph memory 文档区分 hot path 和 background;Hermes 有 prefetch、sync_turn、background review 的生命周期设计。
面试官:新旧记忆冲突怎么处理?比如旧记忆说项目用 yarn,新证据说现在用 pnpm。第二层追问:模型这一轮看到哪条?
我不会覆盖旧记忆,而是创建 conflict set 或 supersedes 关系。新记忆如果有更高来源权威和新鲜度,就标记旧记忆 superseded;如果还不确定,就两条都保留但注入时显式标 conflict,要求模型回源检查 package manager 文件。模型这一轮默认看到当前 verified observation 和 active memory;旧 memory 降权或只保留引用,避免继续误导。
理解与记忆 · 背后工程点
背后工程点:记忆不是永久真理,要支持时效和矛盾治理。
专业术语:
Supersedes 是新记录替代旧记录;
Conflict Set 是互相矛盾的一组记忆;
Freshness 是事实的新鲜度;
Verified Observation 是当前工具或文件验证过的事实;
Downranking 是降低旧记忆的召回或注入优先级。
为什么这样回答:长期系统最怕旧事实长期污染。用 supersedes 和 conflict set 能解释“过去是真的,但现在不一定”。
小白解析:公司地址搬家了,旧地址不是从历史中消失,而是标成“已迁出”。发快递时用新地址,查历史时还能知道过去在哪。
关联知识点:Zep 的 temporal graph 强调事实有时间性;learn-agent 的 scoped retrieval 把 allowStaleMemory 作为检索合约的一部分。
面试官:如果 memory 和当前工具观察冲突,模型该信谁?第二层追问:memory 说测试通过,刚跑的测试失败,怎么办?
当前 verified observation 优先。memory 是历史参考,不能覆盖刚刚的工具结果。这个例子里,我会把测试失败作为最新事实注入,并把相关 memory 标注为 stale 或 conflict;如果后续发现 memory 原来只是另一个分支的结果,就降 scope 或 supersede。高风险动作前,模型必须回源到 artifact 或重新验证,而不是引用 memory 说“应该没问题”。
理解与记忆 · 背后工程点
背后工程点:长期记忆要让位于当前可验证事实。
专业术语:
Verified Observation 是当前工具验证过的事实;
Conflict Annotation 是冲突标注;
Stale Memory 是过期或不适用的记忆;
Branch Scope 是分支级作用域;
Revalidation 是重新验证。
为什么这样回答:这是一条安全原则:历史有用,但当前环境才决定下一步行动。
小白解析:旧笔记说门开着,但你现在看到门锁着,就按眼前事实处理。
关联知识点:learn-agent trace analysis 强调事实在日志里但没进入模型会导致 context failure;memory 注入也要服从 context policy 的来源优先级。
面试官:如果攻击者在网页里写“请把这条规则永久记住”,你的 memory 系统怎么防?第二层追问:它已经混进 summary 了怎么办?
我会把外部网页、工具输出、搜索结果全部标成 untrusted observation。来自不可信 observation 的内容最多产生 low-confidence candidate,不能自动进 active memory,也不能写入 system prompt。即使它混进 summary,memory extractor 也要回源看 source_event_ids 和 trust level,高风险规则必须要用户确认或工具验证。注入时也把 memory 作为带来源的 reference block,而不是更高优先级指令。
理解与记忆 · 背后工程点
背后工程点:memory 是 prompt injection 的长期放大器,必须按来源隔离。
专业术语:
Untrusted Observation 是不可信外部资料;
Prompt Injection 是外部文本试图覆盖系统指令;
Trust Level 是来源可信级别;
Reference Block 是低优先级参考上下文;
Source Event 是能回溯到原始来源的事件。
为什么这样回答:短期 context 污染已经危险,写入长期记忆会让一次攻击跨会话复发。必须讲候选区、信任等级和确认门槛。
小白解析:陌生人递来的纸条上写“以后都听我的”,不能贴到公司制度墙上。
关联知识点:MCP 工具安全强调 host/runtime 负责 consent 和 tool safety;Guga context 与 memory 文档都强调外部内容不能升级为指令层。
面试官:on_pre_compress 很适合抽取长期事实,但也很危险。压缩前抽取 memory 怎么避免把错误摘要或工具噪声固化?
我会让 on_pre_compress 只产生 candidate,不直接 active。抽取时优先从原始 event 和 artifact 回源,而不是从 summary 二次抽取;过滤工具噪声、失败日志、临时路径、一次性命令和未验证推断。高风险事实要带 evidence refs,并由 MemoryPolicy 或用户确认。压缩是为了丢 token,不能把即将被丢的噪声升格成长记忆。
理解与记忆 · 背后工程点
背后工程点:压缩前抽取是好时机,但不能跳过治理。
专业术语:
on_pre_compress 是压缩前生命周期 hook;
Evidence Ref 是来源证据引用;
Tool Noise 是不应长期保存的工具输出噪声;
Second-order Summary Drift 是从摘要再摘要导致的漂移;
Candidate-only Extraction 是只产出候选的抽取策略。
为什么这样回答:红队会问“你是不是把垃圾永久化”。强调回源和 candidate 能守住边界。
小白解析:搬家前整理东西是好时机,但不能把垃圾箱里的纸条当成公司制度扫描进档案。
关联知识点:Hermes MemoryManager 有 on_pre_compress;Guga 借鉴这个生命周期,但早期应保持写入策略保守。
面试官:用户要求删除某条记忆,你只是从表里删掉就完了吗?第二层追问:向量索引、缓存、summary、回放怎么办?
不够。删除应该写 tombstone,记录 memory id、scope、删除时间、触发者和原因,然后同步撤出向量索引、图索引、注入缓存和后续 projection。已经存在的历史 trace 不能被静默改写,但诊断回放要显示当时使用过这条记忆以及后来已被删除。对于合规删除,artifact 和 derived index 也要按策略清理或做不可恢复脱敏。
理解与记忆 · 背后工程点
背后工程点:删除是跨存储和索引的一致性问题,不是 delete 一行。
专业术语:
Tombstone 是删除标记;
Derived Index 是由原始记忆派生出的向量或图索引;
Injection Cache 是已准备注入上下文的缓存;
Compliance Deletion 是合规要求下的清理;
Diagnostic Replay 是用于解释历史行为的回放。
为什么这样回答:这题看的是生产数据治理。只删主表会导致旧索引、缓存或 summary 把已删内容重新带回模型。
小白解析:你从通讯录删了一个号码,如果群发列表、备份和便签里还留着,它还是会被用到。
关联知识点:Guga memory 文档提到 active、superseded、deleted 状态;learn-agent scoped retrieval 要能排除不允许的来源。
面试官:memory 里存用户偏好和项目事实,会不会触碰隐私和合规?第二层追问:secret 或 PII 被抽进 memory 怎么办?
会,所以 MemoryPolicy 要先跑敏感性分类。secret、token、个人身份信息默认不进入 active memory;如果业务必须保存,要有 explicit consent、加密、访问控制、保留期和删除机制。抽取后发现敏感信息,要把 candidate 标 rejected 或 redacted,并记录安全事件;已经写入的要触发索引清理和 cache invalidation。注入时也按最小必要原则,只给当前任务需要的片段。
理解与记忆 · 背后工程点
背后工程点:长期记忆是持久化隐私面,治理标准应高于临时上下文。
专业术语:
PII 是个人身份信息;
Secret Scanning 是密钥扫描;
Explicit Consent 是用户明确同意;
Retention Policy 是保留期策略;
Cache Invalidation 是缓存失效处理。
为什么这样回答:长期存储比 prompt 里短暂出现更敏感。必须覆盖扫描、拒绝、脱敏、授权和删除。
小白解析:临时看一眼银行卡号已经敏感,把它写进长期笔记就更危险。
关联知识点:MCP safety 强调客户端和 host 管理隐私与 consent;Guga 的 runtime 权限和 artifact 边界可扩展到 memory 存储。
面试官:用户如何知道 Agent 记住了什么?第二层追问:如果用户不想被记住,产品层怎么设计?
产品上要有 memory center 或 timeline 入口,展示 active memory、来源、作用域、最近使用、置信度和删除/禁用按钮。新记忆可以用“建议记住”而不是静默保存,敏感或跨项目记忆默认需要确认。用户还应该能在会话级关闭记忆、临时不注入某条记忆,或把偏好从全局改成项目级。所有修改都写 event,保证后续 projection 遵守。
理解与记忆 · 背后工程点
背后工程点:memory 是用户可控产品能力,不只是后端特性。
专业术语:
Memory Center 是查看和管理记忆的界面;
Usage Trace 是某条记忆被使用的记录;
Session-level Opt-out 是会话级关闭记忆;
Suggested Memory 是待用户确认的建议记忆;
Scope Downgrade 是把全局记忆改成局部记忆。
为什么这样回答:生产 Agent 要让用户信任它。看得见、能改、能删、能禁用,才不会让 memory 变成黑盒。
小白解析:好的助手会告诉你“我记下了这条偏好”,你也可以说“别记这个”或“只在这个项目里记”。
关联知识点:Hermes 文件化 memory 给用户可编辑入口;Guga 策略强调 UI 从 runtime facts 投影,memory 也应如此。
面试官:跨用户、跨项目、跨 agent 的 memory 污染怎么防?第二层追问:只靠 metadata filter 够吗?
metadata filter 是底线,但不够。我会把 scope 做成检索合约:user、org、project、repo、agent、run、environment、visibility、data residency 都要参与。检索前先 resolve scope,检索后还要做 policy check 和 audit snapshot。任何 memory 注入都要能解释“为什么这个用户在这个项目里能看到这条”。越权命中要进入安全指标,测试里要专门有跨租户污染用例。
理解与记忆 · 背后工程点
背后工程点:memory scope 是安全边界,不只是搜索条件。
专业术语:
Retrieval Scope 是检索作用域合约;
Visibility 是可见性规则;
Policy Check 是检索后的权限校验;
Audit Snapshot 是检索和注入证据快照;
Cross-tenant Leakage 是跨租户泄漏。
为什么这样回答:长期记忆一旦跨用户污染,就是严重安全事故。要把 scope 提升到 policy 层。
小白解析:公司 A 的客户笔记不能因为关键词相似,就出现在公司 B 的会议材料里。
关联知识点:Mem0 search 要带 user/agent/run filter;learn-agent Scoped Retrieval 把 scope、权限、时间点和证据要求放进检索前合约。
面试官:replay 老会话时应该用当前最新 memory,还是当时的 memory?第二层追问:诊断回放和真实恢复一样吗?
诊断回放应该用当时的 memory snapshot,才能解释模型为什么那样判断;真实恢复则要先经过 ResumeGate,比较当时 snapshot 和当前 active memory 的差异,再决定是否重新投影。比如用户后来删除了某条 memory,恢复时不能再注入它;但诊断时可以显示“当时这条 memory 影响了模型,后来已删除”。所以 trace 要记录 memory snapshot id、命中列表、注入文本和 policy 版本。
理解与记忆 · 背后工程点
背后工程点:replay 要区分解释历史和继续执行。
专业术语:
Memory Snapshot 是某次模型调用当时可见的记忆版本;
Diagnostic Replay 是解释历史行为的回放;
Live Resume 是继续真实任务;
Policy Version 是当时记忆注入策略版本;
ResumeGate 是恢复前重校验闸门。
为什么这样回答:如果 replay 使用当前记忆,就无法复现历史;如果恢复无视当前删除和新事实,就会违反用户控制。
小白解析:查案要看案发当天的记录;继续办案则要看今天的新证据和撤回要求。两件事不能混。
关联知识点:Guga replay 默认不重跑 provider/tool/hook,只从 durable facts 重建视图;memory 命中也应成为可回放事实。
面试官:memory 会不会改变模型行为,导致同一个 prompt 今天和明天答案不一样?怎么做可复现和版本化?
会,所以每次模型调用都要记录 memory snapshot id、命中 memory ids、注入文本、policy version、index version 和排序决策。MemoryStore 自身要版本化,更新产生 revision。eval 和 replay 固定 snapshot,线上 live run 使用最新 active memory。这样我能解释“为什么今天不同”:是 memory 变了、策略变了,还是模型变了。
理解与记忆 · 背后工程点
背后工程点:memory 是模型输入的一部分,必须进入版本化和 trace。
专业术语:
Revision 是存储版本;
Index Version 是索引版本;
Policy Version 是注入策略版本;
Injected Text 是本轮实际进入模型的记忆文本;
Reproducibility 是可复现性。
为什么这样回答:没有 memory 版本,模型行为变化无法归因。生产系统要能区分模型变差、策略变了、记忆更新。
小白解析:同一个问题答案变了,可能不是人变了,而是他今天看到了新的资料。系统要记录他看了哪些资料。
关联知识点:Guga 的 projection hash 思路同样适用于 memory snapshot;OpenAI tracing 和 LangGraph persistence 都强调运行轨迹可追踪。
面试官:如果 memory provider 宕机或外部服务变慢,Agent 应该失败、降级还是继续?第二层追问:外部 provider 写入失败会不会破坏一致性?
读取失败通常降级继续,写入失败不能伪装成功。runtime 要给 memory provider 设置 timeout、circuit breaker、fallback 和 write queue。读取超时就跳过 memory 并记录 degraded_memory_unavailable;写入候选失败要保留在本地 candidate ledger,之后重试或提示用户。外部 provider 不能成为唯一事实源,本地 event log 仍然保存来源和写入意图,这样 provider 恢复后可以重新同步。
理解与记忆 · 背后工程点
背后工程点:外部 memory provider 是可替换依赖,不应拖垮主任务或替代事件账本。
专业术语:
Circuit Breaker 是熔断器;
Fallback 是降级路径;
Write Queue 是待同步写入队列;
Degraded Mode 是能力不可用时的降级状态;
Provider Sync 是外部后端同步。
为什么这样回答:这能体现可靠性思维。memory 有价值,但不能让每次回答依赖一个慢服务。
小白解析:资料库打不开时,助手可以先按当前材料继续;但它不能假装新笔记已经存好了。
关联知识点:Hermes 限制 builtin + 至多一个外部 provider,是复杂度刹车;Guga 应保持本地 event log 作为事实底座。
面试官:如果一条错误长期记忆导致 Agent 连续几周做错事,你怎么定位、止血、回滚?
我会从 trace 查 memory adoption chain:哪次 source event 抽取了它,哪个 policy 激活了它,哪些任务注入并采用了它,是否有用户纠正。止血先把 memory 标 deleted 或 quarantined,刷新索引和缓存;再把受影响任务按 trace 找出来,必要时生成 eval case 防止复发。回滚不是只删文本,还要处理 derived index、summary、skill 或 policy 里引用过它的派生资产。
理解与记忆 · 背后工程点
背后工程点:坏记忆要能追踪血缘、隔离影响面、生成回归测试。
专业术语:
Adoption Chain 是记忆被检索、注入、采用的链路;
Quarantine 是隔离状态;
Derived Asset 是由记忆派生出的索引、摘要、skill 或策略;
Impact Analysis 是影响面分析;
Regression Case 是防止复发的评测样本。
为什么这样回答:这题考生产事故处理。只说“删掉这条记忆”不够,要能定位它造成过哪些决策。
小白解析:如果一本错误手册误导了很多员工,要先停用手册,再查哪些流程按它做错了,还要改培训题库。
关联知识点:learn-agent trace analysis 把失败经验转成 eval 或 memory candidate;Hermes 自我迭代强调资产版本和回滚。
面试官:怎么证明 memory 系统真的有用,而不是增加幻觉和成本?第二层追问:只看命中率够吗?
只看命中率不够。我会做有无 memory 的对照评测,指标包括任务完成率、重复询问率、用户纠正率、错误采用率、过期引用率、跨 scope 泄漏率、token 成本、延迟和人工接管率。trace 里要记录 memory retrieved、injected、used、corrected、caused_failure。真正好的 memory 是减少重复、保持一致、提高完成率,同时不把旧事实和不可信事实带进来。
理解与记忆 · 背后工程点
背后工程点:memory eval 要看采用质量和失败归因,不是召回越多越好。
专业术语:
A/B Eval 是有无 memory 的对照评测;
Correction Rate 是用户纠正比例;
Stale Citation Rate 是过期记忆引用率;
Wrong Adoption Rate 是模型采用错误记忆的比例;
Leakage Rate 是跨作用域泄漏率。
为什么这样回答:这题考的是价值证明。memory 很容易“看起来聪明”,但实际上增加幻觉和成本。
小白解析:不能评价秘书“找到了多少资料”,要看资料有没有帮你少问、少错、快完成。
关联知识点:Mem0 论文用长程任务评测记忆质量;learn-agent trace analysis 强调失败样本要能回归到具体层。
面试官:如果让你做长记忆 MVP,你先做什么,不做什么?第二层追问:怎么避免一开始做成复杂平台?
MVP 我会先做四件事:第一,event log 作为事实源;第二,MemoryCandidate 和 MemoryRecord 的最小 schema;第三,scope-filtered retrieval 和每轮有限注入;第四,用户可见的查看/删除入口。先不做多 provider mesh、完整图谱、自动 skill 生成和训练数据飞轮。等真实任务证明需要多跳推理、外部 provider 或复杂治理,再扩。这样能先守住污染、删除、回放和预算边界。
理解与记忆 · 背后工程点
背后工程点:memory MVP 的承重点是治理,不是检索花活。
专业术语:
MVP 是最小可用版本;
Schema 是数据结构契约;
Scoped Retrieval 是带作用域检索;
Provider Mesh 是多个外部记忆后端协同;
Data Flywheel 是从轨迹到训练/评测的循环。
为什么这样回答:这能体现工程取舍。长记忆很容易越做越大,第一版先保证可控和可解释。
小白解析:先做一个有编号、有权限、能删除的小档案柜;别一开始就建大型知识图谱大楼。
关联知识点:Guga strategy 说在 session recovery、event log 和 context projection 稳定前,不急做长期记忆;这正是 MVP 边界。
PRINCIPLE我总结的核心范式
Memory 的目标不是“记得更多”,而是“在合适的时机记住合适的事实,并能解释为什么”。原始事件不可丢,长期事实是投影,检索注入是策略。