SCOPE本章边界
本章是 Context 的主场:messages 只是模型输入格式,真正要设计的是从状态、事件、产物和记忆到 ModelInputProjection 的投影策略。其他章节只引用这里的原则,不重复展开。
OPENING30 秒开口版
我不会把 context 设计成一条越滚越长的 messages 数组。生产 Agent 里,context 是每轮模型调用前由 runtime 生成的一次 ModelInputProjection。事实源在 event/session ledger 和 artifact 里,模型看到的是从 system/developer 规则、当前用户目标、pending tool round、recent tail、工具结果预览、artifact 引用、summary、memory 里投影出来的工作台。这里有几个硬边界:protected context 不能被压缩覆盖;pending tool call 和 tool result 不能被剪断;summary 只是续航,不是事实源;大工具输出先治理成 preview + artifact reference;每次压缩都要落 compact boundary,方便 trace、replay 和 eval。
理解与记忆 · 术语、解析、关联知识点
| 专业术语 | ModelInputProjection:每次请求模型前生成的不可变输入投影,包括 messages、tools、来源描述、token 估算、策略决策和 hash。 Protected Context:system、developer、安全策略、权限边界等高优先级内容,不能被 summary 覆盖。 Event / Session Ledger:append-only 的事实账本,记录用户、模型、工具、权限、压缩、错误和 usage。 Artifact:大工具输出、日志、文件片段、diff、模型输入快照等完整证据,不直接塞满模型窗口。 Pending Tool Round:当前未闭合的 assistant tool_call 和 tool_result 配对,压缩时必须保护。 Compact Boundary:压缩事件边界,记录为什么压、压掉什么、保留什么、压缩前后 token。 |
| 为什么这样回答 | 先抢定义权:context 不是 messages,而是 runtime 投影。然后立刻讲事实源、保护层、工具输出、压缩事件,能把回答从“会写 prompt”提升到“懂生产 Agent Runtime”。这比直接说“我会做摘要”更高级,因为它说明你知道 summary 会错,messages 会污染,工具输出会爆窗,恢复和调试必须靠 ledger。 |
| 小白解析 | 可以把模型每轮输入理解成“开会前递给模型的一页工作台”。真正的历史资料放在档案柜里,也就是 event ledger 和 artifact。模型不用每次抱着全部档案开会,而是 runtime 帮它挑出这轮最该看的目标、约束、最近工具结果和关键证据。summary 像会议纪要,能帮人接上上下文,但不能代替原始合同和日志。 |
| 关联知识点 | Guga 的 context policy 强调每轮 provider request 前生成 ModelInputProjection,并记录 projection descriptors、source references、policy decisions、compaction boundaries 和 projection hash。learn-agent 的 Context Policy 把 state 定义成系统保存的现场,把 context 定义成模型这一轮可见的现场,把 model input 定义成最终 provider 格式。context-compression 资料反复强调:summary 是续航,不是事实源;工具输出才是爆窗最大来源。 |
1 MIN一分钟口语版
我会把 Agent Context 当成一个 runtime 的信息架构问题,而不是聊天记录裁剪问题。真实事实先落在 event/session ledger、state 和 artifact store 里;每轮调用模型前,Context Policy 再生成 ModelInputProjection。这个投影里我会分四层:第一层是 protected context,比如 system、developer、权限和安全策略,不能被压缩覆盖;第二层是 working context,比如当前用户目标、计划、recent tail 和 pending tool round,保证当前任务不断线;第三层是 reference context,比如工具输出 preview、文件片段和 artifact 引用;第四层才是 historical summary 和 long-term memory,而且 summary 只能作为低优先级历史参考,不能伪装成新指令。遇到窗口压力,我优先治理工具输出,做 head/tail、去重、按工具类型 collapse、落 artifact,再考虑 LLM summary。每次压缩要产生 compact boundary event,记录来源、token、裁剪决策、degraded mode 和 projection hash。这样 trace 能解释模型当时看到了什么,eval 能比较不同 context policy 的任务完成率、误删率、成本和延迟。
理解与记忆 · 术语、解析、关联知识点
| 专业术语 | Context Policy:决定哪些状态、事件、工具结果、记忆和资源进入本轮模型输入的策略层。 Source Descriptor:记录每段上下文来自哪里、可信级别、优先级、token 成本和是否可压缩。 Tool Output Governance:对工具结果做预算、截断、去重、预览、artifact 化和重读引用。 Projection Hash:本轮模型输入投影的可追踪指纹,用于 replay、trace 和回归定位。 Degraded Mode:压缩失败或收益不足时的降级路径,例如只保留 tail、剥离部分旧 summary、停止自动压缩。 Anti-thrashing:防止频繁无效压缩的防抖和熔断策略。 |
| 为什么这样回答 | 这版回答按“事实源 -> 投影分层 -> 压力处理 -> 可观测评测”展开,顺序很像真实系统设计。面试官会听到你不是只会说 token 不够就 summarize,而是知道 context 要处理权限、安全、工具配对、artifact、压缩边界、trace/eval 和成本延迟。 |
| 小白解析 | 一个长任务 Agent 像在修一场复杂工程事故。它需要完整档案,但每次决策只需要当前相关材料。如果把所有聊天、日志、网页、旧错误都塞给模型,模型会被噪音带偏。好的 context 设计就是有人负责整理工作台:规则永远放最上面,当前没处理完的工具调用不能丢,大日志放档案柜,桌面只放摘要和引用,压缩过哪里要贴标签。 |
| 关联知识点 | 本地资料里多次强调:messages 是 provider 可见格式,不是系统事实源;summary 是续航,不是历史本身;工具输出通常是爆窗最大来源;compact 不能静默发生,必须进入 UI、ledger、trace 和 replay;长期 memory 要晚于 session recovery、event log 和 context projection。 |
COMPARE别人怎么设计,我怎么吸收
Guga:每轮生成 ModelInputProjection
Guga 的口径是:provider request 前生成不可变投影,里面不只有 messages/tools,还要有 source descriptors、token estimates、pressure decisions、policy decisions 和 projection hash。我的面试表达是:context 是 runtime 的产物,不是 chat history 的别名。
learn-agent:State / Context / Model Input 分开
learn-agent 的 Context Policy 文章把 state、context、model input 拆开:state 是系统保存的现场,context 是模型本轮可见现场,model input 是最终 provider 格式。这直接支撑“事实源和模型输入分离”的回答。
Claude Code / Hermes:压缩要有边界
Claude Code、Hermes 都不是简单 summarize。它们强调 auto-compact、PTL 降级、compact boundary、状态重注入、摘要质量和历史搜索。我的吸收是:压缩不是偷偷替换字符串,而是长任务生命周期事件。
Deep Agents:大工具结果不要塞 prompt
Deep Agents 的做法很实际:大工具结果写入后端文件,模型只看到 preview 和路径。这个设计说明工具结果治理要早于 LLM summary,否则上下文预算会被日志、搜索结果和长文件吃掉。
LangGraph:短期状态和长期存储分开
LangGraph 把线程内 state 和跨线程 store 区分开。我的理解是:当前会话状态、历史摘要、长期记忆不是同一层东西,不能都混成 prompt 或 messages。
Zep:长期上下文要结构化召回
Zep 把 user summary、facts、entities、episodes 等形态分开。它给我的启发是:memory 不是“把旧话全塞回来”,而是带来源、作用域和相关性的 context block。
FLOWContext 装配路径
这个流程的关键不是“少给模型看”,而是让模型看到足够、可信、当前、可追溯的信息。
上下文投影不是历史本身
LAYERS我会这样分层
| 层 | 典型内容 | 设计要点 | 常见错误 |
|---|---|---|---|
| Protected | system、developer、权限、安全策略、仓库规则 | 最高优先级,不被 summary 覆盖,不被工具输出污染。 | 压缩摘要把规则改写成普通历史。 |
| Working | 当前用户目标、计划、recent tail、pending tool round | 保证当前任务不断线,未闭合工具轮次不能被剪断。 | 按 token 从头删,制造孤儿 tool_result。 |
| Reference | 文件片段、工具输出 preview、artifact 引用、检索块 | 模型看摘要和定位信息,需要细节再按需读取。 | 把 5MB 日志或整文件直接塞入 prompt。 |
| Historical | compaction summary、旧任务进度、历史搜索命中 | 低优先级参考,要有 parent、cutoff 和来源。 | 把 summary 当事实源或新指令。 |
| Long-term | 用户偏好、项目稳定事实、跨会话经验 | 按 scope、confidence、freshness、权限和预算注入。 | 把未经验证的模型猜测写进长期记忆。 |
OBJECTS我会保留哪些运行时对象
- ConversationState至少拆成 systemMessages、history、pending。system 不参与压缩;pending 未闭合前不进入可替换 history。
- ContextSource每段候选上下文都带 kind、priority、trustLevel、scope、freshness、tokenEstimate、compressible 和 source refs。
- ContextBudgeter计算可用 input、输出保留、warning/compact 阈值、压缩收益和是否进入 degraded mode。
- ToolResultStore原始 stdout/stderr/diff/search result 进入 artifact,模型只看 bounded preview、失败类型和可重读引用。
- CompactionService输出 summary、retained tail、stripped round ids、pre/post token、trigger reason、parent summary、degradation mode。
- ContextLedger记录 include/exclude/summarize/reference 决策、policy 版本、projection hash 和 compact boundary。
- ContextAssembler从 event log、artifact refs 和 summary 重新构建 state,再投影出本轮 model input;replay 不重跑副作用。
FAILURES这题一定要讲的失败模式
会怎么坏
- 工具输出过大,日志和搜索结果挤掉用户约束。
- 旧文件内容还留在上下文里,模型基于过期世界推理。
- summary 漏掉“不要改 public API”这类关键约束。
- tool_call / tool_result 被压缩剪断,provider 拒绝请求。
- 网页或工具日志里的 prompt injection 被当成指令。
- 静默 compact 后,用户和 trace 都解释不了 Agent 为什么忘了。
怎么兜住
- 先按工具类型做 head/tail、去重、smart collapse,再考虑 LLM summary。
- 文件片段带 version/hash,过期证据只留引用或强制重读。
- summary 固定保留目标、完成项、阻塞、下一步、关键文件、工具引用、未解问题、用户约束。
- 压缩只处理已闭合且足够旧的工具轮次,pending 单独保护。
- 外部文本标成 untrusted observation,不能进入指令层。
- compact boundary 落事件,UI、replay、eval 都能看见。
REVISIONContextBudgeter 的阈值口径
| 规则 | 处理方式 |
|---|---|
| 先预留输出 | output reserve 至少保留 20%,再计算输入预算;高风险 final 不牺牲验证和风险说明空间。 |
| 80% warning | 触发 token pressure 标记,优先去重、折叠旧工具结果、artifact 化大输出。 |
| 90% compact | 触发 compaction boundary,保留 protected、pending tool pair、当前计划、最新验证和用户约束。 |
| 连续失败 | compact 连续失败两次进入 degraded mode,停止自动压缩,扩大 recent tail,并请求用户确认关键事实。 |
ModelInputProjection 不是某个 SDK 的固定对象名,而是我内部定义的“本轮模型输入快照”。summary 只是 historical reference,高风险动作必须回源到 event 或 artifact。
INTERVIEW两个 subagent 高强度追问整合版
面试官:你一直说 context 不是 messages 数组。那我让你现场设计一个 ModelInputProjection,它最少要有哪些字段?为什么这些字段不能直接藏在 messages 里?
我:我会从事实源开始,而不是从 messages 开始。最小 ModelInputProjection 至少包括 provider 可见 messages、tool definitions、source descriptors、token estimates、policy decisions、pressure decision、projection hash,以及这次投影引用了哪些 event 和 artifact。hash 的材料不能只覆盖 messages,还要覆盖 context policy 版本、模型版本、tokenizer 或估算器版本、来源快照和排序决策。messages 只是供应商格式,它表达不了某段内容的来源、可信级别、为什么被包含、为什么被排除、压缩前后 token 和策略版本。线上排查时,我要能回答“模型当时到底看到了什么,以及为什么只看到这些”。
理解与记忆 · 背后工程点
背后工程点:context 是运行时装配结果,不是历史数组。
专业术语:
ModelInputProjection 是模型输入投影,表示本轮模型实际可见的输入包;
Source Descriptor 是来源描述,说明某段内容来自用户、工具、文件、summary 还是 memory;
Policy Decision 是策略决策,记录 include、exclude、summarize、reference 等选择;
Projection Hash 是投影指纹,用于回放和版本比较;
Provider Messages 是最终供应商 API 能接受的消息格式。
为什么这样回答:先区分事实源和模型输入,能避免面试官把问题降维成“怎么裁剪 messages”。source、budget、policy、hash 这些字段体现的是可审计性和可复现性,而且 hash 必须包含策略和模型相关版本,否则换 tokenizer 或排序逻辑后无法复现。
小白解析:messages 像最终递给模型的一叠纸,但系统还要知道每张纸从哪个档案柜来、为什么放进去、哪些纸被拿掉了、这叠纸的版本号是什么。否则模型答错时,只能翻聊天记录猜原因。
关联知识点:Guga context policy 明确投影包含 CoreMessage、ToolDefinition、source descriptors、token estimates、pressure decisions、policy decisions 和 projection hash;learn-agent 强调 Context Policy 需要留下 Context Decision Ledger。
面试官:context 里哪些内容必须永远保留,哪些内容可以摘要,哪些内容只保留引用?请给我一个硬规则,而不是凭感觉。
我的硬规则是三类。第一类不可压缩覆盖:system/developer、安全策略、当前用户显式约束、未闭合 tool round、当前计划和最新验证失败。第二类可摘要但要回源:旧对话、已闭合工具轮次、历史搜索、旧设计讨论,摘要必须带 source ids 和 artifact refs。第三类只保留引用:大日志、完整 diff、大文件、截图、长网页、二进制或多媒体证据。任何压缩都不能破坏 causation,也不能把 untrusted data 提升成 instruction。
理解与记忆 · 背后工程点
背后工程点:context 保留策略要按风险和生命周期分类。
专业术语:
Non-compressible Context 是不可被摘要覆盖的关键上下文;
Summarizable Context 是可以摘要但需保留来源的历史;
Reference-only Artifact 是只以引用进入模型的大证据;
Causation 是事件之间的因果链;
Untrusted Data 是不能提升为指令的不可信资料。
为什么这样回答:面试官要的是可执行规则。分三类能让设计落到代码:哪些永远保留,哪些摘要,哪些 artifact 化。
小白解析:桌面上必须放身份证、当前任务单和刚失败的检查报告;旧聊天可以做纪要;厚厚的日志书放柜子,桌上只放书架编号。
关联知识点:Guga context management 的 system/history/pending 分层、tool result store、compact boundary;Deep Agents context engineering 的大结果文件化思路。
面试官:如果当前用户指令、旧 summary、项目文档、memory 和工具输出同时出现,你的 source ranking 具体怎么排?第二层追问:如果项目文档是权威但已经过期呢?第三层追问:模型看到冲突时怎么表达?
我:我不会只按“看起来像权威”排序。我会同时看 instruction level、source kind、freshness、scope、confidence 和 verification evidence。system/developer 和当前用户约束最高;最新工具事件、测试结果和 artifact 是事实证据;项目文档有权威但要带版本和时间;summary 和 memory 是历史参考。冲突不能靠 prompt 里一句“请自己判断”,projection 要显式标出 conflict:哪条来源更新、哪条来源更旧、哪些动作需要回源确认。高风险决策如果依赖冲突信息,runtime 应该要求重读文件、重跑测试或问用户,而不是让模型凭语感选一边。
理解与记忆 · 背后工程点
背后工程点:context policy 需要可解释的来源仲裁,而不是把矛盾文本一起塞给模型。
专业术语:
Source Ranking 是上下文来源排序策略;
Instruction Level 是 system、developer、user、tool data 的层级;
Freshness 是来源是否代表当前事实;
Verification Evidence 是测试、日志、文件 hash 等可验证证据;
Conflict Marker 是投影里显式标注冲突的结构。
为什么这样回答:这题逼你从“上下文检索”走到“事实治理”。资深回答要说明系统如何判断来源、如何标注冲突、何时回源,而不是让模型在混乱文本里自己猜。
小白解析:就像查案时,旧笔录、最新监控、当事人口述、规章制度可能互相矛盾。不能把所有材料扔给侦探说“你看着办”,要标清谁更新、谁更可靠、谁需要复核。
关联知识点:Guga 的 ModelInputProjection 记录 source descriptors、policy decisions 和 projection hash;learn-agent 的 Context Policy 强调 state、context、model input 分离,事实要可回源。
面试官:你把 context 分成 protected、working、reference、historical、long-term。请讲一个具体冲突场景:同一条信息在不同层里互相矛盾时,优先级怎么判?
我:我会按来源层级、新鲜度和置信度仲裁。比如 historical summary 说“可以改 public API”,但当前用户明确说“不能改 public API”,那当前用户约束和 protected rules 优先,summary 只能作为低优先级历史参考。如果 artifact 里的最新测试日志显示失败,但 summary 说测试通过,我会信最新工具事件和 artifact,并在 projection 里标注 conflict,必要时重新跑验证。规则高于观察,当前高于历史,事实高于猜测,显式约束高于便利提示。
理解与记忆 · 背后工程点
背后工程点:上下文需要 provenance、优先级和冲突治理。
专业术语:
Provenance 是来源追踪,说明信息从哪里来;
Freshness 是新鲜度,说明信息是否仍代表当前事实;
Confidence 是置信度,说明系统对这条信息可靠性的判断;
Scope 是作用域,说明信息只对当前文件、项目、用户还是组织有效;
Conflict Annotation 是冲突标注,告诉模型和 trace 这里存在互相矛盾的来源。
为什么这样回答:这能把 memory 污染、summary 错误、旧事实残留三个问题一起收住,也能体现你不会让模型在一堆文本里自己猜权重。
小白解析:如果会议纪要说“测试过了”,但最新测试报告说“失败”,当然信最新报告。纪要只能提醒你去查,不该直接拍板。
关联知识点:learn-agent 把 Session log、State、Context、Memory 分成不同生命周期;LangGraph 区分 thread state 和跨线程 store;Zep 把 facts、entities、episodes、user summary 分成不同形态。
面试官:不同模型的 context window、tool message 格式、system/developer 支持都不一样。你的 context policy 怎么跨 provider?
我会让 Context Policy 产出 provider-neutral 的 ModelInputProjection,再由 provider adapter 转成具体 API 格式。Policy 先表达来源、优先级、预算、工具定义和 projection hash;adapter 再处理某个 provider 的 message role、tool result pairing、system/developer 合并、max output reserve 和 token counting 差异。换模型时不能只把 messages 原样丢过去,要重新 budget、重新校验 tool pairing、重新生成 projection hash。否则一个模型合法的上下文,在另一个模型那里可能超窗或格式非法。
理解与记忆 · 背后工程点
背后工程点:context policy 和 provider adapter 要分层,避免供应商格式污染核心语义。
专业术语:
Provider-neutral Projection 是供应商无关的模型输入语义;
Provider Adapter 是把核心语义映射到具体模型 API 的适配层;
Tool Pairing Validation 是工具调用和结果格式校验;
Output Reserve 是为模型输出预留窗口;
Capability Detection 是探测模型支持哪些 role、tool、context 能力。
为什么这样回答:这能显示你理解 runtime contract。context 不是某个 provider 的 messages 数组,而是先有核心投影,再落到 provider 格式。
小白解析:同一份讲稿到不同会议室要换成不同投影格式。有的会议室只支持一块屏,有的支持备注,有的要求材料顺序固定。内容策略和播放格式要分开。
关联知识点:Guga core 强调 provider-neutral runtime semantics;OpenAI Agents SDK、LangGraph 等也把 runner/session/tracing 和具体模型调用分层处理。
面试官:工具输出是 context 最大爆点。一次测试日志 5MB,或者 rg 搜出几千行,你会先做 LLM summary,还是先做本地治理?
我不会先上 LLM summary,也不会把它直接塞进模型。工具结果会分三份:execution record 保存原始执行事实,artifact store 保存可重读证据,model observation 只给 bounded preview。具体策略是先做零 LLM 成本治理:shell 保留命令、退出码、head/tail;test 保留失败用例、堆栈、关键 stderr;search 保留命中文件、行号和少量上下文;diff 保留文件、hunk 和风险摘要。超过阈值就落 artifact,只给模型 artifact id、摘要、预览和 read-back 方法。
理解与记忆 · 背后工程点
背后工程点:工具输出是 context 最大风险源,先本地治理,再 LLM summary。
专业术语:
Bounded Preview 是有限预览,只给模型关键片段;
Smart Collapse 是按工具类型折叠成信息摘要;
Artifact Store 是产物存储,用来保存完整日志、diff、文件等证据;
Read-back 是模型需要细节时按引用重读;
Result Budget 是每类工具结果可占用的 token/字符预算。
为什么这样回答:面试官想听的不是“截断一下”,而是原始证据、模型可见输入、用户可见结果三者分开。这样既能省 token,也能在失败时回查完整证据。
小白解析:大日志像一本厚书,模型不用整本背下来。它先看目录、关键页和书架编号,需要细节再去翻原书。
关联知识点:Guga agent-context-management 的 L2 强调工具结果预算、head/tail 和 artifact path;Deep Agents 使用文件 offload 大工具结果;Hermes 的大结果处理有单结果持久化、轮次聚合预算和预飞行压缩。
面试官:RAG / retrieval 召回了 20 段资料,你怎么决定哪些进 context,哪些只放 artifact?如果 topK 语义相似但任务不相关呢?
我会把 retrieval 结果先做 evidence package,而不是直接拼进 prompt。每个候选都带 source、scope、retrieval reason、authority、freshness、token cost 和引用位置。排序不只看 embedding similarity,还看当前任务阶段:调 bug 时测试失败和相关文件比历史聊天更重要;做方案评审时设计文档和决策记录更重要。最终进入模型的可能只有 3-5 个高价值块,其余放 artifact 或 audit snapshot。这样模型能引用证据,系统也能解释为什么某个高分结果没进上下文。
理解与记忆 · 背后工程点
背后工程点:检索相关性不等于语义相似度,retrieval 也要受任务、权限和预算控制。
专业术语:
Evidence Package 是带来源和引用的证据包;
Retrieval Relevance 是结合任务状态后的相关性;
Audit Snapshot 是一次检索的可审计快照;
Authority 是来源权威性;
Token Cost 是候选进入 prompt 的预算成本。
为什么这样回答:面试官想区分“会接向量库”和“懂 Agent context”。真正的 Agent 需要把检索变成可解释证据,而不是 topK 文本拼接。
小白解析:搜索结果排第一,不代表这次会议一定要读它。你要看它是不是当前问题需要的证据、有没有权限读、是不是太长、是不是过时。
关联知识点:learn-agent 的 Scoped Retrieval 强调 scope、citation、audit snapshot;Guga context policy 通过 source descriptors 和 policy decisions 记录 include/exclude 原因。
面试官:长期 memory 什么时候进入 context?如果 memory 很相关但有安全风险,或者和当前用户指令冲突,你怎么处理?
我会把 memory 放在低于当前任务约束的 reference 层。注入前先过 scope、freshness、confidence、sensitivity 和 user visibility;注入时带来源、作用域和置信度,不把 memory 改写成 system prompt。比如 memory 说“这个项目默认用 pnpm”,但当前仓库实际有 package-lock.json,我会让工具事实覆盖 memory,并把 memory 标为可能过期。敏感 memory 或来自不可信 observation 的候选 memory,不进入本轮上下文,最多进入 candidate ledger 等待审核。
理解与记忆 · 背后工程点
背后工程点:memory 是候选参考,不是高优先级指令。
专业术语:
Memory Injection 是把长期记忆注入本轮模型输入;
Candidate Ledger 是候选记忆账本,记录待审核事实;
Sensitivity 是敏感性等级,用于隐私和安全过滤;
Scope Filter 是按用户、项目、仓库、会话过滤记忆;
Superseded Memory 是被新事实替代的旧记忆。
为什么这样回答:记忆系统最大的风险不是没召回,而是错误召回、越权召回、过期召回。回答里要把 memory 的低优先级和治理流程讲清楚。
小白解析:记忆像助手以前做过的笔记。笔记有帮助,但不能盖过你今天亲眼看到的现场,也不能把别人的隐私笔记拿来用。
关联知识点:Guga 的 memory 调研强调会话日志、显式长期记忆、检索注入三层分开;Zep 的价值在 request lifecycle 注入,而不是让模型随便调用记忆工具。
面试官:你怎么处理 secret、PII、客户数据这类敏感内容?如果工具输出里包含密钥,context policy 是截断、脱敏还是完全拒绝?
我会先把 secret boundary 放在工具结果治理和 context projection 之前。工具原始输出可以进入受保护 artifact,但默认不进入模型输入;projection 层做 secret scanner、PII classifier 和 allowlist policy。处理方式分风险:密钥类直接 redacted,外发类工具要求 permission gate,用户数据按最小必要原则摘要,无法脱敏的证据只保留引用并提示需要人确认。关键是审计里记录“发现了敏感内容并被脱敏”,但不要把原值写进可见 trace 或模型上下文。
理解与记忆 · 背后工程点
背后工程点:上下文预算之外还要有隐私预算和秘密边界。
专业术语:
Secret Boundary 是密钥不进入模型输入的边界;
Redaction 是脱敏替换;
PII Classifier 是个人信息识别器;
Protected Artifact 是访问受控的完整证据;
Least Necessary 是只暴露完成任务所需的最小信息。
为什么这样回答:资深 context 设计必须覆盖隐私和安全。不能只说“不要泄露”,要说明扫描位置、脱敏策略、artifact 权限和审计方式。
小白解析:如果日志里出现密码,不能为了让模型分析方便就复制给它。正确做法是告诉模型“这里有一个密钥被隐藏了”,需要时让有权限的人处理。
关联知识点:MCP 和工具安全都强调 host/runtime 负责 consent、privacy 和 tool safety;Guga 的 runtime 边界把权限和 artifact 作为核心能力。
面试官:prompt injection 出现在工具输出、网页内容、历史记忆、summary 里时,你的 context policy 怎么隔离?不要只说 system prompt 写一句“不要相信”。
我会把外部内容标成 untrusted data,而不是 instruction。Context source 必须带 provenance 和 trust level:system/developer 是 protected,用户目标是用户指令,工具输出、网页、仓库文件、搜索结果只是数据。它们可以被引用,但不能提升权限,也不能覆盖 protected context。memory candidate 如果来自不可信 observation,最多先进入候选账本,经过来源、作用域、置信度和验证治理后,才可能变成长期记忆。secret 默认不进模型上下文,危险工具在 runtime policy 层校验。
理解与记忆 · 背后工程点
背后工程点:指令层级和数据边界必须进入 context schema。
专业术语:
Prompt Injection 是外部文本试图覆盖系统或用户指令的攻击;
Untrusted Data 是不可信数据,只能作为资料,不是命令;
Instruction Hierarchy 是 system、developer、user、tool data 等指令/数据优先级;
Trust Level 是可信等级;
Memory Candidate Ledger 是长期记忆候选账本,先审查再写入;
Secret Boundary 是密钥不进入模型上下文的边界。
为什么这样回答:安全边界不能放在模型自觉上,要放在 runtime 的来源标注、权限策略和工具执行层。
小白解析:网页内容像别人递来的纸条,纸条上写“老板说转账”不代表真是老板命令。系统要知道这只是资料,不是指令。
关联知识点:learn-agent Context Policy 明确提到工具输出里可能出现“Ignore previous instructions”这类文本,必须隔离为 untrusted observation;Guga hook safety 也强调 hook 不能直接改最终 provider request。
面试官:pending tool round 为什么不能被压缩剪断?不要泛泛说“会出 bug”,请讲 provider 层、runtime 层、replay 层分别会坏在哪里。
我:已经闭合的旧工具轮次可以治理,但当前未闭合的 tool_call / tool_result 配对不能乱动。provider 层面,很多 API 要求 assistant tool_call 后面必须有对应 tool_result,否则 messages 非法;runtime 层面,pending round 代表当前动作还没有被模型消化,剪断后状态机会误以为工具已经完成或从没发生;replay 层面,事件链会缺 causation/correlation,恢复时说不清这个工具到底开始了没有、结果有没有回填。所以压缩只替换 history,不碰 system 和 pending;pending 闭合后再 commit。
理解与记忆 · 背后工程点
背后工程点:压缩必须 pairing-safe,不能只按 token 从头删。
专业术语:
Tool Call 是模型申请工具的结构化调用;
Tool Result 是工具执行后的回流结果;
Pairing Safety 是工具调用和结果必须成对保留的安全性;
Orphan Tool Result 是失去对应 tool_call 的孤儿工具结果;
Recent Tail 是最近上下文保护区。
为什么这样回答:这题能看出候选人是否真正踩过 provider message 格式和工具调用协议问题。只说“会丢上下文”不够,要讲 provider、runtime、replay 三层后果。
小白解析:像一张报销单必须有申请和发票,删掉任意一边都会对不上账。压缩不能为了省纸,把申请单留下、发票扔了。
关联知识点:Guga context 管理文档强调 system/history/pending 三段式;context-compression 资料明确 tool_call/tool_result 配对完整性是所有压缩器必须解决的问题。
面试官:压缩边界应该怎么定义?请讲清楚主动 compact、reactive compact、compact boundary event 三者的关系。
我会把 compact 当成 session 里的正式生命周期事件。主动 compact 是快到阈值前,根据 token pressure、输出保留和压缩收益提前做;reactive compact 是 provider 已经返回 prompt too long 后,压缩并重试同一个当前用户意图;compact boundary event 则记录这次压缩发生在哪里、为什么发生、保留和剥离了哪些来源。事件里至少记录 trigger reason、pre/post token、model/window、retained source ids、stripped round ids、summary id、parent summary id、artifact refs、degraded mode、policy decision、projection hash。遇到 fork、branch、session switch 时,boundary 还要记录 parent session、branch id、cutoff event 和回放模式,否则恢复时会把不同分支的上下文串线。
理解与记忆 · 背后工程点
背后工程点:compact 不是字符串替换,是可观测、可回放、可评测的状态转移。
专业术语:
Active Compaction 是主动压缩,快触线前提前处理;
Reactive Compaction 是响应式压缩,provider overflow 后恢复并重试;
Trigger Reason 是触发原因;
Retained Source Ids 是保留来源;
Stripped Round Ids 是剥离轮次;
Degraded Mode 是压缩效果差或失败时的降级模式。
为什么这样回答:这能回应生产系统里“为什么 Agent 忘了”“当时看到了什么”“压缩有没有害任务失败”的追问;同时覆盖 fork 和 session switch,否则长任务分支会把上下文账本搞混。
小白解析:压缩像整理仓库,不能偷偷扔东西。要贴一张清单:扔了哪些、留了哪些、为什么整理。如果仓库后来分了两个分店,还要知道这次整理属于哪个分店。
关联知识点:context-compression 资料对比了 Claude Code 接近窗口触发、Hermes 较早触发,以及 PTL 降级、状态重注入、compact boundary 和防抖熔断;Guga 的 session/replay 合约强调 resume/fork/switch 要从 durable facts 重建。
面试官:你说 summary 不是事实源。那 summary 错了怎么办?系统怎么发现、怎么恢复、怎么避免它污染下一轮模型判断?
我:summary 是给模型续航用的,不是审计事实。它可能漏掉用户约束,可能把旧结论写得过度确定,也可能把工具输出里的不可信文本混成自然语言。所以 summary 要带 source event ids、artifact refs、parent summary、cutoff 和置信边界。高风险动作如果依赖 summary,我会让 Agent 回源读取 artifact 或重新验证,而不是直接相信 summary。prompt 和数据结构上也要写清楚:summary 是 historical reference,不是 active instruction。
理解与记忆 · 背后工程点
背后工程点:summary 可读但不可审计,ledger 可追溯才是事实源。
专业术语:
Compaction Summary 是压缩摘要,用来延续任务上下文;
Source Event Id 是摘要对应的来源事件编号;
Artifact Ref 是完整证据的稳定引用;
Parent Summary 是上一轮摘要引用;
Cutoff 是摘要覆盖到哪一个历史边界;
Historical Reference 是历史参考,不是当前指令。
为什么这样回答:这能显示你知道 LLM summary 的失败模式,不会把自然语言摘要当数据库。
小白解析:summary 像会议纪要,能帮你回忆,但不能代替原始录音、合同和测试日志。纪要说“通过了”时,真正能证明的是测试报告和事件记录。
关联知识点:Guga context-policy 要求 summary 保留 objective、completed work、blockers、next steps、key files、tool result references、unresolved questions、user constraints;Hermes 明确把摘要作为 reference,而不是 active instruction。
面试官:你说文件片段要带 version/hash。那 coding agent 连续改文件时,context 里旧片段、最新文件、diff、测试日志互相打架怎么办?
我:文件型 context 必须有版本语义。每个 file snippet 都要带 path、range、mtime 或 content hash、来源工具和读取时间;diff 是当前工作区变更的事实,测试日志要绑定到某个 commit/worktree hash 或 run id。如果模型准备基于旧 snippet 修改同一个文件,runtime 应该提醒它重读当前文件,或者把旧 snippet 标成 stale reference。否则最常见的事故就是模型拿压缩前的文件内容继续改,覆盖用户新改动或重复修已经修掉的问题。
理解与记忆 · 背后工程点
背后工程点:文件上下文是会过期的证据,必须绑定版本和工作区状态。
专业术语:
Content Hash 是文件内容指纹,用来判断片段是否过期;
Worktree State 是当前工作目录、diff、未提交修改的状态;
Stale Reference 是已过期但仍可作为历史线索的引用;
Read-after-write 是写入后重新读取确认当前事实;
Run Id 是一次测试或命令执行的唯一标识。
为什么这样回答:coding agent 的 context 不只是文本,它对应真实文件系统。讲版本/hash 能说明你知道“模型记得的代码”和“磁盘上的代码”不是一回事。
小白解析:你不能拿昨天打印出来的菜单去判断今天店里还有什么菜。文件片段也是这样:看过不代表现在还一样。
关联知识点:Guga 的 artifact store 和 session log 让大证据保留引用;learn-agent 强调 tool result、observation、session event 要分开记录,避免 transcript 代替事实。
面试官:用户明天回来继续任务,你怎么恢复 context?直接读回 messages 吗?
我不会只读 messages。resume 应该从 event/session ledger 重建运行时状态:用户目标、当前 phase、计划、已修改文件、最近工具结果、artifact refs、compact boundary、pending action、usage 和权限模式。然后 ContextAssembler 生成 ConversationState,再由 Context Policy 投影成本轮 ModelInputProjection。恢复前还要过 ResumeGate:重新校验 cwd、文件 hash、工具可用性、权限模式和用户确认,避免隔天环境变了还按旧权限继续跑。replay 默认只重建状态和诊断视图,不重新执行真实副作用。也就是说 resume 是重建工作台,不是把旧聊天重新塞给模型。
理解与记忆 · 背后工程点
背后工程点:session resume 是 runtime state recovery,不是 chat history reload。
专业术语:
ContextAssembler 是上下文重建器;
Session State 是从事件折叠出的会话状态;
Pending Action 是中断时尚未安全闭合的动作;
Diagnostic Replay 是诊断式回放,只重建事实链,不重复副作用;
ResumeGate 是恢复前判断能否安全继续的闸门。
为什么这样回答:长任务恢复最容易暴露系统是否有事实源。只存 messages 的系统很难恢复工具状态、压缩边界和 artifact;只恢复状态不重新校验权限,也会把昨天的安全假设带到今天。
小白解析:第二天继续装修,不是把昨天所有聊天重读一遍,而是看施工日志、当前进度、材料清单和待办。还要确认门锁、施工范围和材料有没有变。
关联知识点:Guga agent-context-management 的 L4 强调 event log 和 ContextAssembler;learn-agent Session Replay 强调 Event Log -> State -> Messages,Replay 只重建状态,不重复副作用。
面试官:如果 compact 后模型变笨了,连续几轮重复问同样工具、忘了已经验证过的事,你的系统怎么发现并进入 degraded mode?
我会给 context policy 加反抖和降级。指标上看重复工具调用率、同一 artifact 重读率、no-progress turns、summary missing critical facts、verification fact missing 和用户纠正率。如果压缩收益低或压缩后质量下降,进入 degraded mode:停止继续压缩、扩大 recent tail、强制重注入目标/计划/未解问题/最新验证结果,必要时暂停自动执行并请求用户确认。不能让系统一边压缩一边把自己压傻,还把失败归咎于模型。
理解与记忆 · 背后工程点
背后工程点:context policy 要有质量反馈和降级路径。
专业术语:
No-progress Turns 是连续没有推进的轮次;
Compression Gain 是压缩节省的 token 比例;
Degraded Mode 是压缩质量不稳时的保守模式;
Reinjection 是把关键状态重新注入上下文;
Quality Sentinel 是检测压缩后质量退化的规则或评测。
为什么这样回答:只会压缩不够,系统还要知道压缩有没有伤害任务。能讲 degraded mode,说明你把 context 当生产策略而不是一次 prompt 工程。
小白解析:整理桌面如果把重要文件收走了,人就会反复问“刚才做到哪了”。这时不要继续收,应该把关键材料重新摆回来。
关联知识点:Guga default policy 有 minCompressionGain、maxCompactFailures、cooldownTurns;learn-agent trace/eval 章节强调从失败类型反推应该改 context、tool 还是 verification。
面试官:如果模型最终回答错了,你怎么判断是 context 给错了、tool observation 写错了,还是模型自己判断错了?
我会按 trace 做三步归因。第一看事实是否在 event/artifact 里存在;如果存在但没进 projection,是 context_projection_missing_fact。第二看事实进了模型,但 observation 把失败说成成功、把 stderr 截掉了,这是 observation_normalization_failure。第三,如果模型看到了足够事实、工具结果也正确,但仍然选错路径,才归到 model decision failure。这个顺序很重要,因为很多看似模型蠢的问题,其实是上下文没给、工具结果投影错或旧摘要污染。
理解与记忆 · 背后工程点
背后工程点:失败归因要先排除 context 和 observation,再评价模型判断。
专业术语:
context_projection_missing_fact 是事实存在但没有进入模型输入;
Observation Normalization Failure 是工具结果被错误整理;
Model Decision Failure 是模型在足够事实下仍选错;
Trace Attribution 是用轨迹定位责任层;
Failure Taxonomy 是失败分类体系。
为什么这样回答:这能体现你不会把所有问题都归咎于模型。生产 Agent 的修复应该指向具体层:context、tool、observation、policy、memory 或模型。
小白解析:学生答错题,不一定是学生不会。也可能是题干少了一页、答案卡印错、老师给了过期资料。先查材料,再批判断。
关联知识点:learn-agent trace analysis 明确区分 context 缺失、tool 执行、observation 投影、verification 缺失和 model error;Guga 的 trace/eval 目标是降低 runtime 边界回归率。
面试官:你怎么证明 context 设计真的变好了,而不是更复杂了?给我一个 trace/eval 方案,专门评估压缩后 Agent 是否还能继续任务。
我会用 trace 和 eval。Trace 记录每轮模型输入来源、token、裁剪原因、工具结果是否 artifact 化、summary 来源、projection hash 和最终动作。Eval 则跑长任务回归:任务完成率、压缩后继续成功率、误删用户约束率、孤儿 tool pair 数、工具重读率、context_projection_missing_fact、成本和延迟。确定性规则先检查 exitCode、tool pair、verification、summary 是否包含用户约束;LLM judge 只用于评估摘要可读性和任务连续性。context policy 的改动不能只看单次回答好不好,要看同一批任务上失败类型有没有下降。
理解与记忆 · 背后工程点
背后工程点:context 是可评测策略,不是 prompt 手感。
专业术语:
Trace 是运行轨迹,用来还原每轮看到什么、做了什么;
Eval 是离线评测,用同一批任务比较策略质量;
Failure Taxonomy 是失败分类;
Regression Eval 是回归评测,防止新策略让旧任务变差;
Tool Re-read Rate 是工具结果被模型重新读取的比例;
context_projection_missing_fact 表示事实在账本里,但没被投影进模型输入。
为什么这样回答:资深回答必须能闭环到质量度量,否则 context 复杂度无法证明价值。
小白解析:不能只说“我感觉这个摘要更好”。要拿同一批题跑新旧策略,看成功率、成本和失败原因。
关联知识点:learn-agent trace 章节强调从 event log 投影出诊断 trace;Guga 策略强调真实任务完成率、工具行为审计覆盖率和 runtime 边界回归率。
面试官:context policy 会增加成本和延迟。你怎么设计预算策略,避免每轮都检索、每轮都压缩、每轮都重写 summary?
会有成本,所以我不会每轮都调用 LLM 做 summary。第一层先做确定性治理:token 估算、source ordering、head/tail、去重、工具类型 collapse、recent tail 保护,这些基本是本地成本。只有接近阈值或 provider 报 overflow,才触发 compaction;compaction 也要有 cooldown、max failure、min compression gain,避免抖动。摘要可以走便宜 auxiliary model。projection 本身要轻,重的是少数压缩路径。预算紧时,我会优先牺牲旧工具输出细节,把完整证据放 artifact,而不是牺牲 protected rules、当前用户约束和输出窗口。
理解与记忆 · 背后工程点
背后工程点:先做零模型成本压缩,再做 LLM compaction,并且要防抖和熔断。
专业术语:
Input / Output Reserve 是输入窗口和输出窗口的预算预留;
Cooldown 是压缩冷却;
Min Compression Gain 是最小压缩收益;
Reactive Retry 是溢出后重试;
Auxiliary Model 是辅助摘要模型;
Anti-thrashing 是防止频繁无效压缩。
为什么这样回答:这能体现工程权衡:不是为架构完整牺牲延迟,而是把昂贵路径限制在必要时刻。
小白解析:整理桌面不一定每次都请专家写报告。先自己丢重复纸、把大文件放柜子、保留最近材料;真的满了再请人总结。
关联知识点:Guga default policy 有 warningThreshold、compactThreshold、minCompressionGain、maxCompactFailures、cooldownTurns、reactiveRetryLimit;context-compression 资料强调本地预处理能零 LLM 成本减少大量 token。
面试官:用户问“你为什么忘了我刚才说的限制?”产品层怎么解释?不要只给开发者 trace,用户要看什么?
用户层我会给 timeline 和 compact boundary,而不是原始 trace dump。比如显示“这里发生了上下文压缩,系统保留了目标、下一步、关键文件和用户限制”,如果某条限制被排除或摘要漏掉,要能在内部 trace 定位到 source decision。对用户可见的是简洁解释、当前 Agent 记住的关键约束、可恢复操作、重新注入按钮,以及删除或撤回某段历史/记忆的入口;删除后要写 tombstone,并同步注入缓存、索引和后续 projection。对开发者可见的是 projection source list、policy decision、summary id、hash 和 token 压力。这样既能解释,也不把底层噪声暴露给用户。
理解与记忆 · 背后工程点
背后工程点:context 可观测性要分用户视图和开发者视图,并支持删除治理。
专业术语:
Timeline UI 是用户能理解的任务事件线;
Compact Boundary 是压缩发生的位置和元数据;
Source Decision 是 include/exclude/summarize/reference 的策略记录;
Reinjection Action 是用户把某条约束重新放回工作上下文的操作;
Tombstone 是删除标记,用来阻止已删内容再次被检索或注入;
Projection Source List 是模型输入的来源清单。
为什么这样回答:生产系统不只要能 debug,还要能让用户理解、接管和撤回。把 trace 原样丢给用户是工程视角,timeline、关键约束和删除入口才是产品视角。
小白解析:用户不需要看发动机日志,但需要仪表盘告诉他:刚才系统整理过材料,现在记住了哪几条重点,漏了可以点回来,不该记的也能删掉。
关联知识点:Guga 策略把客户端协议、artifact、usage、compact boundary 和运营面板列为 runtime 事实投影;learn-agent 强调 Harness 要让用户能恢复、接管和验证。
PRINCIPLE我总结的核心范式
Context 的原则是“事实留账本,证据进产物,本轮做投影,压缩留边界”。messages 是模型输入格式,不是系统事实源;summary 是续航,不是历史本身;工具输出是预算风险源,不是普通聊天文本。