3.11 设计洞察
- Memoize 保证幂等性:
getSystemContext和getUserContext都是 memoized 的,每会话只计算一次。setSystemPromptInjection()变更时会手动清除两个函数的缓存 - 压缩流水线的渐进性:从零成本裁剪到全量摘要,按需逐级升级。大部分对话永远不会触发 Autocompact
- 投影式折叠的可逆性:Context Collapse 不修改原始消息,可以安全回退——这是它优于 Autocompact 的地方
- 缓存感知的上下文组装:上下文的注入顺序(系统提示词在前、用户上下文在消息前)考虑了提示词缓存的命中率
- Token 估算的锚点策略:用 server 报告的精确 usage 作为锚点,只估算增量,在精度和延迟之间取得平衡
- system-reminder 作为统一注入通道:通过 XML 标签包装,在消息流的任意位置注入系统信息,而不混淆角色边界
- 会话级锁存的务实取舍:TTL 资格和 beta header 一旦确定就锁定到会话结束,牺牲灵活性换取缓存稳定性——50-100K token 缓存失效的代价远高于中途无法切换某个功能
动手实践:在 claude-code-from-scratch 中,
src/prompt.ts和src/system-prompt.md展示了最小实现的上下文构建方式。对比本章的多层上下文组装,思考:一个最小 Agent 需要哪些上下文就够用了?参见教程 第 3 章:System Prompt 工程。