diff --git a/docs/07-Wiki-index/织忆同步/data_structure.md b/docs/07-Wiki-index/织忆同步/data_structure.md new file mode 100644 index 0000000..376442d --- /dev/null +++ b/docs/07-Wiki-index/织忆同步/data_structure.md @@ -0,0 +1,28 @@ +# 织忆同步 — 索引 + +## 用途 +织忆(MemoryWeave)从 Obsidian 同步而来的运行时笔记库。这些文件是织忆系统在运行过程中自动记录的操作日志、执行快照、CLI 命令输出、系统状态报告、实验记录和配置调优备忘。共 **1039 个文件**,均为 .md 格式。 + +## 文件类别 + +| 类别 | 约计 | 说明 | +|------|------|------| +| 织忆(Zhiyi)核心 | 150+ | `zhiyi-*`、`zhiyid` 相关 — 服务启停、配置、CLI 命令、consolidation、push、entity extraction、graph 输出等 | +| Hermes / OpenClaw | 80+ | Hermes 网关、Agent、Gateway 配置、providers、cron 响应、memory recall 日志等 | +| ComfyUI | 60+ | ComfyUI 安装、环境、备份、端口、运行日志、master 包等 | +| System / OS | 80+ | systemctl、mkfs.ext4、磁盘空间、home 目录、Deepin、WSL、Arch、sudo 操作、符号链接等 | +| 数据库与存储 | 70+ | LanceDB 配置/类别/双写、SQLite PRAGMA/WAL/backup、A_LiteDB 等 | +| LLM / AI 服务 | 70+ | LLM 端点、vLLM、Ollama、embedder、MiniMax、API key、API 调用等 | +| Go 开发 | 50+ | Go build、ReportJSON、Rust sidecar、consolidation pipeline、dual-master 架构等 | +| Recall 与 Memory | 40+ | recall hit rate、usefulness rate、category、passive recall、flush、OnDistillComplete 等 | +| 网络与远程 | 40+ | Tailscale、SSH、curl 请求、Server(Windows/Linux)、端口、derp 节点等 | +| 实验记录(E 系列) | 30+ | E1 BFS、E3 em、E5_1 Obsidian 同步、E5_3 Web UI、UI 迭代记录等 | +| Windows | 25+ | Windows 端 server、zhiyid、taskkill、setx、Unix socket、PID 等 | +| Obsidian | 20+ | Obsidian 同步、vault 路径、CORS、PID、安装记录等 | +| 其他 | 200+ | 测试内容、commit 记录、README、日期快照、按内容命名的零散笔记等 | + +## 使用提示 +- 文件命名源于 Obsidian 同步时的标题,含较多中英文混排和截断 —— 建议以目录浏览 + 关键词搜索方式查找 +- 同一条操作(如 E5 系列)可能分散在多个文件中,可按主题前缀(E1、E5、zhiyi、ComfyUI 等)检索 +- 本目录为织忆运行日志的持久化存档,承载了大量调试和调优历史,是排查问题和追溯决策的重要来源 +- 部分文件含重复/近似内容(如多次 recall、多次 commit 记录),需自行去重参考 diff --git a/docs/07-Wiki-index/织忆图谱/data_structure.md b/docs/07-Wiki-index/织忆图谱/data_structure.md new file mode 100644 index 0000000..395058d --- /dev/null +++ b/docs/07-Wiki-index/织忆图谱/data_structure.md @@ -0,0 +1,28 @@ +# 织忆图谱 — 索引 + +## 用途 +织忆(MemoryWeave)知识图谱的节点记录库。存储织忆系统中各类概念节点、实体定义、属性标记、关系链接和状态快照,是织忆知识网络的基础事实层。共 **299 个文件**,均为 .md 格式。 + +## 文件类别 + +| 类别 | 约计 | 说明 | +|------|------|------| +| 硬件与资源 | 30+ | CPU、RAM、VRAM、GPU(RTX3050、MX450、GA107M)、磁盘(GB/GiB/MB)、显存需求等 | +| 工具与框架 | 25+ | Hermes、OpenClaw、ComfyUI、LanceDB、Ollama、Tailscale、vLLM 等 | +| 织忆内核概念 | 20+ | 记忆迁移、外部记忆、自有记忆、注入机制、异步写入队列、双写、双删、一致性检查、验证回忆等 | +| 项目规划(P 系列) | 15+ | P0-P6 迭代计划 — 数据分离、二进制清理、旧版归档、文档清理、日志统一、Hermes 整理等 | +| 操作与状态 | 40+ | 状态标记(活跃/正常/已修复/不可达/残留)、操作指令(创建/删/更新/生成/配置/安装/升级/缓存等) | +| 配置与设置 | 20+ | Settings、Prefs、API、端口、--auth-key、ipv6os、icmpv4、环境变量等 | +| 网页/UI 相关 | 10+ | Web UI、POST、React、curl、登录、客户端等 | +| 启动/运行 | 10+ | 一句话启动、本地启动、服务拓扑、执行顺序、断点续跑等 | +| 网络 | 10+ | Tailscale 配置、derp 节点、SSH、API 端点、unix socket 等 | +| 文本生成/SD | 10+ | SD、SDXL、Flux、n_xl、n_realistic、n_majicmix 等模型相关 | +| 日志与清理 | 10+ | 日志散乱、旧日志、日志统一、冗余二进制、文档清理、旧版归档等 | +| 其他实体 | 100+ | 短命名概念节点(单字/双字标题如"是""和""行""基本""系统""工具"等) | + +## 使用提示 +- 每个文件对应一个织忆图谱节点,文件名即为节点名称(部分为单字/短语标题) +- 图谱节点间通过内部链接相互关联,`AGENTS_md.md` 和 `AGENTS_md_1910.md` 等文件为 agent 指南 +- `_织忆图谱索引.md` 为图谱顶层导航文件 +- P 系列(P0-P6)是织忆系统迭代的五阶段规划,建议优先关注 +- 大量短命名节点(单字标题如"的""是""到""行""看")是织忆自动生成的片段节点,可作为图谱细节线索但内容可能不完整 diff --git a/docs/07-Wiki-index/经证同步/data_structure.md b/docs/07-Wiki-index/经证同步/data_structure.md new file mode 100644 index 0000000..c86d459 --- /dev/null +++ b/docs/07-Wiki-index/经证同步/data_structure.md @@ -0,0 +1,23 @@ +# 经证同步 — 索引 + +## 用途 +经证(JingZheng)模块的同步记录和运行凭证存档。存储经证系统在运行过程中产生的证据快照、API 调试记录、性能指标、配置备忘和测试结果。共 **29 个文件**,均为 .md 格式。 + +## 文件类别 + +| 类别 | 文件数 | 说明 | +|------|--------|------| +| API 与端点 | 5 | `_video endpoint`、`v1_1`、`v1_1_0` 相关调试记录;`https://apihub.ag`、`http://localhost` 端点验证 | +| 性能与指标 | 4 | `total_memories: 1239`、`recall_usefulness_rate`、`recall_hit_rate: 93%`、`1_5_2GB` 等指标快照 | +| G8 备份恢复 | 3 | `G8 Restore_ListBackups`、G8 相关操作日志、`g8g9` 相关 | +| E 系列实验 | 4 | `E1 BFS`(3 个文件,含不同执行细节)、`E5_1 Obsidian` 同步记录 | +| 织忆内部组件 | 4 | `Forgetter` 遗忘器调试、`Go ReportJSON`、`cron-progress` 集成 | +| 数据库/存储 | 2 | `PRAGMA journal_mode_WAL` SQLite 优化、`CORS` 配置 | +| 实体提取 | 2 | `Chinese entity extraction` 中文实体提取实验、`unused import` 清理 | +| 其他 | 5 | `2026-05-30` 日期快照、rollback 记录、LLM 调用测试、episodes 记录、其他杂项 | + +## 使用提示 +- 本目录含经证系统运行期间的性能基准数据(recall hit rate 93%、total memories 1239 等),可作为评估指标参考 +- E1 BFS 相关文件(含不同变体)记录了经证系统的广度优先搜索实现试探 +- Forgetter 遗忘器文件记录了织忆记忆衰减/清理机制的调优过程 +- 文件数较少(29 个),可按主题前缀直接浏览全部内容 diff --git a/docs/memory-index/data_structure.md b/docs/memory-index/data_structure.md new file mode 100644 index 0000000..5519bfb --- /dev/null +++ b/docs/memory-index/data_structure.md @@ -0,0 +1,18 @@ +# 记忆 — 索引 + +## 用途 +小唯核心记忆系统的顶层目录。汇聚"第二大脑"内存级数据:核心身份记忆文件(MEMORY.md)、织忆进度快照(织忆/)、MemoryFabric 设计文档(MemoryFabric/)。共 **4 个条目**(1 文件 + 2 子目录 + 1 全局指引)。 + +## 文件清单 + +| 路径 | 类型 | 说明 | +|------|------|------| +| `MEMORY.md` | 文件 | 小唯核心身份记忆 — 身份、环境、服务状态、飞书配置、Obsidian 外脑、重大事件 | +| `织忆/` | 目录 | 织忆进度快照 — cron 进度报告、任务跟踪文件 | +| `MemoryFabric/` | 目录 | MemoryFabric 设计体系 — 设计文档索引、参考项目、技术细节 | + +## 使用提示 +- `MEMORY.md` 是小唯启动时的核心上下文,包含所有关键环境变量和服务状态 +- 织忆/ 目录存储运行态进度快照,反映织忆当前迭代阶段 +- MemoryFabric/ 目录包含 MemoryFabric 体系的设计文档和参考项目 +- 该目录是记忆系统的最顶层,不直接存放大量文件,所有批量数据分散在子目录中 diff --git a/docs/memory-index/织忆/data_structure.md b/docs/memory-index/织忆/data_structure.md new file mode 100644 index 0000000..53c047c --- /dev/null +++ b/docs/memory-index/织忆/data_structure.md @@ -0,0 +1,17 @@ +# 记忆/织忆 — 索引 + +## 用途 +织忆(MemoryWeave)模块的进度快照目录。存储织忆系统的定期进度报告(cron 推送)和阶段性任务跟踪文件。共 **2 个文件**。 + +## 文件清单 + +| 文件 | 说明 | +|------|------| +| `cron-progress.md` | 织忆 cron 定时进度报告 — 记录系统运行状态、阶段性进展、待办事项 | +| `task-phase1-1-models-queue.md` | Phase 1-1 模型队列任务 — 织忆第一阶段模型调度与队列管理的具体任务分解 | + +## 使用提示 +- 此目录由织忆的 cron 机制自动维护,文件随进度更新 +- `cron-progress.md` 是了解织忆当前运行状态的首选入口 +- 任务文件(task-*.md)按阶段命名,反映织忆开发迭代的细粒度任务拆分 +- 随着织忆系统推进,新 task 文件会在此追加 diff --git a/plugins/hermes-zhiyi/__init__.py b/plugins/hermes-zhiyi/__init__.py index 5131750..bdc3ba8 100644 --- a/plugins/hermes-zhiyi/__init__.py +++ b/plugins/hermes-zhiyi/__init__.py @@ -452,7 +452,7 @@ class HermesZhiYiMemoryProvider(MemoryProvider): # ── Read path ──────────────────────────────────────────────────────────── - def prefetch(self, query: str, *, session_id: str = "") -> str: + def prefetch(self, query: str, *, session_id: str = "", depth: str = "fast") -> str: """每次 API 调用前触发:执行语义搜索 + 图谱导航 Obsidian 笔记,返回最相关记忆。""" if not self._client or not query or len(query.strip()) < 2: return "" @@ -523,6 +523,25 @@ class HermesZhiYiMemoryProvider(MemoryProvider): with self._prefetch_lock: self._prefetch_cache.update({"sync": text}) + + # 深度检索模式:本地文件系统渐进检索 + if depth == "deep": + # 优先使用缓存的深度检索结果 + with self._prefetch_lock: + deep_cached = self._prefetch_cache.get("deep_search", {}) + cached_ts = deep_cached.get("timestamp", 0) + cached_query = deep_cached.get("query", "") + cached_block = deep_cached.get("block", "") + if cached_block and (time.time() - cached_ts < 60) and (cached_query == query.strip()): + text += "\n\n" + cached_block + + # 后台线程异步刷新深度检索结果(不阻塞主流程) + threading.Thread( + target=self._async_deep_search, + args=(query.strip(),), + daemon=True, + ).start() + return text def queue_prefetch(self, query: str, *, session_id: str = "") -> None: @@ -548,6 +567,67 @@ class HermesZhiYiMemoryProvider(MemoryProvider): threading.Thread(target=_async_prefetch, daemon=True).start() + def _async_deep_search(self, query: str) -> None: + """后台线程:本地文件系统渐进检索,补充织忆语义搜索(仅 depth='deep' 触发)。""" + if not query or len(query) < 2: + return + try: + wiki_dir = Path.home() / "mc" / "小唯" / "07-Wiki" + data_struct = wiki_dir / "data_structure.md" + if not data_struct.exists(): + return + + # grep 搜索关键词 + import subprocess + result = subprocess.run( + ["grep", "-r", "-l", "-i", query, str(wiki_dir)], + capture_output=True, text=True, timeout=10, + ) + matched = [f for f in result.stdout.strip().split("\n") if f.strip()] + if not matched: + return + + # 读取匹配段落,最多5个文件 + blocks = ["[rag-skill File — local Wiki evidence]"] + count = 0 + for fpath in matched[:5]: + try: + with open(fpath, "r", encoding="utf-8") as f: + content = f.read() + lines = content.split("\n") + snippets = [] + for i, line in enumerate(lines): + if query.lower() in line.lower(): + start = max(0, i - 2) + end = min(len(lines), i + 3) + snippet = "\n".join(lines[start:end]).strip()[:200] + if len(snippet) < 50: + snippet = snippet.ljust(50, " ")[:50] + snippets.append(snippet) + if len(snippets) >= 2: + break + if snippets: + filename = Path(fpath).name + blocks.append(f" 📄 {filename}") + for s in snippets: + blocks.append(f" {s}") + count += 1 + except Exception: + continue + + if count == 0: + return + + block_text = "\n".join(blocks) + with self._prefetch_lock: + self._prefetch_cache["deep_search"] = { + "block": block_text, + "query": query, + "timestamp": time.time(), + } + except Exception: + logger.debug("[ZhiYi] _async_deep_search error", exc_info=True) + # ── Tool interface ──────────────────────────────────────────────────────── def get_tool_schemas(self) -> List[Dict[str, Any]]: