跳转至

渐进式披露:Claude-Mem 的上下文预热哲学

核心原则

首先展示已存在的内容及其检索成本。让智能体根据相关性和需求自行决定获取什么。


什么是渐进式披露?

渐进式披露是一种信息架构模式,它逐步揭示复杂性,而不是一次性全部展开。在 AI 智能体的语境下,它意味着:

  1. 第 1 层(索引):展示轻量级元数据(标题、日期、类型、Token 数量)
  2. 第 2 层(详情):仅在需要时获取完整内容
  3. 第 3 层(深入研究):必要时阅读原始源文件

这与人类的工作方式相似:我们在读文章前先浏览标题,在深入章节前先查看目录,在打开文件前先查看文件名。


问题:上下文污染

传统的 RAG(Retrieval-Augmented Generation,检索增强生成)系统会预先获取所有内容:

❌ Traditional Approach:
┌─────────────────────────────────────┐
│ Session Start                        │
│                                      │
│ [15,000 tokens of past sessions]    │
│ [8,000 tokens of observations]      │
│ [12,000 tokens of file summaries]   │
│                                      │
│ Total: 35,000 tokens                │
│ Relevant: ~2,000 tokens (6%)        │
└─────────────────────────────────────┘

问题:

  • 在无关上下文上浪费了 94% 的注意力预算
  • 用户提示被淹没在大量的历史记录之下
  • 智能体必须先处理所有内容,然后才能理解任务
  • 在阅读之前,无从知晓哪些内容真正有用

Claude-Mem 的解决方案:渐进式披露

✅ Progressive Disclosure Approach:
┌─────────────────────────────────────┐
│ Session Start                        │
│                                      │
│ Index of 50 observations: ~800 tokens│
│ ↓                                    │
│ Agent sees: "🔴 Hook timeout issue"  │
│ Agent decides: "Relevant!"           │
│ ↓                                    │
│ Fetch observation #2543: ~120 tokens│
│                                      │
│ Total: 920 tokens                   │
│ Relevant: 920 tokens (100%)         │
└─────────────────────────────────────┘

优势:

  • 智能体自行掌控其上下文消耗
  • 与当前任务直接相关
  • 需要时可以获取更多
  • 不相关时可以完全跳过
  • 每次检索决策都有清晰的成本/收益对比

它在 Claude-Mem 中如何运作

索引格式

每个 SessionStart 钩子都会提供一个紧凑的索引:

### Oct 26, 2025

**General**
| ID | Time | T | Title | Tokens |
|----|------|---|-------|--------|
| #2586 | 12:58 AM | 🔵 | Context hook file exists but is empty | ~51 |
| #2587 | ″ | 🔵 | Context hook script file is empty | ~46 |
| #2589 | ″ | 🟡 | Investigated hook debug output docs | ~105 |

**src/hooks/context-hook.ts**
| ID | Time | T | Title | Tokens |
|----|------|---|-------|--------|
| #2591 | 1:15 AM | ⚖️ | Stderr messaging abandoned | ~155 |
| #2592 | 1:16 AM | ⚖️ | Web UI strategy redesigned | ~193 |

智能体看到的内容:

  • 已存在什么:观察记录的标题提供语义含义
  • 何时发生:时间戳提供时间上下文
  • 什么类型:图标表示观察记录类别
  • 检索成本:Token 数量用于做出明智决策
  • 从哪里获取:底部引用 MCP 搜索工具

图例系统

🎯 session-request  - User's original goal
🔴 gotcha          - Critical edge case or pitfall
🟡 problem-solution - Bug fix or workaround
🔵 how-it-works    - Technical explanation
🟢 what-changed    - Code/architecture change
🟣 discovery       - Learning or insight
🟠 why-it-exists   - Design rationale
🟤 decision        - Architecture decision
⚖️ trade-off       - Deliberate compromise

用途:

  • 视觉扫描(人类和 AI 同样受益)
  • 语义分类
  • 优先级信号(🔴 gotcha 类观察记录更关键)
  • 跨会话的模式识别

渐进式披露说明

索引中包含使用指南:

💡 **Progressive Disclosure:** This index shows WHAT exists and retrieval COST.
- Use MCP search tools to fetch full observation details on-demand
- Prefer searching observations over re-reading code for past decisions
- Critical types (🔴 gotcha, 🟤 decision, ⚖️ trade-off) often worth fetching immediately

它的作用:

  • 让智能体学会这种模式
  • 建议何时获取(关键类型)
  • 建议优先搜索而非重新阅读代码(更高效)
  • 让系统具备自我文档化能力

核心理念:上下文即货币

心智模型:Token 预算如金钱

将上下文窗口想象成一个银行账户:

方法 比喻 结果
全部倾倒 把整张工资支票花在也许某天会用到的杂货上 浪费、杂乱,无法负担真正需要的东西
不获取任何内容 拒绝花任何钱 挨饿,无法完成任务
渐进式披露 检查储藏室、列出购物清单、只买需要的东西 高效,为意外需求留有空间

注意力预算

LLM(大语言模型)的注意力是有限的:

  • 每个 Token 都会关注其他每一个 Token(n² 关系)
  • 100,000 Token 的窗口 ≠ 100,000 Token 的有效注意力
  • 随着窗口被填满,上下文会出现“退化”
  • 后面的 Token 获得的关注度低于前面的 Token

Claude-Mem 的做法:

  • 从约 1,000 Token 的索引开始
  • 智能体有 99,000 Token 可用于任务
  • 智能体在需要时获取约 200 Token
  • 最终预算:约 98,000 Token 用于实际工作

为自主性而设计

“随着模型的不断改进,让它们智能地行动。”

渐进式披露将智能体视为智能信息觅食者,而非预先选定上下文的被动接收者。

传统 RAG:

System → [Decides relevance] → Agent
        ↑
   Hope this helps!

渐进式披露:

System → [Shows index] → Agent → [Decides relevance] → [Fetches details]
                          ↑
                   You know best!

Agent 知道: - 当前任务上下文 - 哪些信息会有帮助 - 该花费多少预算 - 何时停止搜索

我们不知道。


实现原则

1. 让成本可见

索引中的每一项都显示 token 数量:

| #2591 | 1:15 AM | ⚖️ | Stderr messaging abandoned | ~155 |
                                                        ^^^^
                                                    Retrieval cost

原因: - Agent 可以做出明智的 ROI 决策 - 小型观察记录(约 50 token)获取起来很“便宜” - 大型观察记录(约 500 token)需要更有力的理由 - 符合人类对付出成本的思考方式

2. 使用语义压缩

标题将完整观察记录压缩为约 10 个词:

不好的标题:

Observation about a thing

好的标题:

🔴 Hook timeout issue: 60s default too short for npm install

好的标题具备什么特征: - 具体:明确指出具体问题 - 可操作:清楚知道该怎么做 - 自包含:无需阅读观察记录本身 - 可搜索:包含关键术语(hook、timeout、npm) - 已分类:用图标指示类型

3. 按上下文分组

观察记录按以下方式分组: - 日期:时间上下文 - 文件路径:空间上下文(针对特定文件的工作) - 项目:逻辑上下文

**src/hooks/context-hook.ts**
| ID | Time | T | Title | Tokens |
|----|------|---|-------|--------|
| #2591 | 1:15 AM | ⚖️ | Stderr messaging abandoned | ~155 |
| #2594 | 1:17 AM | 🟠 | Removed stderr section from docs | ~93 |

好处:如果 Agent 正在处理 src/hooks/context-hook.ts,相关的观察记录已经聚合在一起。

4. 提供检索工具

没有检索机制,索引就是无用的:

*Use claude-mem MCP search to access records with the given ID*

可用的 MCP 工具: - search - 搜索记忆索引(第 1 层:获取 ID) - timeline - 获取时间上下文(第 2 层:查看叙事脉络) - get_observations - 获取完整详情(第 3 层:深入探究) - get_tool_uses - 获取原始的 tool_input / tool_response(第 4 层:原始证据)

分层工作流确保了渐进式披露:索引 → 上下文 → 详情 → 原始证据。


实际示例

场景:Agent 被要求修复 hooks 中的 bug

没有渐进式披露时:

SessionStart injects 25,000 tokens of past context
Agent reads everything
Agent finds 1 relevant observation (buried in middle)
Total tokens consumed: 25,000
Relevant tokens: ~200
Efficiency: 0.8%

使用渐进式披露时:

SessionStart shows index: ~800 tokens
Agent sees title: "🔴 Hook timeout issue: 60s too short"
Agent thinks: "This looks relevant to my bug!"
Agent fetches observation #2543: ~155 tokens
Total tokens consumed: 955
Relevant tokens: 955
Efficiency: 100%

索引条目

| #2543 | 2:14 PM | 🔴 | Hook timeout: 60s too short for npm install | ~155 |

Agent 不进行获取时能了解到什么: - 存在一个与 hook 超时相关的已知陷阱(🔴) - 它与 npm install 耗时过长有关 - 完整详情约 155 token(成本低) - 发生在 2:14 PM(较近)

决策树:

Is my task related to hooks? → YES
Is my task related to timeouts? → YES
Is my task related to npm? → YES
155 tokens is cheap → FETCH IT


分层工作流

Claude-Mem 通过分层工作流模式实现渐进式披露。第 1-3 层是日常路径;第 4 层用于摘要不足以作为证据的罕见情况。

第 1 层:搜索(索引)

首先进行搜索,获取带有 ID 的紧凑索引:

search({
  query: "hook timeout",
  limit: 10
})

返回:

Found 3 observations matching "hook timeout":

| ID | Date | Type | Title |
|----|------|------|-------|
| #2543 | Oct 26 | gotcha | Hook timeout: 60s too short |
| #2891 | Oct 25 | how-it-works | Hook timeout configuration |
| #2102 | Oct 20 | problem-solution | Fixed timeout in CI |

成本:每个结果约 50-100 token 价值:Agent 可以快速浏览并判断哪些观察记录是相关的

第 2 层:时间线(上下文)

获取感兴趣观察记录周围的时间上下文:

timeline({
  anchor: 2543,  // Observation ID from search
  depth_before: 3,
  depth_after: 3
})

返回:按时间顺序的视图,展示观察记录 #2543 之前/期间/之后发生的事情

成本:随深度变化 价值:理解叙事脉络与上下文

第 3 层:获取观察记录(详情)

仅获取相关观察记录的完整详情:

get_observations({
  ids: [2543, 2102]  // Selected after reviewing the index and timeline
})

返回:

#2543 🔴 Hook timeout: 60s too short for npm install
─────────────────────────────────────────────────
Date: Oct 26, 2025 2:14 PM
Type: gotcha
Project: claude-mem

Narrative:
Discovered that the default 60-second hook timeout is insufficient
for npm install operations, especially with large dependency trees
or slow network conditions. This causes SessionStart hook to fail
silently, preventing context injection.

Facts:
- Default timeout: 60 seconds
- npm install with cold cache: ~90 seconds
- Configured timeout: 120 seconds in plugin/hooks/hooks.json:25

Files Modified:
- plugin/hooks/hooks.json

Concepts: hooks, timeout, npm, configuration

成本:完整详情约 155 token 价值:对问题的完整理解

第 4 层:获取工具使用记录(原始证据)

观察记录是工具所执行操作的压缩摘要。有时,压缩恰恰不是你想要的——你需要的是字面意义上的原始字节:实际应用的精确 diff、构建打印出的精确 stderr、API 返回的精确 JSON。

Claude-mem 将这些原始数据保存在 tool_uses 表中,而这一层是读取它们的唯一途径:

get_tool_uses({
  ids: ["toolu_01ABC..."],   // or numeric tool_uses ids
  project: "claude-mem"
})

返回:这些调用所存储的 tool_input / tool_response,以及工具名称、会话 ID,以及该调用被归入的观察记录。

成本: 每行最高 64 KB —— 目前成本最高的层 价值: 未经摘要的真相,仅当且仅当摘要不足时才使用

Warning

绝不要从这里开始,也绝不要在没有从第 1-3 层获取 ID 的情况下调用 get_tool_uses。原始工具正文正是本页其余部分要避免的上下文污染;有意披露少数几条是渐进式披露,默认披露全部则只是一份更大的转录稿。

大于 64 KB 的载荷在写入时会被截断,并带有 …[truncated: N bytes] 标记,因此被截断的正文可以区别于合法结束的正文。


认知负荷理论

渐进式披露基于认知负荷理论:

内在负荷

任务本身的固有难度。

示例:"修复认证 bug" - 必须理解认证系统 - 必须理解 bug - 必须编写修复代码

这种负荷是无法避免的。

无关负荷

信息呈现不佳所带来的认知负担。

传统 RAG 会增加无关负荷: - 浏览无关的观察结果 - 过滤噪声 - 记住哪些内容需要忽略 - 在每个部分之后重新建立上下文

渐进式披露可最大限度地减少无关负荷: - 浏览标题(低付出) - 仅获取相关内容(有针对性的付出) - 将全部注意力集中在当前任务上

相关负荷

构建心智模型和图式的认知付出。

渐进式披露支持相关负荷: - 一致的结构(图例、分组) - 清晰的分类(类型、图标) - 语义压缩(好的标题) - 明确的成本(token 数量)


应避免的反模式

❌ 冗长标题

差:

| #2543 | 2:14 PM | 🔴 | 关于 hooks 超时问题的调查 | ~155 |

好:

| #2543 | 2:14 PM | 🔴 | Hook 超时:60 秒对 npm install 来说太短 | ~155 |

❌ 隐藏成本

差:

| #2543 | 2:14 PM | 🔴 | Hook 超时问题 |

好:

| #2543 | 2:14 PM | 🔴 | Hook 超时问题 | ~155 |

❌ 没有检索路径

差:

以下是 10 条观察结果。[没有关于如何获取完整详情的说明]

好:

以下是 10 条观察结果。
*使用 MCP 搜索工具按需获取完整的观察详情*

❌ 跳过索引层

差:

// 立即获取完整详情
get_observations({
  ids: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]  // 猜测哪些是相关的
})

好:

// 遵循 3 层工作流程
// 第 1 层:搜索索引
search({
  query: "hooks",
  limit: 20
})

// 第 2 层:查看某个相关索引结果周围的上下文
timeline({
  anchor: 2543,
  depth_before: 3,
  depth_after: 3
})
// 阅读时间线后,仅保留仍然相关的 ID

// 第 3 层:仅获取相关的观察结果
get_observations({
  ids: [2543, 2891]  // 仅最相关的部分
})


关键设计决策

为什么使用 token 数量?

决策: 显示近似 token 数量(~155、~203),而不是精确数量。

理由: - 传达规模(50 与 500)而不提供虚假的精度 - 符合人类直觉(小/中/大) - 使 agent 能够分配注意力预算 - 鼓励注重成本的检索

为什么使用图标而不是文本标签?

决策: 使用表情符号图标(🔴、🟡、🔵)而不是文本(GOTCHA、PROBLEM、HOWTO)。

理由: - 视觉扫描(模式识别) - token 高效(1 个字符 vs 10 个字符) - 与语言无关 - 视觉上易于区分 - 对人类和 AI 都适用

为什么索引优先,而不是智能预取?

决策: 始终先显示索引,即使我们"知道"哪些是相关的。

理由: - 我们不可能比 agent 更了解什么才是相关的 - 预取意味着我们假设自己理解了任务 - Agent 知道当前上下文,而我们不知道 - 尊重 agent 的自主性 - 优雅地失败(随时可以获取更多)

为什么按文件路径分组?

决策: 除按日期分组外,还按文件路径对观察结果进行分组。

理由: - 空间局部性:对文件 X 的操作很可能需要关于文件 X 的上下文 - 减少扫描付出 - 符合开发者的思维方式 - 清晰的语义边界


衡量成功

当以下情况出现时,渐进式披露正在发挥作用:

✅ 低浪费率

相关 Token / 总上下文 Token > 80%

消耗的大部分上下文实际上是可用的。

✅ 选择性获取

显示的索引:50 条观察结果
获取的详情:2-3 条观察结果

Agent 在选择性获取,而不是获取一切。

✅ 快速完成任务

有索引的会话:30 秒找到相关上下文
无索引的会话:90 秒浏览所有上下文

达到相关信息的时间更短。

✅ 适当的深度

简单任务:仅需索引
中等任务:获取 1-2 条观察结果
复杂任务:获取 5-10 条观察结果 + 阅读代码

深度随任务复杂度伸缩。


未来增强

自适应索引大小

// 根据会话类型调整索引大小
SessionStart({ source: "startup" }):
  → 显示最近 10 个会话(小索引)

SessionStart({ source: "resume" }):
  → 仅显示当前会话(微索引)

SessionStart({ source: "compact" }):
  → 显示最近 20 个会话(较大索引)

相关性评分

// 使用嵌入向量按相关性预排序索引
search({
  query: "authentication bug",
  orderBy: "relevance"  // 基于语义相似性(未来增强)
})

成本预测

💡 **预算估算:**
- 获取所有 🔴 gotcha:~450 tokens
- 获取所有与文件相关的内容:~1,200 tokens
- 获取一切内容:~8,500 tokens

渐进式详情级别

第 1 层:索引(仅标题)
第 2 层:摘要(2-3 句话)
第 3 层:完整详情(完整观察记录)
第 4 层:源文件(被引用的代码)

关键要点

  1. 展示,而非告知:索引揭示存在什么,而不强迫消费
  2. 注重成本:让检索成本可见,以便做出明智决策
  3. Agent 自主性:让 agent 决定什么是相关的
  4. 语义压缩:好的标题决定系统成败
  5. 一致的结构:模式能降低认知负荷
  6. 一切分两层:先索引,详情按需获取
  7. 上下文即货币:明智地花在高价值信息上

记住

“最好的界面是在不需要时消失、在需要时恰好出现的界面。”

渐进式披露尊重智能体的智慧与自主性。我们提供地图,由智能体自行选择路径。


延伸阅读


这一理念源自 Claude-Mem 在数百次真实编码会话中的实践。该模式之所以有效,是因为它与人类认知以及 LLM 的注意力机制相契合。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/claude-mem