feat: 织忆+rag-skill深度检索模式 + 07-Wiki全目录索引
Phase 3: Hermes 插件深度检索 - prefetch() 新增 depth='deep' 参数 - depth=deep: 织忆语义搜索后,异步触发本地文件渐进检索 - 结果标记 [rag-skill File — local Wiki evidence] - 缓存 TTL 60s,支持双轮(第一轮触发,第二轮拿缓存) - depth='fast' 默认行为完全不变 Phase 4: 07-Wiki 目录索引补全 - docs/07-Wiki-index/: 织忆同步(1039files)、织忆图谱(299files)、经证同步(29files) - docs/memory-index/: 记忆顶层 + 织忆进度快照
This commit is contained in:
parent
25a1bb52dc
commit
1970fb4f06
|
|
@ -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 记录),需自行去重参考
|
||||
|
|
@ -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)是织忆系统迭代的五阶段规划,建议优先关注
|
||||
- 大量短命名节点(单字标题如"的""是""到""行""看")是织忆自动生成的片段节点,可作为图谱细节线索但内容可能不完整
|
||||
|
|
@ -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 个),可按主题前缀直接浏览全部内容
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
# 记忆 — 索引
|
||||
|
||||
## 用途
|
||||
小唯核心记忆系统的顶层目录。汇聚"第二大脑"内存级数据:核心身份记忆文件(MEMORY.md)、织忆进度快照(织忆/)、MemoryFabric 设计文档(MemoryFabric/)。共 **4 个条目**(1 文件 + 2 子目录 + 1 全局指引)。
|
||||
|
||||
## 文件清单
|
||||
|
||||
| 路径 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `MEMORY.md` | 文件 | 小唯核心身份记忆 — 身份、环境、服务状态、飞书配置、Obsidian 外脑、重大事件 |
|
||||
| `织忆/` | 目录 | 织忆进度快照 — cron 进度报告、任务跟踪文件 |
|
||||
| `MemoryFabric/` | 目录 | MemoryFabric 设计体系 — 设计文档索引、参考项目、技术细节 |
|
||||
|
||||
## 使用提示
|
||||
- `MEMORY.md` 是小唯启动时的核心上下文,包含所有关键环境变量和服务状态
|
||||
- 织忆/ 目录存储运行态进度快照,反映织忆当前迭代阶段
|
||||
- MemoryFabric/ 目录包含 MemoryFabric 体系的设计文档和参考项目
|
||||
- 该目录是记忆系统的最顶层,不直接存放大量文件,所有批量数据分散在子目录中
|
||||
|
|
@ -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 文件会在此追加
|
||||
|
|
@ -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]]:
|
||||
|
|
|
|||
Loading…
Reference in New Issue