Hindsight 0.8.2 发布解读:Memory Defense 机密脱敏、可逆记忆策展与观察范围治理
【免费下载链接】hindsightHindsight: Agent Memory That Learns项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight
Hindsight 0.8.2 是面向长期运行部署的一次大版本更新:新增Memory Defense(按银行粒度对留存内容做密钥与 PII 脱敏/拦截)、支持对单条记忆进行可逆编辑、失效与回滚、通过观察范围(Observation Scopes)枚举与上限控制记忆规模,并为嵌入式部署提供内置的本地 Control CenterWeb 界面;同时新增 Nous Portal、Gemini Batch retain、Gemini embedding-2 等提供商与模型支持,以及多项影响并发与数据存储的修复。阅读本文后,你将掌握如何在 bank 上配置 Memory Defense 策略、理解 45 条内置脱敏规则与 SIEM 联动方式,并了解 0.8.2 中所有新增能力对应的配置项与源码实现位置。
Memory Defense:入库前的密钥与 PII 脱敏层
Agent 在运行过程中不可避免地会接触到 API Key、Token 与个人数据——在没有护栏的情况下,这些内容可能被直接写入长期记忆。Memory Defense正是 0.8.2 引入的开源脱敏层:在内容写入存储之前,扫描并清除其中的敏感数据。
工作方式
在某个 bank 上启用后,Agent 写入的每条记忆都会被一组45 条正则模式扫描,覆盖范围包括:Anthropic、OpenAI、Google 等提供商 API Key、通用密钥、数据库连接串以及常见 PII。每个命中项在内容进入 memory unit 或 document body 之前都会被替换为[REDACTED:type]标记,因此 recall、导出和 reflect 永远看不到原始密钥。
每个规则可选择两种动作:
redact— 将每个命中替换为[REDACTED:type]标记,并存储脱敏后的记忆;block— 丢弃包含命中的条目;若 retain 请求中的全部条目都被拦截,调用返回422。
Memory Defense按 bank 粒度生效,默认关闭。通过 bank 的 config 字段开启:
{ "memory_defense": { "enabled": true, "rules": [{ "on": "sensitive_data", "action": "redact" }] } }策略仅影响该 bank 上后续的 retain 调用——已有记忆不会被追溯扫描。关闭脱敏只需将enabled置为false或删除该字段;未设置sensitive_data规则的 bank 与未启用时行为完全一致(扩展返回 ALLOW,内容原样通过)。更完整的策略说明与模式清单见 Memory Defense 指南。
45 条内置模式的源码实现
默认扩展为hindsight-api-slim/hindsight_api/extensions/builtin/memory_defense_regex.py中的MemoryDefenseRegexExtension,其核心扫描逻辑apply_redaction位于 memory_defense.py。模式目录_REDACTION_PATTERNS按类别组织,完整清单如下:
AI / LLM 提供商
| 标签 | 匹配内容 |
|---|---|
anthropic_key | sk-ant-... |
openai_key/openai_project_key/openai_admin_key | sk-.../sk-proj-.../sk-admin-... |
google_api_key | AIza... |
google_oauth_token | ya29.<token> |
xai_key | xai-... |
groq_key | gsk_... |
huggingface_token | hf_... |
replicate_token | r8_... |
perplexity_key | pplx-... |
databricks_token | dapi<hex32> |
云厂商:aws_access_key(AKIA<16>)、aws_session_token(ASIA<16>)、digitalocean_token(dop_v1_<hex64>),另有aws_secret_key上下文型规则。
源码与 CI:github_fg_pat、github_token(ghp_<36>)、github_app_token、github_user_token、github_refresh、github_oauth、gitlab_pat、npm_token、pypi_token。
支付:stripe_secret(sk_live_/sk_test_)、stripe_restricted(rk_...)、square_token、braintree_token。
通讯与邮件:slack_token(xoxb-/xoxp-/xoxa-/xoxr-)、slack_webhook、twilio_api_key、twilio_account_sid、sendgrid_key、mailgun_key、discord_bot、telegram_bot。
电商:shopify_token(shpat_<hex32>)。
数据库连接串:db_url_postgres、db_url_mysql、db_url_mongodb(含mongodb+srv://)。
私钥 / JWT / 通用凭证:private_key_pem(-----BEGIN ... PRIVATE KEY-----PEM 块)、jwt(eyJ<header>.eyJ<payload>.<signature>)。
PII(美式默认值):credit_card(13–19 位数字,带分隔符)、ssn_us(123-45-6789形态)。
从源码注释可以推断出三个值得注意的实现细节:
- 顺序敏感:更具体的模式排在前面,避免宽泛规则(如通用
sk-...)先吞掉sk-ant-.../sk-proj-...的子串; - CJK 边界处理:Python
re的\b/\w采用 Unicode 语义,会把 CJK 字符视为单词字符,导致中文上下文里紧贴汉字的密钥无法命中。实现改用_ASCII_TOKEN_START/_ASCII_TOKEN_END零宽断言锚定 ASCII token 边界,测试用例 用测试{secret}等模板验证了中英混排场景; - 指纹预览:
_fingerprint_value对命中值做长度感知的指纹化(>15 位保留前 4 + 后 4 位,6–15 位保留前 2 + 后 2 位,<6 位整体掩码),原始值绝不会出现在命中记录里,见 memory_defense.py。
SIEM 联动与审计
每次 redact 或 block 决策都可以通知安全工具链:当 bank 上存在订阅了memory_defense.triggered事件的 webhook 时,Hindsight 会触发事件,报告动作、文档 ID 与命中的模式标签。0.8.2 中这些负载新增了SIEM 友好的富化字段(每命中一条指纹化预览,如ghp_...AAAA),无需额外胶水即可直接路由进 SIEM 或 Slack,相关契约见 webhooks 文档 与端到端测试 test_memory_defense.py。同一决策也会在启用审计时写入memory_defense审计条目(含动作与匹配的模式标签)。
可逆记忆策展:编辑、失效与回滚
0.8.2 让记忆不再是"只写"的。你现在可以纠正 Agent 学到的东西、撤销错误:
- **编辑(Edit)**一条记忆的文本、日期、事实类型或上下文;
- 失效(Invalidate)一条记忆,使其不再出现在 recall 结果中,但不删除;
- **回滚(Revert)**一次编辑或失效,恢复先前状态。
被失效的记忆被移到一边而不是清除,因此 recall 热路径保持干净,同时任何内容都不会永久丢失;被编辑过的记忆带有标记,便于一眼看出哪些内容被改动过。从源码结构看,对应的写入实现位于 memories/pg/writes.py 与 memories/postgres.py。这让长期维护一个 bank 的准确性成为可逆操作——修正错误事实或淘汰过时事实不再具有破坏性。
观察范围(Observation Scopes):按上下文治理记忆规模
随着 bank 增长,观察(Observation,由 consolidation 引擎从多条记忆去重、沉淀出的信念)会跨越大量上下文累积。0.8.2 提供了直接的控制手段:
- 按范围枚举与过滤观察,查看不同上下文各自学到了什么;
- 在Control Plane 中可视化范围;
- 设置每范围上限,限制一个 scope 保留的观察数量——上限为
0可完全停止该 scope 新增观察。
这是对"单一全局设置"的替代:你可以精确控制每个上下文保留多少记忆。从 observations.mdx 可以看到,observation_scopes参数同时出现在 retain 与 consolidate 接口上——例如用observation_scopes: "shared"将观察归并到全局无标签信念,而把会话标签保留在源事实层供 recall 过滤。0.8.2 还包含专门的迁移脚本backfill_observation_scopes(见 alembic/versions),用于为既有观察回填范围字段。
本地 Control Center:嵌入式部署的配套 Web 应用
嵌入式部署(见 hindsight-embed)现在自带一个本地Control CenterWeb 应用,为单节点 / 本地场景提供管理、检查嵌入式 Hindsight 实例的 UI,无需单独部署完整的控制平面。
更多提供商与模型
0.8.2 扩大了提供商与模型覆盖面:
- 原生 Nous Portal 提供商,内置 OAuth 认证,不再依赖外部 CLI;对应
HINDSIGHT_API_LLM_PROVIDER=nous(见 configuration.md)。 - Gemini Batch API 用于 retain,事实抽取可走 Gemini 的批量路径。
- Gemini embedding-2 模型家族支持,按输入产生 embedding。
- 按 bank 的成本归属:设置
HINDSIGHT_API_LLM_SEND_BANK_AS_USER=true后,出站 OpenAI 兼容的 LLM 与 embedding 调用会在user字段携带 bank ID,使 OpenRouter、LiteLLM、Helicone 等成本网关可以按 bank 归因供应商开销,默认关闭。 - 按 bank 的 LLM 连通性探测,在依赖某个 bank 的提供商配置前先验证其可用性。
- Amazon Bedrock service-tier 选择,用于调优 Bedrock 请求处理方式。
运维与数据完整性修复:自管理用户应当升级
0.8.2 包含多项让自管理与长期运行部署更稳健的修复:
- 并发下的 Torch dtype:并发模型初始化可能改变全局 Torch 默认 dtype,现已统一归位为
float32,保持行为一致; - recall/reflect 取消:客户端断开后,被放弃的 recall 与 reflect 操作会被可靠取消,不再白白运行到底;
- PostgreSQL 上更宽的历史 ID:历史
bank_id列加宽为TEXT,避免长 bank 标识符引发失败; - reflect 合成保真度:最终 reflect 输出更稳定地遵循指令与语言规则;
- JSONL retain 分块:JSONL 文件按行边界分块,摄入时记录不会被从中间切开;
- Control Plane 图视图:bank 图视图不再重复加载数据,减少冗余请求;
- 滚动部署迁移:已应用的迁移在滚动部署中会被更可靠地跳过,包括解析错误被包装在
CommandError中的情况; - Webhook 负载:事件负载补齐了此前缺失的字段;
- CLI
get-memory:CLI 正确解析get-memory响应。
其他亮点
- 星座海报导出:Control Plane 现在可以将一个 bank 的记忆星座导出为可分享的 SVG 海报。
【免费下载链接】hindsightHindsight: Agent Memory That Learns项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考