跳转至

私有标签

概述

使用 <private> 标签来标记你不希望持久化到 claude-mem 观察数据库中的内容。这让你能够对跨会话记住的内容进行细粒度控制。

工作原理

将任意内容包裹在 <private> 标签中:

<private>
This content will not be stored in memory
</private>

Claude 可以在当前会话中查看并使用这些内容,但它不会被保存为观察记录。

使用场景

1. 敏感信息

Please analyze this error:

<private>
Error: Database connection failed
Host: internal-db-prod.company.com
Port: 5432
User: admin_user
</private>

What might be causing this?

Claude 会看到完整错误信息,但只有问题会被存储。

2. 临时上下文

<private>
Here's some background context just for this session:
- Project deadline is tomorrow
- This is a hotfix for production
- Manager asked for this specifically
</private>

Help me fix this bug quickly.

3. 调试信息

<private>
Debug output from previous run:
[... 500 lines of logs ...]
</private>

Based on these logs, what's the root cause?

4. 探索性提示词

<private>
I'm just brainstorming here, not making a final decision
</private>

What are some wild approaches to solving this?

技术细节

标签行为

  • 多行支持:标签可以包裹多行内容
  • 多个标签:你可以在一条消息中使用多个 <private> 代码块
  • 嵌套标签:内部标签会随外部标签一同被移除
  • 始终生效:无需配置——自动工作

被过滤的内容

<private> 标签会将内容从存储和记忆中过滤掉: - 用户提示词存储——保存到 user_prompts 表之前,标签会被剥离 - 工具输入——在创建观察记录之前,传递给工具的参数会被过滤 - 工具响应——在创建观察记录之前,工具的输出会被过滤 - 所有可搜索内容——私有内容永远不会进入数据库或搜索索引

重要:标签是在存储时被剥离,而不是从实时对话中剥离。Claude 在会话期间会看到包含 <private> 标签的完整内容,只有内容持久化到数据库时,这些标签才会消失。

不会被过滤的内容

  • 会话摘要(仅由非私有观察记录生成)
  • Claude 的响应(claude-mem 不捕获)

示例

示例 1:API 密钥

<private>
API_KEY=sk-proj-abc123xyz789
</private>

Test this API connection for me

API 密钥不会被存储,但 Claude 可以在会话期间使用它。

示例 2:个人备注

<private>
Note to self: This is for the Smith project - the one we discussed
last Tuesday. Don't confuse with the Jones project.
</private>

Review the authentication implementation and suggest improvements.

个人上下文有助于 Claude 理解你的请求,同时不会污染你的观察历史。

最佳实践

  1. 不要过度使用标签:仅对真正不希望被存储的内容使用 <private>
  2. 上下文很重要:Claude 对你项目的理解来自观察记录——过度使用私有标签会降低未来上下文的质量
  3. 机密信息应另行管理:虽然 <private> 可以防止存储,但敏感数据仍应使用适当的机密信息管理
  4. 测试是否生效:如果不确定标签是否被剥离,请检查 ~/.claude-mem/silent.log

验证

要验证标签是否正常工作:

  1. 提交一个包含 <private> 标签的提示词
  2. 检查数据库,确保私有内容未被存储:
    # Check user prompts
    sqlite3 ~/.claude-mem/claude-mem.db "SELECT prompt_text FROM user_prompts ORDER BY created_at_epoch DESC LIMIT 1;"
    
    # Check observations
    sqlite3 ~/.claude-mem/claude-mem.db "SELECT narrative FROM observations ORDER BY created_at_epoch DESC LIMIT 1;"
    
  3. 私有内容不应出现在 user_prompts 或 observations 中
  4. <private> 标签本身也应被剥离

架构

<private> 标签采用边缘处理模式:

  • 内容在任何存储之前,于钩子层被过滤
  • UserPromptSubmit 钩子:在保存到 user_prompts 表之前,从用户提示词中剥离标签(你输入的提示词在存入数据库之前会被清理)
  • PostToolUse 钩子:在创建观察记录之前,从序列化的 tool_input 和 tool_response JSON 中剥离标签
  • 过滤发生在数据到达 worker service 或数据库之前
  • 这保持了 worker 的简单性,并遵循单向数据流
  • 标签在实时对话中保持可见,但会从所有持久化存储中被剥离

标签剥离范围:该实现从工具输入和工具响应的序列化 JSON 表示中剥离标签,而不是从对话 UI 中的原始用户提示词文本中剥离。你输入的用户提示词文本存储在单独的表(user_prompts)中,标签在存储前也会被剥离。

这种设计确保私有内容永远不会到达数据库、搜索索引或记忆代理,从而在临时数据和持久数据之间保持清晰分离。

故障排除

标签未被剥离

  1. 验证语法是否正确:<private>content</private>
  2. 检查 ~/.claude-mem/silent.log 中的错误
  3. 确保 worker 正在运行:npm run worker:status
  4. 重启 worker:npm run worker:restart

部分内容被存储

如果观察记录中出现了部分内容: - 确保标签已正确闭合 - 检查标签名称是否拼写错误 - 验证内容是否位于工具执行中(不仅仅在你的提示词文本中)

静默日志显示错误

如果你在 ~/.claude-mem/silent.log 中看到错误:

[save-hook] stripMemoryTags received non-string: { type: 'object' }

这通常是无害的——它表明防御性类型检查正在正常工作。然而,如果您经常看到这些信息,则可能表明存在 bug。请在 https://github.com/thedotmack/claude-mem/issues 报告。

另请参阅

  • Auto-Redaction — 可选的基于正则表达式的检测,用于发现意外的 token 泄漏。通过捕获您从未亲自输入的秘密,与 <private> 标签形成互补。

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