OpenHuman 记忆树检索:memory_tree 多模式原语、确定性 walk 路由与记忆子智能体
OpenHuman 记忆树检索memory_tree 多模式原语、确定性 walk 路由与记忆子智能体【免费下载链接】openhumanOpenHuman is an open source personal AI for Mac, Windows and Linux — local-first memory, agent orchestration, and deep research.项目地址: https://gitcode.com/GitHub_Trending/op/openhumanOpenHuman 的记忆系统分为“写路径”与“读路径”Memory Tree 把一天的信息流折叠成磁盘上的分块、评分与层级摘要树而Retrieval检索则负责从树中读出正确答案——找到合适的节点、水合出原始 chunk、并把 “Alice” 这样的表面名字解析成稳定 id。本文基于 gitbooks/features/obsidian-wiki/retrieval.md 展开结合当前仓库源码讲清memory_tree工具的 8 种 mode、统一的RetrievalHit返回结构、实体规范化与 co-occurrence 图、无 LLM 的确定性walk算法以及专职记忆子智能体的配置与性能基准方式。设计哲学检索层没有分类器、闸门和编排器retrieval.md 明确了一点检索层刻意不设置 classifier、gate 或 composer。各个检索原语是确定性的、作用域单一的至于“该调哪个原语”“结果如何组合”完全交给调用方的 agent 决策对于确定性的walk则由一个纯路由算法决策。这意味着模型面对的是一个“工具箱”而非黑盒每个原语行为可预测便于测试和组合。memory_tree工具单一入口、多模式分发agent 面向的入口是一个名为memory_tree的多模式工具定义在 src/openhuman/memory/query/mod.rs。其mode字段路由到底层实现所有 mode 返回同一种RetrievalHit结构因此模型看到的 schema 与具体 mode 无关。源码中MemoryTreeTool的parameters_schema给出了全部合法 mode 与参数mod.rs 的parameters_schema方法Mode用途典型场景search_entities对规范化实体索引做模糊LIKE查询把表面名字解析为 canonical id用户提到人名时先调用它“Alice 说过什么”query_source按 source 类型 时间窗过滤的 per-source 摘要检索可选语义重排“总结一下我上周 Slack #eng 的内容”drill_down对摘要节点的child_ids做 BFS 下钻一层或多层可选重排把粗粒度摘要展开成更细的子节点cover_window求覆盖[since_ms, until_ms]时间窗的最小节点集合“过去 24 小时”类时间限定回顾fetch_leaves按 id 批量水合原始叶子 chunk上限 20 个摘要命中后拉取原文用于引用ingest_document把文档写入树以备日后检索唯一的写模式持久化抓取的网页/GitHub 文件重复source_id会替换旧 chunkwalk/smart_walk确定性 E2GraphRAG 检索——抽取查询实体、在实体图与稠密摘要间路由全程无 LLM返回排序后的证据一条自然语言问题一次问完无需 agent 循环各 mode 的具体参数来自源码 schema包括querysearch_entities的匹配子串query_source的可选语义重排查询walk的自然语言问题kindssearch_entities的实体类型过滤email、url、handle、person等source_kindquery_source的 source 类型过滤chat、email、document等time_window_daysquery_source/walk/smart_walk的回看窗口天数作用于 walk 的稠密分支max_hopswalk/smart_walk的实体图关联跳数阈值默认 2上限 4node_id/max_depthdrill_down要展开的摘要节点及其深度默认 1最大 3chunk_idsfetch_leaves要拉取的 chunk id 列表title/body/source_id/provider/source_refingest_document的写入参数provider缺省为agent重复source_id的摄取会替换旧 chunklimit结果数上限默认值随 mode 变化仅mode为必填字段。一个值得注意的历史演进早期的query_global与query_topic两个 mode已被移除——source 树已经承载了全部内容走 source 层级加实体索引即可重建时间与主题两个投影retrieval.md 指出 dispatcher 测试断言了它们不存在src/openhuman/memory/query/mod.rs 中的match分支也确认当前合法 mode 只有上述 8 种未知 mode 会返回明确的错误提示。RetrievalHit所有原语的统一返回结构每个原语都输出RetrievalHit其 JSON schema 在 src/openhuman/memory/tree/retrieval/schemas.rs 中声明多处TypeSchema::Ref(RetrievalHit)数组即各查询的命中列表。关键字段node_id/node_kind——leaf一条原始mem_tree_chunks行或summary一条已封存的mem_tree_summaries行。消费方据此分支例如“只对 summary 做drill_down”tree_id/tree_kind/tree_scope/level—— 溯源信息UI 可以显示“来自 Slack #eng”content—— 片段摘要文本或原始 chunk 正文entities/topics—— 节点携带的 canonical id 与标签time_range_start/time_range_end—— RFC3339 格式让不同工具返回的命中可以按同一时间轴排序score—— 相关性分数child_ids—— 下一层的 id叶子为空是drill_down的游标source_ref—— 回指原始 source 的指针叶子上填充。查询类 mode 还会把命中包进QueryResponse { hits, total, truncated }其中total是截断前的匹配总数——agent 由此判断“加大 limit 再查一轮是否会多出结果”避免误判为“没有更多数据”。实体解析与 canonical id名字是脏的id 不是。回答“关于某人的问题”之前agent 需要把表面形式解析为 canonical id例如person:alice或email:aliceexample.comsearch_entities在树 summariser 维护的实体索引上做模糊查询完成解析规范化注册表位于 Obsidian vault 中每个实体一个 Markdown 文件路径为content_root/entities/kind/canonical_id.md带 YAML frontmatterid、kind、display_name、aliases、emails、handles外加用户可在 Obsidian 里直接编辑的自由 notes 正文lookup_alias按 alias / email / handle / display name 做不区分大小写的匹配kind与memory_tree::score::extract::EntityKind对齐保证评分器产出的 id 能原样往返于注册表vault 是唯一事实来源——Obsidian、grep 与向量搜索看到的是同一份数据不需要额外数据库。实体图只读、派生、纯 SELF-JOINOpenHuman 通过实体图暴露实体间关系但没有平行的三元组表。其前提是图就是树映射出来的——两个实体共同出现在同一个树节点上就构成一条边权重为共同节点的个数。co_occurring_entities(config, subject, limit)—— 返回按权重排序的GraphEdge { subject, object, weight }neighbors(config, subject, limit)—— 仅返回邻居 id。从源码结构看这是一次对mem_tree_entity_index的只读 SELF-JOIN不建新表、不改 schema。这个图正是下文确定性walk路由的直接依赖。确定性walk/smart_walk无 LLM 的 E2GraphRAGwalk与smart_walk都经由fast_retrieve实现dispatcher 中二者都路由到 src/openhuman/memory/query/fast_walk.rs 的run_fast_walk这是一个E2GraphRAG 风格算法用于替代旧的逐轮 agentic 循环从不调用 LLM。路由完全由查询实体与共现图的跳数距离决定抽取查询实体EqspaCy NLPregex 兜底Eq为空 →global模式在摘要树上做稠密重排否则计算h跳内的相关实体对无相关对 →带出现度排序的 global稠密 top-2k再按每个摘要提及了多少Eq实体重排找到相关对 →local模式对各实体对的实体索引节点集求交当候选超过k时收紧h最后按实体覆盖率与新鲜度排序幸存者。可调参数FastRetrieveOptions字段在 src/openhuman/memory/query/backend.rs 中定义为limit、max_hops、time_window_days等limitk默认 10、上限 100、max_hopsh默认 2、上限 4、可选的time_window_days稠密分支回看窗口。输出是结构化的QueryResponse命中列表——不生成任何合成叙述文本——留给上层 context agent 消化。时间窗检索cover_window对“过去 24 小时发生了什么”这类问题cover_window计算覆盖[since_ms, until_ms]epoch 毫秒的最小节点集。由于摘要节点自带time_range_start/time_range_end一个高层摘要节点就可能覆盖整个时间窗而不必扇出到每个叶子——agent 只有在需要细节或引用时才进一步drill_down或fetch_leaves。实现位于 src/openhuman/memory/query/cover_window.rs。memory_recall旧版命名空间键值检索与树并列、独立存在的是memory_recallsrc/openhuman/memory/tools/recall.rs它检索更早的命名空间键值记忆memory_recall { namespace, query, limit }命名空间如global、background、autocomplete或skill-{id}。源码中resolve_namespace在未指定时回落到默认 scopeglobal并防止模型丢失本已想好的命名空间。它返回按分排序的结果最适合树出现之前的精确偏好/事实查询“用户喜欢深色模式吗”。记忆子智能体专职检索的 specialistsrc/openhuman/memory/agent/ 下是一个专职检索子智能体通过call_memory_agent工具被调用。它组合各原语暴露的策略来回答关于记忆树的问题向量搜索、原始文件关键词搜索、实体搜索与关系追踪、层级树浏览、直接读内容、source 列表。其工具白名单与行为参数定义在 src/openhuman/memory/agent/agent/agent.toml 中从源码可以看到几个关键配置named工具列表memory_recall、memory_tree含全部 mode含确定性walk/smart_walk、query_memory、memory_doctor、memory_flavour只读的人格/风格剖面、ask_user_clarificationmax_iterations 6—— 注释解释了动机合法答案只需要几步walk→ 可选drill_down/fetch_leaves→ 作答过大的预算反而会让子智能体空转约 80 秒后以失败结束小预算确保在记忆树退化/为空时快速失败sandbox_mode read_only、temperature 0.2、agent_tier worker以及omit_identity true、omit_safety_preamble true等上下文裁剪让子智能体保持轻量prompt 与迭代上限同目录维护agent/prompt.mdagent/prompt.rs性能由基准脚本 scripts/bench-memory-walk.sh 追踪。该脚本调用 core CLI 对一组测试查询做记忆树遍历基准支持--query、--content-root、--max-turns、--model、--verbose等参数输出每查询延迟与汇总统计可用于回归对比检索改动前后的表现。小结与延伸阅读OpenHuman 的检索路径可以概括为统一 schema 的多模式原语memory_tree 实体规范化Obsidian vault 为唯一事实来源 派生共现图 无 LLM 的确定性路由walk 专职受限子智能体。每一层都可单独测试如 src/openhuman/memory/query/ 下每个 mode 都有独立的*_tests.rs也可通过bench-memory-walk.sh做端到端基准。相关文档均以仓库根目录为起点gitbooks/features/obsidian-wiki/memory-tree.md —— 构建出检索所读之树的写路径gitbooks/features/obsidian-wiki/memory-diff.md —— 记忆变更如何被追踪gitbooks/features/obsidian-wiki/README.md —— Obsidian 支持 wiki 的功能索引gitbooks/features/obsidian-wiki/scoring.md —— 树评分含实体抽取的细节src/openhuman/memory/agent/README.md —— 记忆子智能体模块说明。【免费下载链接】openhumanOpenHuman is an open source personal AI for Mac, Windows and Linux — local-first memory, agent orchestration, and deep research.项目地址: https://gitcode.com/GitHub_Trending/op/openhuman创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考