Skip to content

Latest commit

 

History

History
89 lines (65 loc) · 5.19 KB

File metadata and controls

89 lines (65 loc) · 5.19 KB

Pony Memory

Pony 把 Durable Memory 与 Session Summary 严格分层:User Notes / Agent Notes 是跨 Session 的长期事实; compaction、branch summary、task checkpoint 和 recent-recall 去重都属于 Session Tree,不会自动写入 Durable Memory。

文件模型与权限

scope User Notes Agent Notes
workspace .pony/memory/notes/**/*.md .pony/memory/agent_notes.md
user ~/.pony/memory/notes/**/*.md ~/.pony/memory/agent_notes.md

User Notes 由用户维护,agent 只能 list/read/search。Agent Notes 是每个 scope 唯一的 append-only 文件;只有 当前 top-level turn 获得明确授权时才能通过 memory_save 追加:

  • /remember <text>
  • 当前用户明确要求“记住/保存到 memory”;
  • delegated agent、compaction、后台任务和历史 turn 不能继承写权限;
  • 否定表达或对“please remember”这句话的讨论不构成授权。

单次 memory_save 最多 1,024 model tokens,同时受 16 KiB storage hard cap 限制。Agent Notes 在 64 KiB 发出 soft warning,128 KiB hard fail;User Notes 也保留 128 KiB 单文件安全上限。追加使用 per-scope lock、 owner-only 目录/文件、no-follow regular-file 检查与原子 replace。

Query Snapshot 与缓存

一个 top-level turn 只创建一个 MemoryQuerySnapshot。Memory index、recall、BM25 scoring、snippet 选择和一跳 link expansion 共享同一份 raw documents 与 index,不会为每个 Context Source 重复打开文件。

Retrieval 可以跨 turn 复用已解析 snapshot,但复用前会对两个 scope 做 bounded、no-follow inventory,比较 root identity、path、device/inode、size、mtime、ctime、link count 与 file type。新增、修改、删除或替换文件会 立即使 cache 失效;inventory 不安全或在加载期间变化时不缓存。cache 只减少重复读取与分词,不改变 canonical Memory,也不放宽 symlink/hardlink/FIFO/越界/大小限制。

自动扫描上限为 512 个文件、128 KiB/文件、2 MiB 总输入。一个不安全文件被跳过,不会把外部内容带入 index 或 prompt。

自动召回的 Memory 会发送给当前远程 Provider,并可能同时留存在 Session、checkpoint、recovery 或其他本地私有 审计副本中。删除某条 note 不会追溯清除这些历史 artifact;不要把不必要的密钥或敏感数据写入 Durable Memory。

Retrieval 与 recall

检索保持 stdlib-only BM25 + CJK bigram,不依赖向量数据库、embedding 服务或后台 daemon。frontmatter 的 namedescriptiontagsaliases 有字段权重;supersedes 形成 tombstone,使冲突、过期或删除的旧 fact 在建索引时退出。[[note-name]] 只做深度 1、最多 3 条、分数衰减的一跳扩展。

默认 recall 合同:

参数 默认值
top_k 6
min_score 0.3(按本次最高分归一化)
每条 passage 1,024 tokens
recalled_memory source 总 cap 6,144 tokens
recent-turn 去重 2 turns

query 由当前用户输入、active goal 和近期文件路径组成。每个 hit 渲染与 query 最匹配的 paragraph,而不是固定 取文件首段。Agent Notes 按 - <ISO timestamp> <note> 分成独立逻辑 blocks,例如 workspace/agent_notes.md#entry-4,避免整份大文件作为一个文档参与排名。

recent recall 列表是可重建 cache,不属于 canonical Session entry。Compaction 只生成 Session Summary,绝不把 模型摘要自动提升为长期事实。

工具与 CLI

  • memory_list:列出两个 scope 的安全 metadata;
  • memory_read:按 canonical path 与 1-based inclusive 行范围读取,单页最多 2,000 行、50 KiB UTF-8 和配置的 inline token budget;未完成时返回带 source hash 的 continuation;
  • memory_search:返回 BM25 排序结果和 bounded snippets;
  • memory_save:在当前显式授权下追加 Agent Note;
  • pony memory list|show|search|review:不启动模型的只读检查入口。

pony doctor 只验证 Memory root 与候选 Markdown 文件能否通过同一套 bounded、no-follow 文件边界安全读取。 它不检查 frontmatter 质量、note 之间的引用关系或 Git ignore 策略;这些用户内容由编辑器和 Git 直接管理。

canonical path 示例:workspace/notes/auth.mdworkspace/agent_notes.md#entry-2user/notes/preferences.md。绝对路径、..、敏感内容和未授权 scope 都会被拒绝。

质量与限制

离线 fake benchmark 当前覆盖 33 个场景:中文、paraphrase、冲突事实、stale/superseded、删除 tombstone、 长 notes、prompt injection、无关噪声、跨 scope、多跳和 explicit write。fake 结果验证本地检索、工具 trace 与 权限合同,不代表真实模型能稳定决定“何时搜、如何使用结果”。达到 production-quality 声明前,仍需在当前 exact revision 上用至少两个具备凭据的真实 Provider 运行 live benchmark,并分别报告 false recall、stale fact 和 conflicting fact。

Context 预算和 Session 分层见 Context、Session 与长会话,文件安全不变量见 安全,运行命令见验证