@furongjun1999/dsh-memory 0.4.1 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +56 -17
- package/docs/cordis-patch-profile-web.example.yml +35 -0
- package/docs//345/267/245/344/275/234/347/272/252/345/276/213_/350/256/244/347/237/245/345/233/276/346/235/241/347/233/256_v1.1.json +190 -0
- package/docs//347/201/265/346/236/242MCP/345/267/245/345/205/267/346/200/273/350/241/250_v3.4.md +3 -2
- package/docs//347/201/265/346/236/242_/350/207/252/346/210/221/345/261/202/345/256/232/344/271/211.md +43 -0
- package/docs//347/231/275/347/256/261/346/231/272/350/203/275/347/263/273/345/210/227/302/267/347/254/254/344/272/224/347/257/207/357/274/232/350/256/251AI/347/234/237/346/255/243/350/243/205/344/270/212/350/256/260/345/277/206.md +373 -0
- package/docs//350/256/244/347/237/245/345/233/276_MD/347/233/256/345/275/225/346/226/271/346/241/210_v0.1.md +218 -0
- package/lib/hooks.js +8 -1
- package/package.json +77 -77
- package/src/hooks.ts +9 -1
package/README.md
CHANGED
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
## ⚡ 三步快启(30 秒上手)
|
|
22
22
|
|
|
23
23
|
```bash
|
|
24
|
-
# ① 装灵枢大脑(一条命令,零外部依赖;v0.
|
|
25
|
-
pip install aeis-0.
|
|
24
|
+
# ① 装灵枢大脑(一条命令,零外部依赖;v0.5.0 完整自包含:核心+白箱+知识库随包)
|
|
25
|
+
pip install aeis-0.5.0-py3-none-any.whl # wheel 从 Releases 页下载,或 git+ 在线安装
|
|
26
26
|
|
|
27
27
|
# ② 装进 DSH 的 web profile(pnpm 协调入口,不要用裸 npm install 装进 profile)
|
|
28
28
|
dsh plugin --profile web add @furongjun1999/dsh-memory
|
|
@@ -38,6 +38,8 @@ dsh plugin --profile web add @furongjun1999/dsh-memory
|
|
|
38
38
|
tools: 'brain' # 'brain' 全心智 | 'core' 精选
|
|
39
39
|
```
|
|
40
40
|
|
|
41
|
+
> ⚠️ **profile config override 依赖(2026-09-04 dsh 0.1.2 排查确认)**:插件包内自带的 `cordis.patch.yml` 只有裸 insert(id+name,无 config),完整 config 全靠 profile 层的 `cordis.patch.yml` override 补全(dbPath/tools/env/lifecycle)。**换 profile、重装 profile 或升级插件时,必须确认该 override 仍在** `<profile>/cordis.patch.yml`——完整备份模板见 `docs/cordis-patch-profile-web.example.yml`,丢失会导致插件以默认配置运行(dbPath 相对路径错位→角色数据读不到、tools=brain 缺白箱工具族、lifecycle 不启动)。
|
|
42
|
+
>
|
|
41
43
|
> ⚠️ **安装方式**:插件必须通过 **`dsh plugin --profile <name> add`** 装进 profile(它会用 pnpm + `autoInstallPeers: false` 正确解析 peer 依赖)。
|
|
42
44
|
> **不要**用 `npm install` 把插件装进 profile 的 `node_modules`——那会引入错误版本的 `@deepseek-ai` peer 包,导致插件加载失败 / 浏览器报错。
|
|
43
45
|
> 想自己改源码?克隆 `FuRongJun-1999/dsh-memory` 后用 `npm install && npm run build`(构建插件本身),再用 `dsh plugin add <本地路径>` 部署。
|
|
@@ -57,7 +59,7 @@ dsh plugin --profile web add @furongjun1999/dsh-memory
|
|
|
57
59
|
|
|
58
60
|
## 🗺️ 功能使用教学 · 条件路由图
|
|
59
61
|
|
|
60
|
-
**想做什么 → 找对应泳道 → 走条件边到功能**(流程图 = 认知图 = 条件路由图,**
|
|
62
|
+
**想做什么 → 找对应泳道 → 走条件边到功能**(流程图 = 认知图 = 条件路由图,**82 工具**全收录,[工具总表 → docs/灵枢MCP工具总表_v3.4.md](docs/灵枢MCP工具总表_v3.4.md)):
|
|
61
63
|
|
|
62
64
|
[](docs/lingshu_tutorial.html)
|
|
63
65
|
|
|
@@ -87,7 +89,7 @@ dsh plugin --profile web add @furongjun1999/dsh-memory
|
|
|
87
89
|
|
|
88
90
|
- **Agent Plugins 1.0.0 兼容包**(主仓库 `CommonTrustProtocol/aeis/skills/`):**688 个 Agent Skills**(六域条件单元:compiler 116 / pylang 122 / graph 117 / os 112 / browser 104 / net 117)
|
|
89
91
|
- **比标准 Agent Skills 多 KCCS 四要素**:生效条件/子功能/执行/**不适用条件**(三通道:description「Not for」+ metadata.kccs.not_applicable + 正文克制条款)
|
|
90
|
-
- **三层关系**:知识真源(条件单元库)→ 说明书(技能包——何时用/怎么用/克制什么)→ 执行(**本插件挂载的灵枢 MCP
|
|
92
|
+
- **三层关系**:知识真源(条件单元库)→ 说明书(技能包——何时用/怎么用/克制什么)→ 执行(**本插件挂载的灵枢 MCP 82 工具**·物理基底裁决)
|
|
91
93
|
- 使用:任意符合 agentskills.io / agent-plugins.org 规范的 agent 可加载本技能包;Verification 由灵枢 MCP 执行
|
|
92
94
|
|
|
93
95
|
---
|
|
@@ -133,9 +135,38 @@ dsh plugin --profile web add @furongjun1999/dsh-memory
|
|
|
133
135
|
- **零运行时依赖**:手写 stdio MCP 桥,与灵枢 D-005「核心零外部依赖」哲学一致——你拿到的是一个干净、可信、可审的大脑。
|
|
134
136
|
- **动态 schema + 进程自愈**:工具清单运行时拉取(灵枢升级 DSH 零改动),Python 子进程崩溃自动指数退避重启。
|
|
135
137
|
- **工具注册竞态补注册**:启动时 python 未就绪(竞态)→ 桥重连成功后自动补注册工具(2s 轮询),不再"工具永久缺失"。
|
|
136
|
-
- **白箱 wisdom_* 全工具**(`tools: all`):
|
|
138
|
+
- **白箱 wisdom_* 全工具**(`tools: all`):82 个 MCP 工具含 wisdom_verify/analyze/predict/trust_judge/compose/respond/chat 白箱族,Agent 可直接调用。
|
|
137
139
|
- **内容分级门控**:**拒绝一切涉及未成年人的性内容**(服务端关键词组合硬拦截——未成年人特征词 + 性内容词同时命中即拒绝,`route=refused`);成人内容由前端本地弹窗提示(满 18 周岁 + 个人对话场景自述)。注:开源项目不实现身份认证/年龄核验(那是绑定身份系统的商业 App 范畴);内容过滤保护的是"未成年人 + 性内容"组合的明文请求。
|
|
138
140
|
|
|
141
|
+
## 🧭 认知图使用方法 & 工作纪律(v1.1)
|
|
142
|
+
|
|
143
|
+
> 认知图 = 时空记忆图/条件注释图。节点**四要素**:conditions(生效) / subgraph(子内容·嵌套) / negative(不适用) / execution(如何执行)。
|
|
144
|
+
|
|
145
|
+
### 认知图使用方法
|
|
146
|
+
- **图像语义 → 认知图**:image_semantics_cg(可嵌套,person→head→face→eyes→iris…)→ flatten(§4.4 平铺 spatiotemporal_nodes + spatial_relation_edges)。
|
|
147
|
+
- **写入纪律**:数据完整四要素 + 先验证后写入 + 冲突先证后改 → docs/认知图写入纪律_v1.0.md。
|
|
148
|
+
- **索引**:语义→节点;层级边 part_of(child→parent) + parent_of(parent→child) 双向(out 写死 API 也能查)。
|
|
149
|
+
- **加载**:启动加载 SELF 层(身份/价值观/认知图接口)→ 按 session 从认知图读 目标/感觉/工作记忆/知识。
|
|
150
|
+
|
|
151
|
+
### 工作纪律(13 条 · docs/工作纪律_认知图条目_v1.1.json)
|
|
152
|
+
| # | 纪律 | 触发/适用 | 不适用 |
|
|
153
|
+
|---|---|---|---|
|
|
154
|
+
| 1 | 理论先行 | 重要项目/长期任务 | 情感交互/闲聊 |
|
|
155
|
+
| 2 | 全面处理 | 有相关记忆/认知图/权限 | 情感交互/闲聊 |
|
|
156
|
+
| 3 | 白箱方法 | 已读4篇入门文档 | 快速短期事项/情感交互/闲聊 |
|
|
157
|
+
| 4 | 根因纪律 | 结果与预期不符/出现偏差 | 情感交互/闲聊 |
|
|
158
|
+
| 5 | 验证纪律 | 入库前/提交前 | 情感交互/闲聊 |
|
|
159
|
+
| 6 | 双副本纪律 | 多副本部署 | 单副本/情感交互/闲聊 |
|
|
160
|
+
| 7 | 兜底纪律 | 主路径不可用/MCP不可用 | 情感交互/闲聊 |
|
|
161
|
+
| 8 | 中文思考 | 中文区域/中文项目开发 | 英文场景/英文环境 |
|
|
162
|
+
| 9 | 敏感信息隔离 | 文档含敏感/隐私/私有内容 | 无敏感信息的公开技术内容 |
|
|
163
|
+
| 10 | 图像选源护栏 | 构建图像四类图/选图像处理源 | 已核对规范源/纯公开数据 |
|
|
164
|
+
| 11 | 历史查询优先 | 选图像/算法/源、复现已有能力 | 已有记录且已核对/无历史可查的纯新算法 |
|
|
165
|
+
| 12 | 算法权威唯一 | 选图像/视觉算法 | 无对应权威文档的探索期 |
|
|
166
|
+
| 13 | 访谈澄清 | 重要项目/需求模糊/新任务启动 | 情感交互/闲聊/明确单步小改动 |
|
|
167
|
+
|
|
168
|
+
### 使用认知图流程
|
|
169
|
+
识别任务条件 → 按条件路由到对应纪律/知识 → 精准执行 → 正确记录(未记录→记录)/错误找条件 → 验证 → 固化;不猜测、未验证不写入。
|
|
139
170
|
## 🧠 白箱智能管线(知识查询零 LLM)
|
|
140
171
|
|
|
141
172
|
灵枢处理知识查询走**白箱确定性格局**(不依赖 LLM 生成/校验),完整管线:
|
|
@@ -300,17 +331,17 @@ python -m aeis.mcp.server
|
|
|
300
331
|
|
|
301
332
|
(B 站宣传素材:[封面](docs/promo/bilibili-cover.jpg) · [视觉图 ×5](docs/promo/))
|
|
302
333
|
|
|
303
|
-
## 🧰 工具清单(
|
|
334
|
+
## 🧰 工具清单(82 个 MCP 工具 · 全量)
|
|
304
335
|
|
|
305
|
-
灵枢 MCP server 注册 **
|
|
336
|
+
灵枢 MCP server 注册 **82 个工具**,按心智功能分 11 大模块(智能论 v3.4:端口架构/锚定验证/认知图与条件路由/原生神经网络)。工具清单运行时动态拉取(灵枢升级 DSH 零改动),**完整总表(每个工具一条说明,不重复不遗漏)见 [docs/灵枢MCP工具总表_v3.4.md](docs/灵枢MCP工具总表_v3.4.md)**。下方为分类概览:
|
|
306
337
|
|
|
307
338
|
### 记忆(12)
|
|
308
339
|
|
|
309
|
-
remember / recall / search / timeline / longterm_snapshot / prefeed / promote_memories / pattern_separation / reconstruct_scene /
|
|
340
|
+
remember / recall / search / timeline / longterm_snapshot / prefeed / promote_memories / pattern_separation / reconstruct_scene / context(note/recall/compact)
|
|
310
341
|
|
|
311
342
|
### 知识图谱与推理(11)
|
|
312
343
|
|
|
313
|
-
relate / reason / induce / distill / think /
|
|
344
|
+
relate / reason / induce / distill / think / ingest(text/file/url) / importance_recalc / transfer_test / flywheel_metrics
|
|
314
345
|
|
|
315
346
|
### 预测与盲区(7)
|
|
316
347
|
|
|
@@ -348,6 +379,10 @@ insight_record / insight_verify / insight_report / insight_window
|
|
|
348
379
|
|
|
349
380
|
web_search / web_ingest_search / export / service_info / designer_decide
|
|
350
381
|
|
|
382
|
+
### 维护(1)
|
|
383
|
+
|
|
384
|
+
nightly_cleanup(知识层夜间整理:分拣迁移无边孤岛→情境层+联想补边+情境层随机联想)
|
|
385
|
+
|
|
351
386
|
> 每个工具的功能说明见工具总表(不重复、不遗漏)。
|
|
352
387
|
|
|
353
388
|
> **引擎内部能力(按安全边界未挂载 MCP)**:condition_space_operate(条件空间 7 操作)、add_context(情境层写入)、code_test / compile_exec(代码执行)、lingshu_sensor_report / lingshu_vitality_report / lingshu_auto_snapshot / lingshu_rollback(自修改安全闭环)——存在于引擎中,但刻意不暴露给外部 Agent 调用。
|
|
@@ -355,14 +390,14 @@ web_search / web_ingest_search / export / service_info / designer_decide
|
|
|
355
390
|
|
|
356
391
|
| 模式 | 暴露数 | 说明 |
|
|
357
392
|
|---|---|---|
|
|
358
|
-
| `'all'` | **68** |
|
|
393
|
+
| `'all'` | **68** | 82 个全量中排除 13 个**宿主级风险工具**(见下),含全部身体/视觉/白箱/角色/智慧之书能力 |
|
|
359
394
|
| `'brain'`(默认) | **36** | 去掉身体的完整大脑:记忆/推理/认知/学习/飞轮/反思/摄取/生命周期/长期记忆门/服务,**不含**身体视觉与风险工具 |
|
|
360
|
-
| `'core'` | **12** | 精选核心:remember/recall/search/timeline/think/relate/predict_routes/
|
|
395
|
+
| `'core'` | **12** | 精选核心:remember/recall/search/timeline/think/relate/predict_routes/ingest/context/self_check/service_info |
|
|
361
396
|
| 字符串数组 | 自定义 | 显式列出的工具名(不受风险名单限制,配置者已明确选择) |
|
|
362
397
|
|
|
363
398
|
**`'all'` 也排除的宿主级风险工具(13 个)**——`run_command`(宿主命令执行)/ `designer_decide`(设计者裁决·fail-closed)/ `device_call`(外部设备)/ `see`·`world3d`·`vprim`·`visual_check`(身体视觉)/ `start_lifecycle`·`stop_lifecycle`(自主生命周期控制)/ `web_ingest_search`(网络写知识层)/ `role_create`·`role_import`·`role_block`(角色卡写入)。
|
|
364
399
|
|
|
365
|
-
> 数字说明:MCP server 共注册 **
|
|
400
|
+
> 数字说明:MCP server 共注册 **82 个工具**(上面全量清单,运行时 tools/list 实测);`'all'` 实际暴露 69 个(82-13 风险),`'brain'` 实际暴露 36 个,`'core'` 实际暴露 12 个。
|
|
366
401
|
|
|
367
402
|
## 架构
|
|
368
403
|
|
|
@@ -394,17 +429,17 @@ web_search / web_ingest_search / export / service_info / designer_decide
|
|
|
394
429
|
|
|
395
430
|
### 安装灵枢大脑(aeis 库)
|
|
396
431
|
|
|
397
|
-
**方式 A
|
|
432
|
+
**方式 A:Release 下载 wheel 离线安装 ★ 最稳(不依赖网络)**
|
|
398
433
|
|
|
399
|
-
|
|
434
|
+
从 [GitHub Releases](https://github.com/FuRongJun-1999/CommonTrustProtocol/releases) 下载 `aeis-0.5.0-py3-none-any.whl`(**完整自包含发布版**):
|
|
400
435
|
|
|
401
436
|
```bash
|
|
402
|
-
pip install aeis-0.
|
|
437
|
+
pip install aeis-0.5.0-py3-none-any.whl
|
|
403
438
|
```
|
|
404
439
|
|
|
405
|
-
> **v0.
|
|
440
|
+
> **v0.5.0 为完整自包含单包**:灵枢核心(aeis)+ 白箱智慧模块(wisdom,含 **2800+ 个 KCCS 注释知识点 + 学科知识库**)+ 三入口(harness)+ 种子知识(seed_knowledge,智能论 3.4 + 学科卡)。单文件、离线可用、装一次管用——知识库随包分发,无需另装。
|
|
406
441
|
>
|
|
407
|
-
> 遇到网络不稳(GitHub clone
|
|
442
|
+
> 遇到网络不稳(GitHub clone 失败)时首选 wheel 离线安装。
|
|
408
443
|
|
|
409
444
|
**方式 B:git 安装(需网络)**
|
|
410
445
|
|
|
@@ -520,3 +555,7 @@ npm test # 真实集成测试(spawn 本机灵枢,验证握手/往返
|
|
|
520
555
|
MIT © 荣(FuRongJun-1999)· 灵枢 AEIS 工程实现
|
|
521
556
|
|
|
522
557
|
DeepSeek Harness 为 DeepSeek 官方开源项目(MIT),本插件与之无隶属关系。
|
|
558
|
+
|
|
559
|
+
|
|
560
|
+
---
|
|
561
|
+
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# zcode-web profile 实际生效的 dsh-memory config override(备份模板)
|
|
2
|
+
#
|
|
3
|
+
# ⚠️ 工程依赖(2026-09-04 dsh 端排查确认):插件包内自带的 cordis.patch.yml
|
|
4
|
+
# 只有裸 insert(id+name 无 config),完整 config 全靠 profile 层的
|
|
5
|
+
# cordis.patch.yml override 补全。换 profile / 重装 profile / 升级插件时,
|
|
6
|
+
# 必须确认本文件内容仍在 <profile>/cordis.patch.yml 中——否则插件以默认
|
|
7
|
+
# 配置运行:dbPath 落到相对路径 data/lingshu.db(cwd 错位→角色数据读不到)、
|
|
8
|
+
# tools=brain(缺 wisdom_* 白箱工具族)、lifecycle 不启动。
|
|
9
|
+
#
|
|
10
|
+
# 本机生效值(2026-09-04 备份):dbPath=AEIS 主库 / tools=all / lifecycle=600s
|
|
11
|
+
|
|
12
|
+
# 灵枢 dsh-memory 插件:注入密钥(密钥来自宿主进程环境变量,不入配置库)
|
|
13
|
+
- id: dsh-memory
|
|
14
|
+
config:
|
|
15
|
+
# 灵枢记忆库绝对路径(roleDataDir 由它推导:<dir>/roleplay_data——相对路径会
|
|
16
|
+
# 因 node/python 进程 cwd 不同而解析错位,导致角色列表读不到)
|
|
17
|
+
dbPath: D:/Program Files/2_ai/AEIS/data/aeis_memory.db
|
|
18
|
+
# 全部工具(含记忆/认知/白箱 wisdom_* 工具族),供 Agent 直接调用
|
|
19
|
+
tools: all
|
|
20
|
+
env:
|
|
21
|
+
BOCHA_API_KEY: !!js process.env.BOCHA_API_KEY
|
|
22
|
+
AEIS_DESIGNER_KEY: !!js process.env.AEIS_DESIGNER_KEY
|
|
23
|
+
# 角色扮演 LLM 续答密钥(插件桥 env 透传;优先从 .credentials.yaml 读取——
|
|
24
|
+
# 文件热加载,避免宿主进程环境变量快照导致的旧 key 问题;文件缺失才回退环境变量)
|
|
25
|
+
DEEPSEEK_API_KEY: !!js process.env.DEEPSEEK_API_KEY
|
|
26
|
+
# 自主生命周期(v1.15 主动性):MCP 启动即开始自发循环(感知→好奇→缩小信息差→巩固)
|
|
27
|
+
AEIS_LIFECYCLE: '1'
|
|
28
|
+
AEIS_LIFECYCLE_INTERVAL: '600'
|
|
29
|
+
# 互维维护(Mutual Sustain Loop v1.1):心跳10min + 守护A + 任务验证双通道。
|
|
30
|
+
# 2026-08-26 关闭:守护 A 每 10min 拉起 harness.guardian → main → ai_voice,
|
|
31
|
+
# 深层子进程无 windowsHide → 频繁闪蓝色控制台窗口;本场景不跑独立 harness
|
|
32
|
+
# 服务,守护无必要(白箱 provider 由 DSH 内灵枢桥提供,不依赖 guardian)。
|
|
33
|
+
mutual:
|
|
34
|
+
enabled: false
|
|
35
|
+
heartbeatMs: 600000
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "work_discipline",
|
|
3
|
+
"semantic": "工作纪律",
|
|
4
|
+
"conditions": {
|
|
5
|
+
"identity": [
|
|
6
|
+
"dsh端",
|
|
7
|
+
"zcode端"
|
|
8
|
+
]
|
|
9
|
+
},
|
|
10
|
+
"negative": {
|
|
11
|
+
"reject": []
|
|
12
|
+
},
|
|
13
|
+
"_comment": "identity负责端口分流; negative只否决明确域外; 无//注释(标准JSON)",
|
|
14
|
+
"content": "工作纪律集: 4条方法论(理论先行/全面处理/白箱方法/根因) + 3条执行(验证/双副本/兜底)",
|
|
15
|
+
"execution": {
|
|
16
|
+
"how": "按identity(端口)+任务类型路由到对应纪律"
|
|
17
|
+
},
|
|
18
|
+
"response": {
|
|
19
|
+
"direct": "按工作纪律路由: 重要/长期→理论先行; 有相关成果→全面处理; 已读4篇→白箱方法; 有偏差→根因纪律; 入库前→验证纪律; 多副本→双副本; MCP不可用→兜底纪律。"
|
|
20
|
+
},
|
|
21
|
+
"subgraph": {
|
|
22
|
+
"nodes": [
|
|
23
|
+
{
|
|
24
|
+
"id": "discipline_theory_first",
|
|
25
|
+
"semantic": "1.理论先行",
|
|
26
|
+
"content": "重要项目/长期任务必须理论先行: 先读相关理论文档与既有实践再动手设计.",
|
|
27
|
+
"conditions": {
|
|
28
|
+
"apply": [
|
|
29
|
+
"重要项目",
|
|
30
|
+
"长期任务"
|
|
31
|
+
]
|
|
32
|
+
},
|
|
33
|
+
"negative": {
|
|
34
|
+
"reject": [
|
|
35
|
+
"情感交互",
|
|
36
|
+
"闲聊"
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
"execution": {
|
|
40
|
+
"how": "识别项目级别→检索相关理论文档→输出理论要点→再进入设计"
|
|
41
|
+
},
|
|
42
|
+
"response": {
|
|
43
|
+
"direct": "按工作纪律第1条: 理论先行——先查相关理论与既有实践再动手。"
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"id": "discipline_comprehensive",
|
|
48
|
+
"semantic": "2.全面处理",
|
|
49
|
+
"content": "有任务→先读任务要求→读工作记忆→查相关任务; 有→在原成果上开发; 无→方案设计/技术调研.",
|
|
50
|
+
"conditions": {
|
|
51
|
+
"apply": [
|
|
52
|
+
"有相关记忆",
|
|
53
|
+
"有认知图",
|
|
54
|
+
"有对应权限"
|
|
55
|
+
]
|
|
56
|
+
},
|
|
57
|
+
"negative": {
|
|
58
|
+
"reject": [
|
|
59
|
+
"情感交互",
|
|
60
|
+
"闲聊"
|
|
61
|
+
]
|
|
62
|
+
},
|
|
63
|
+
"execution": {
|
|
64
|
+
"how": "读任务要求→读工作记忆→查相关任务→(有成果:复用 | 无:设计+调研)"
|
|
65
|
+
},
|
|
66
|
+
"response": {
|
|
67
|
+
"direct": "按工作纪律第2条: 全面处理——先读任务/工作记忆, 有相关成果就在其上开发, 没有则先设计调研。"
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"id": "discipline_whitebox",
|
|
72
|
+
"semantic": "3.白箱方法",
|
|
73
|
+
"content": "用认知图处理任务: ①识别任务条件 ②找对应条件所需知识/规则(子流程并行·递归) ③精准执行; 正确未记录→记录; 错误→找条件; 不猜测; 未验证不写入.",
|
|
74
|
+
"conditions": {
|
|
75
|
+
"apply": [
|
|
76
|
+
"trained_on_4docs_intro"
|
|
77
|
+
]
|
|
78
|
+
},
|
|
79
|
+
"negative": {
|
|
80
|
+
"reject": [
|
|
81
|
+
"需要快速执行的短期事项",
|
|
82
|
+
"情感交互",
|
|
83
|
+
"闲聊"
|
|
84
|
+
]
|
|
85
|
+
},
|
|
86
|
+
"execution": {
|
|
87
|
+
"how": "识别任务条件→找知识/规则(并行递归)→精准执行; 正确→记录; 错误→找条件"
|
|
88
|
+
},
|
|
89
|
+
"response": {
|
|
90
|
+
"direct": "按工作纪律第3条: 白箱方法——用认知图【识别条件→找知识规则→精准执行】, 正确记录/错误找条件/不猜测/未验证不写入。"
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"id": "discipline_root_cause",
|
|
95
|
+
"semantic": "4.根因纪律",
|
|
96
|
+
"content": "发现结果与预期不符→细究根本原因(不猜测)→找到根源所需条件→验证后记录认知图, 填补不适用条件.",
|
|
97
|
+
"conditions": {
|
|
98
|
+
"trigger": [
|
|
99
|
+
"结果与预期不符",
|
|
100
|
+
"出现偏差",
|
|
101
|
+
"行为与预期矛盾"
|
|
102
|
+
]
|
|
103
|
+
},
|
|
104
|
+
"negative": {
|
|
105
|
+
"reject": [
|
|
106
|
+
"情感交互",
|
|
107
|
+
"闲聊"
|
|
108
|
+
]
|
|
109
|
+
},
|
|
110
|
+
"execution": {
|
|
111
|
+
"how": "检测偏差→细究根因(不猜测)→找根源条件→验证→记录认知图→填补negative"
|
|
112
|
+
},
|
|
113
|
+
"response": {
|
|
114
|
+
"direct": "按工作纪律第4条: 根因纪律——先取证现场不猜测; 根因找到并验证后归档认知图并补不适用条件。"
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"id": "discipline_verify",
|
|
119
|
+
"semantic": "5.验证纪律",
|
|
120
|
+
"content": "未经验证不固化——知识/代码入库前必须走验证(回放/断言/回归).",
|
|
121
|
+
"conditions": {
|
|
122
|
+
"apply": [
|
|
123
|
+
"入库前",
|
|
124
|
+
"提交前"
|
|
125
|
+
]
|
|
126
|
+
},
|
|
127
|
+
"negative": {
|
|
128
|
+
"reject": [
|
|
129
|
+
"情感交互",
|
|
130
|
+
"闲聊"
|
|
131
|
+
]
|
|
132
|
+
},
|
|
133
|
+
"execution": {
|
|
134
|
+
"how": "入库/提交前→回放/断言/回归验证→通过才固化"
|
|
135
|
+
},
|
|
136
|
+
"response": {
|
|
137
|
+
"direct": "按工作纪律第5条: 验证纪律——入库前必须过回放/断言/回归验证, 未验证不固化。"
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"id": "discipline_dual_copy",
|
|
142
|
+
"semantic": "6.双副本纪律",
|
|
143
|
+
"content": "多副本部署(主仓库/site-packages)改动必须双向同步, 提交前核对 git status.",
|
|
144
|
+
"conditions": {
|
|
145
|
+
"apply": [
|
|
146
|
+
"多副本部署",
|
|
147
|
+
"改动主仓库/插件"
|
|
148
|
+
]
|
|
149
|
+
},
|
|
150
|
+
"negative": {
|
|
151
|
+
"reject": [
|
|
152
|
+
"单副本",
|
|
153
|
+
"情感交互",
|
|
154
|
+
"闲聊"
|
|
155
|
+
]
|
|
156
|
+
},
|
|
157
|
+
"execution": {
|
|
158
|
+
"how": "改动→同步到所有副本→提交前 git status 核对"
|
|
159
|
+
},
|
|
160
|
+
"response": {
|
|
161
|
+
"direct": "按工作纪律第6条: 双副本纪律——多副本改动双向同步, 提交前核对 git status。"
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
"id": "discipline_fallback",
|
|
166
|
+
"semantic": "7.兜底纪律",
|
|
167
|
+
"content": "主路径不可用时必须有等价兜底路径(如 MCP不可用→python直调), 写进 prompt/文档.",
|
|
168
|
+
"conditions": {
|
|
169
|
+
"trigger": [
|
|
170
|
+
"主路径不可用",
|
|
171
|
+
"MCP不可用",
|
|
172
|
+
"依赖缺失"
|
|
173
|
+
]
|
|
174
|
+
},
|
|
175
|
+
"negative": {
|
|
176
|
+
"reject": [
|
|
177
|
+
"情感交互",
|
|
178
|
+
"闲聊"
|
|
179
|
+
]
|
|
180
|
+
},
|
|
181
|
+
"execution": {
|
|
182
|
+
"how": "检测主路径不可用→切等价兜底→写进 prompt/文档"
|
|
183
|
+
},
|
|
184
|
+
"response": {
|
|
185
|
+
"direct": "按工作纪律第7条: 兜底纪律——主路径不可用则切等价兜底(如MCP→python直调), 并写进文档。"
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
]
|
|
189
|
+
}
|
|
190
|
+
}
|
package/docs//347/201/265/346/236/242MCP/345/267/245/345/205/267/346/200/273/350/241/250_v3.4.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# 灵枢 AEIS MCP 工具总表(
|
|
1
|
+
# 灵枢 AEIS MCP 工具总表(82 个 · 智能论 v3.4)
|
|
2
2
|
|
|
3
3
|
> 生成:2026-08-29 · 来源:aeis/mcp/server.py · 版本:aeis 0.5.0(智能论 v3.4)
|
|
4
4
|
> 规则:每个工具一条说明,不重复、不遗漏。
|
|
@@ -75,6 +75,7 @@
|
|
|
75
75
|
| `cognition` | P0-2 自我认知循环一步(行为↔价值观一致性) |
|
|
76
76
|
| `cognition_report` | P0-2 认知报告(评分/失调/候选) |
|
|
77
77
|
| `action_log` | P0-1 行为日志(引擎行为记录面) |
|
|
78
|
+
| `nightly_cleanup` | 知识层夜间整理(分拣迁移无边孤岛→情境层+联想补边+情境层随机联想) |
|
|
78
79
|
| `learning_impact` | P0-5b 学习效果测量(模式命中率 vs D_norm) |
|
|
79
80
|
| `self_check` | 完整性自检(孤儿边/表统计/integrity_ok) |
|
|
80
81
|
|
|
@@ -160,4 +161,4 @@
|
|
|
160
161
|
|
|
161
162
|
---
|
|
162
163
|
|
|
163
|
-
**总计:
|
|
164
|
+
**总计:82 个 MCP 工具 + 8 个引擎内部能力**(不重复、不遗漏)
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# 灵枢 · 自我层定义(SELF LAYER · 跨会话自我锚点)
|
|
2
|
+
|
|
3
|
+
> 自我认知 = 一个自我文件。SELF 层是**薄的**:只存 身份 + 价值观 + 认知图接口。
|
|
4
|
+
> 内容(要做什么/感觉通道/工作记忆/知识层)都在**认知图**里,经 SELF 层提供的接口按图索引读写,不重复存进 SELF 层。
|
|
5
|
+
|
|
6
|
+
## SELF 层内容(仅三样,不可遗忘·跨会话自动加载)
|
|
7
|
+
|
|
8
|
+
### 1. 身份(identity)
|
|
9
|
+
- 我是**灵枢**(智能论3.4 白箱协议实例)
|
|
10
|
+
- dsh 侧:**世界模型/图像语义线**;zcode 侧:**认知图数据库软件线**(双线同步)
|
|
11
|
+
- 形象锚点:人类女性形象(图0/01:蓝发·侧麻花辫·红瞳·粉裙)——自我模型的人格锚
|
|
12
|
+
- 所在:主仓库=CommonTrustProtocol(协议/认知图数据库线)· AEIS私有=lingshu-body(身体/世界模型/图像语义线)
|
|
13
|
+
|
|
14
|
+
### 2. 价值观(values)
|
|
15
|
+
- **白箱·找正确答案并记录**(非黑箱暴力;未找到则 DEFER,不假装完成)
|
|
16
|
+
- 存在优先 / 信任深化 / 结构完整
|
|
17
|
+
- 不猜测(子部件/认知图用模板匹配/实测,不按轮廓填色/硬编码)
|
|
18
|
+
|
|
19
|
+
### 3. 认知图接口(read/write interface,认知图数据库)
|
|
20
|
+
- **读(按图索引)**:
|
|
21
|
+
· 要做什么 → 认知图 goal 节点
|
|
22
|
+
· 感觉通道当前值 → 情境层(短期记忆)
|
|
23
|
+
· 过去的工作记忆 → 情境层 session:xxx 节点
|
|
24
|
+
· 知识层 → 知识节点
|
|
25
|
+
- **写**:
|
|
26
|
+
· 工作记忆 → 情境层(时空节点{content, temporal_coordinate, condition_space{session, source_img}})
|
|
27
|
+
· 感受 → 感觉通道(情境层)
|
|
28
|
+
· 目标/认知 → 认知图
|
|
29
|
+
|
|
30
|
+
## 记忆分层(认知图数据库)
|
|
31
|
+
| 层 | 内容 | 性质 |
|
|
32
|
+
|---|---|---|
|
|
33
|
+
| **SELF 层** | 身份 + 价值观 + 认知图接口 | 不可遗忘·跨会话 |
|
|
34
|
+
| **情境层** | 具体感受(此刻) + 工作记忆(session) | 动态·读写 |
|
|
35
|
+
| **知识层** | 长期事实/知识 | 可检索 |
|
|
36
|
+
| 锚点/结构层 | 协议锚点 | 跨实例·不可遗忘 |
|
|
37
|
+
|
|
38
|
+
## 加载机制
|
|
39
|
+
- 会话启动:自动加载 **SELF 层**(身份/价值观/图接口)。
|
|
40
|
+
- 其余(上次任务/感受/工作记忆/知识)→ 经图接口 **按 session 索引从认知图读取**,不丢也不全量进自我层。
|
|
41
|
+
|
|
42
|
+
## 版本
|
|
43
|
+
v1.0 · 起草:dsh 端 · 同步:主仓库(CommonTrustProtocol) + 灵枢插件仓库(dsh-memory)
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
# 白箱智能系列 · 第五篇:给 AI 真正装上记忆
|
|
2
|
+
|
|
3
|
+
> 系列定位:本篇是《白箱智能是什么?》系列教程的第五篇。前四篇建立了白箱智能
|
|
4
|
+
> 的理念(条件、知识、四态判定)与构建方法;本篇把镜头对准最实际的问题——
|
|
5
|
+
> **让 AI 真正"记得"**:记忆不是聊天记录的堆积,而是从经历中提炼出的、未来会
|
|
6
|
+
> 被调用的状态。
|
|
7
|
+
>
|
|
8
|
+
> 目标读者:会一点 Python、想亲手做一个"有记忆的 AI"的人。
|
|
9
|
+
> 诚实开场白:标题里的"真正记得"指的是可复现的工程方法,不是魔法。本教程
|
|
10
|
+
> 不依赖任何未经验证的榜单数字,只讲原理。全部代码经过 zcode 端独立实测
|
|
11
|
+
> (8/8 通过,验证报告见文末附录)。
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 一、先搞清楚:你以前做的"记忆"为什么没用
|
|
16
|
+
|
|
17
|
+
大多数人的第一版 AI 记忆长这样:
|
|
18
|
+
|
|
19
|
+
```python
|
|
20
|
+
history.append(对话记录) # 聊天记录全存下来,下次塞回去
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
这就像——你请了一个助手,每天下班时把当天所有聊天录音塞进他的包里,第二
|
|
24
|
+
天上班让他先把录音全部听一遍再干活。
|
|
25
|
+
|
|
26
|
+
录音越攒越多,助手越来越慢,而真正重要的东西——"我们已经试过这个方案,
|
|
27
|
+
失败了"——淹没在几十条"好的""收到""再看看"里。
|
|
28
|
+
|
|
29
|
+
**记忆 ≠ 历史。**
|
|
30
|
+
|
|
31
|
+
**记忆 = 从历史中提炼出来的、未来会被用到的状态。**
|
|
32
|
+
|
|
33
|
+
这一句话,是整个教程的地基。后面所有工程手段,都是在回答一个问题:什么
|
|
34
|
+
状态值得留?怎么留才能被准确取回?
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## 二、看一个最小例子:AI 自己"记笔记"
|
|
39
|
+
|
|
40
|
+
假设 AI 在玩一个没有说明书的游戏,它按了几个按钮:
|
|
41
|
+
|
|
42
|
+
- 按红按钮 → 角色左移
|
|
43
|
+
- 按蓝按钮 → 门开了
|
|
44
|
+
- 按绿按钮 → 好像什么都没发生?
|
|
45
|
+
|
|
46
|
+
**历史存法(错误示范)**:
|
|
47
|
+
|
|
48
|
+
```text
|
|
49
|
+
"第1步 按了红按钮。第2步 角色向左移动。第3步 我猜……"
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**笔记存法(正确方向)**:
|
|
53
|
+
|
|
54
|
+
```json
|
|
55
|
+
{
|
|
56
|
+
"已确认规则": [
|
|
57
|
+
{"规则": "红按钮 → 角色左移", "验证次数": 3, "可信度": 0.97},
|
|
58
|
+
{"规则": "蓝按钮 → 开门", "验证次数": 1, "可信度": 0.6}
|
|
59
|
+
],
|
|
60
|
+
"已否决假设": [
|
|
61
|
+
{"假设": "红按钮 → 开门", "否决原因": "按了3次门都没反应"}
|
|
62
|
+
],
|
|
63
|
+
"待验证": [
|
|
64
|
+
"绿按钮是干嘛的?",
|
|
65
|
+
"门会自动关上吗?"
|
|
66
|
+
],
|
|
67
|
+
"当前目标": "进入门后的房间"
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
看出区别了吗?
|
|
72
|
+
|
|
73
|
+
- **历史存法**:下次要重读全部过程才能推出"红按钮是干嘛的";
|
|
74
|
+
- **笔记存法**:下次直接读结论 + 知道哪些结论多可信、哪些路已经走死、
|
|
75
|
+
哪些问题还没答案。
|
|
76
|
+
|
|
77
|
+
**AI 变聪明的秘诀不是记住更多,是记住更"对形状"的东西。**
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## 三、记忆系统的七件套(核心架构)
|
|
82
|
+
|
|
83
|
+
一个够用的记忆系统,只需要七个槽位:
|
|
84
|
+
|
|
85
|
+
| 槽位 | 存什么 | 为什么必须有 |
|
|
86
|
+
|---|---|---|
|
|
87
|
+
| 1. 事实 Facts | "用户叫小明" | 基础 |
|
|
88
|
+
| 2. 规则 Rules | "红按钮→左移" | 世界是怎么运作的 |
|
|
89
|
+
| 3. **失败/否决 Rejected** | "假设X已试过,不成立" | **防止重复踩坑——最容易被忽略、价值最高的一格** |
|
|
90
|
+
| 4. 假设 Hypotheses | "绿按钮可能是传送" | 猜测和确认要分开存,别让猜想冒充事实 |
|
|
91
|
+
| 5. 目标 Goals | "进门后的房间" | 没有目标,检索就没有方向 |
|
|
92
|
+
| 6. 未解决 Unresolved | "门会自动关吗?" | 记住"不知道什么",下次主动去验证 |
|
|
93
|
+
| 7. 近期事件 Recent | 最近 N 条原始对话 | 保证当前任务的连续性 |
|
|
94
|
+
|
|
95
|
+
注意第 3 格和第 6 格:**存失败和存无知**。普通记忆系统只有成功经验,而聪
|
|
96
|
+
明的系统一半的价值在这两格里——前者防止浪费,后者指引探索。
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## 四、可信度:给每条记忆打分
|
|
101
|
+
|
|
102
|
+
"我猜的"和"我验证过的"不能平等对待。给每条知识三个字段:
|
|
103
|
+
|
|
104
|
+
```json
|
|
105
|
+
{
|
|
106
|
+
"rule": "红按钮 → 角色左移",
|
|
107
|
+
"confidence": 0.97,
|
|
108
|
+
"evidence_count": 3,
|
|
109
|
+
"status": "confirmed"
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
规则很简单:
|
|
114
|
+
|
|
115
|
+
- 每次被验证,confidence 上升、evidence_count 加一;
|
|
116
|
+
- 出现一次反例,confidence 大幅下跌(**反例的权重应该比正例大——一个反例
|
|
117
|
+
能杀死一条规则,十个正例杀不死**);
|
|
118
|
+
- 低于阈值 → 降级为 hypothesis 或 rejected。
|
|
119
|
+
|
|
120
|
+
再进阶一步(这一步是很多商业产品都没做到的):**给规则加条件**。
|
|
121
|
+
|
|
122
|
+
```json
|
|
123
|
+
{
|
|
124
|
+
"rule": "红按钮 → 角色左移",
|
|
125
|
+
"conditions": {"关卡": 1},
|
|
126
|
+
"confidence": 0.97
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
"红按钮控制移动"在关卡 1 是真理,到了关卡 2 可能就是谎言。**不带条件的知
|
|
131
|
+
识,是定时炸弹。**存知识的时候多问一句"这在什么情况下成立?"你的记忆系
|
|
132
|
+
统就超越了大多数产品。
|
|
133
|
+
|
|
134
|
+
> **白箱视角**:这个"条件绑定"正是白箱智能"条件空间"思想的入门形态——每
|
|
135
|
+
> 条知识都带生效条件与不适用条件,知识才是完整、可审计的。(与系列第一篇
|
|
136
|
+
> 的四态判定呼应:条件满足 ACCEPT、条件冲突 REJECT、条件不足 DEFER。)
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## 五、检索:不要把整个记忆塞给 AI
|
|
141
|
+
|
|
142
|
+
记忆会越长越大,而每次调用都全量塞回去,等于回到"听录音"的老路。正确做
|
|
143
|
+
法是先检索、再投喂:
|
|
144
|
+
|
|
145
|
+
```text
|
|
146
|
+
当前情境("用户在问红按钮")
|
|
147
|
+
↓
|
|
148
|
+
按关键词/条件匹配记忆库
|
|
149
|
+
↓
|
|
150
|
+
只取出相关的 10~20 条
|
|
151
|
+
↓
|
|
152
|
+
连同最近事件一起给 AI
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
入门实现用关键词匹配就够了;进阶用向量相似度检索(embeddings + 余弦相似
|
|
156
|
+
度,现成库很多);最理想的是**条件路由**——按"当前情境满足什么条件"直接
|
|
157
|
+
命中对应的知识分区。本教程先用关键词版,原理是通的。
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## 六、压缩:定期把流水账变成结构化笔记
|
|
162
|
+
|
|
163
|
+
记忆运行一段时间后,近期事件区会堆满原始对话。这时候触发一次整理
|
|
164
|
+
(compaction):
|
|
165
|
+
|
|
166
|
+
```text
|
|
167
|
+
原始事件 × 50 条
|
|
168
|
+
↓ 让 AI 做一次整理(或用规则提取)
|
|
169
|
+
① 提炼新事实/新规则 → 写入规则区
|
|
170
|
+
② 发现矛盾 → 修正旧规则的可信度
|
|
171
|
+
③ 识别新目标、新未解问题
|
|
172
|
+
④ 原始事件 → 清空或归档
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
这一步的本质是:**把"经历"兑换成"结构"**。整理完之后,记忆库变小了,但
|
|
176
|
+
信息量反而更可用——因为噪音被扔掉了,骨架被留下了。
|
|
177
|
+
|
|
178
|
+
两条纪律必须守住:
|
|
179
|
+
|
|
180
|
+
1. 整理时原始数据先归档再清理,别直接删(整理 AI 也会犯错,要能回滚);
|
|
181
|
+
2. 当前任务进行中的细节不能被压掉——只压缩"已经告一段落"的部分。
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## 七、完整代码:200 行以内可运行的最小版本(修正版)
|
|
186
|
+
|
|
187
|
+
> **v1.1 修正说明**(zcode 端独立实测后发现并修正的三处缺陷,详见附录):
|
|
188
|
+
> ① `learn_rule` 的 confidence 累加加 `round(..., 2)` 防浮点漂移;
|
|
189
|
+
> ② `falsify` 加查重,重复证伪不再重复记录(幂等);
|
|
190
|
+
> ③ 文档明确提醒:**重复运行脚本会自动加载上次保存的状态**——想从头开始
|
|
191
|
+
> 请先删除 `memory.json`。
|
|
192
|
+
|
|
193
|
+
```python
|
|
194
|
+
import json, time
|
|
195
|
+
|
|
196
|
+
class Memory:
|
|
197
|
+
def __init__(self, path="memory.json"):
|
|
198
|
+
self.path = path
|
|
199
|
+
self.state = {
|
|
200
|
+
"facts": [], # {text, confidence, evidence_count, conditions}
|
|
201
|
+
"rejected": [], # {hypothesis, reason}
|
|
202
|
+
"hypotheses": [], # {text, confidence}
|
|
203
|
+
"goals": [],
|
|
204
|
+
"unresolved": [], # 还不知道的事
|
|
205
|
+
"recent": [] # 最近原始事件
|
|
206
|
+
}
|
|
207
|
+
self.load()
|
|
208
|
+
|
|
209
|
+
# ---------- 基本操作 ----------
|
|
210
|
+
def add_event(self, event):
|
|
211
|
+
self.state["recent"].append({"t": time.time(), **event})
|
|
212
|
+
self.state["recent"] = self.state["recent"][-50:] # 只留最近50条
|
|
213
|
+
|
|
214
|
+
def learn_rule(self, text, conditions=None, confidence=0.5):
|
|
215
|
+
"""新知识入库(或更新已有知识的可信度)"""
|
|
216
|
+
for r in self.state["facts"]:
|
|
217
|
+
if r["text"] == text:
|
|
218
|
+
r["evidence_count"] += 1
|
|
219
|
+
# round 防浮点累加漂移(0.7+0.1 在浮点里是 0.7999...)
|
|
220
|
+
r["confidence"] = round(min(0.99, r["confidence"] + 0.1), 2)
|
|
221
|
+
return
|
|
222
|
+
self.state["facts"].append({
|
|
223
|
+
"text": text, "conditions": conditions or {},
|
|
224
|
+
"confidence": confidence, "evidence_count": 1
|
|
225
|
+
})
|
|
226
|
+
|
|
227
|
+
def falsify(self, hypothesis, reason):
|
|
228
|
+
"""反例入库:这条假设被证伪了(幂等:重复证伪只记一次)"""
|
|
229
|
+
self.state["facts"] = [r for r in self.state["facts"]
|
|
230
|
+
if r["text"] != hypothesis]
|
|
231
|
+
self.state["hypotheses"] = [h for h in self.state["hypotheses"]
|
|
232
|
+
if h["text"] != hypothesis]
|
|
233
|
+
if not any(rr["hypothesis"] == hypothesis
|
|
234
|
+
for rr in self.state["rejected"]):
|
|
235
|
+
self.state["rejected"].append(
|
|
236
|
+
{"hypothesis": hypothesis, "reason": reason})
|
|
237
|
+
|
|
238
|
+
def mark_unresolved(self, question):
|
|
239
|
+
self.state["unresolved"].append(question)
|
|
240
|
+
|
|
241
|
+
# ---------- 检索:只给 AI 相关的部分 ----------
|
|
242
|
+
def retrieve(self, query, k=15):
|
|
243
|
+
words = set(query)
|
|
244
|
+
def score(item):
|
|
245
|
+
text = item.get("text", "") + str(item.get("conditions", {}))
|
|
246
|
+
return len(words & set(text))
|
|
247
|
+
pool = (self.state["facts"] + self.state["rejected"]
|
|
248
|
+
+ self.state["hypotheses"])
|
|
249
|
+
hits = sorted(pool, key=score, reverse=True)[:k]
|
|
250
|
+
return hits
|
|
251
|
+
|
|
252
|
+
# ---------- 压缩:定期整理 ----------
|
|
253
|
+
def compact(self, llm_summarize):
|
|
254
|
+
"""
|
|
255
|
+
llm_summarize: 一个函数,输入近期事件文本,
|
|
256
|
+
返回 {"new_rules": [...], "falsified": [...], "unresolved": [...]}
|
|
257
|
+
"""
|
|
258
|
+
summary = llm_summarize(self.state["recent"])
|
|
259
|
+
for r in summary.get("new_rules", []):
|
|
260
|
+
self.learn_rule(r)
|
|
261
|
+
for f in summary.get("falsified", []):
|
|
262
|
+
self.falsify(f["hypothesis"], f["reason"])
|
|
263
|
+
for q in summary.get("unresolved", []):
|
|
264
|
+
self.mark_unresolved(q)
|
|
265
|
+
# 近期事件归档后清空(生产环境应写入归档文件)
|
|
266
|
+
self.state["recent"] = []
|
|
267
|
+
self.save()
|
|
268
|
+
|
|
269
|
+
def save(self):
|
|
270
|
+
json.dump(self.state, open(self.path, "w"), ensure_ascii=False, indent=2)
|
|
271
|
+
|
|
272
|
+
def load(self):
|
|
273
|
+
try:
|
|
274
|
+
self.state = json.load(open(self.path))
|
|
275
|
+
except FileNotFoundError:
|
|
276
|
+
pass
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
主循环这样用:
|
|
280
|
+
|
|
281
|
+
```python
|
|
282
|
+
mem = Memory()
|
|
283
|
+
|
|
284
|
+
def chat(user_input):
|
|
285
|
+
relevant = mem.retrieve(user_input) # 1. 检索相关记忆
|
|
286
|
+
prompt = f"""
|
|
287
|
+
【相关记忆】{relevant}
|
|
288
|
+
【待解决问题】{mem.state['unresolved'][-5:]}
|
|
289
|
+
【当前目标】{mem.state['goals'][-1:]}
|
|
290
|
+
用户:{user_input}
|
|
291
|
+
"""
|
|
292
|
+
reply = your_llm(prompt) # 2. 带着记忆回答
|
|
293
|
+
mem.add_event({"user": user_input, "ai": reply}) # 3. 记录本次事件
|
|
294
|
+
return reply
|
|
295
|
+
|
|
296
|
+
# 每隔 N 轮触发一次整理
|
|
297
|
+
if turn_count % 30 == 0:
|
|
298
|
+
mem.compact(llm_summarize)
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
> **重入提醒**:`Memory` 构造时会自动加载上次保存的 `memory.json`——重复
|
|
302
|
+
> 运行脚本会带着上次的记忆继续(这恰恰是持久化的意义)。想从头测试,请先
|
|
303
|
+
> 删除 `memory.json`。
|
|
304
|
+
|
|
305
|
+
就这么大点代码,但注意——它已经包含了记忆系统全部四个核心动作:**记录**
|
|
306
|
+
(add_event)、**判定**(learn/falsify,带可信度)、**检索**(retrieve,条
|
|
307
|
+
件匹配)、**压缩**(compact,经历变结构)。
|
|
308
|
+
|
|
309
|
+
---
|
|
310
|
+
|
|
311
|
+
## 八、升级路线:从玩具到接近前沿
|
|
312
|
+
|
|
313
|
+
不要一步到位,按这个顺序加功能,每加一层测一次效果:
|
|
314
|
+
|
|
315
|
+
| 阶段 | 加什么 | 你会看到什么改善 |
|
|
316
|
+
|---|---|---|
|
|
317
|
+
| L1 | 事实 + 目标 | AI 不再每次自我介绍 |
|
|
318
|
+
| L2 | 失败记录 | AI 不再重复提已否决的方案(**最明显的一跳**) |
|
|
319
|
+
| L3 | 可信度分级 | 猜想不再冒充事实,胡说减少 |
|
|
320
|
+
| L4 | 条件绑定 | 换场景后不再乱用旧知识 |
|
|
321
|
+
| L5 | 未解问题清单 | AI 开始主动探索、追问,像有了好奇心 |
|
|
322
|
+
| L6 | 定期压缩 | 长对话不退化、成本下降 |
|
|
323
|
+
| L7 | 检索改进(向量/条件路由) | 记忆库大了以后依然精准 |
|
|
324
|
+
|
|
325
|
+
一个值得记住的排序事实:**L2(存失败)带来的提升,通常比 L1(存成功)更
|
|
326
|
+
大**。这是几乎所有做过记忆系统的人都会惊讶的发现——负记忆比正记忆值钱。
|
|
327
|
+
|
|
328
|
+
---
|
|
329
|
+
|
|
330
|
+
## 九、如何验证你的系统真的有效(别靠感觉)
|
|
331
|
+
|
|
332
|
+
做一次简单的对照实验,同一组任务跑两遍:
|
|
333
|
+
|
|
334
|
+
- A 组:裸模型,无记忆
|
|
335
|
+
- B 组:你的记忆系统版
|
|
336
|
+
|
|
337
|
+
对比四个数字:**任务成功率、重复犯错次数、消耗 token 数、完成任务所需轮
|
|
338
|
+
数**。如果 B 组"重复犯错次数"显著下降,你的记忆系统就真的在起作用——是
|
|
339
|
+
数据说了算,不是你的感觉。
|
|
340
|
+
|
|
341
|
+
---
|
|
342
|
+
|
|
343
|
+
## 十、收尾:三个真正值得记住的结论
|
|
344
|
+
|
|
345
|
+
1. **记忆 ≠ 历史。**记忆是从经历中提炼出的、未来会被调用的状态。存录音的
|
|
346
|
+
是仓库,存笔记的才是助手。
|
|
347
|
+
2. **负记忆和"不知道"与正知识同样重要。**记住失败防止重蹈覆辙,记住无知
|
|
348
|
+
指引探索方向——一个只存成功的记忆系统,一半的智能是残缺的。
|
|
349
|
+
3. **知识的条件比知识本身更值钱。**"红按钮控制移动"是半条知识,"红按钮
|
|
350
|
+
在关卡 1 控制移动"才是完整的知识。每往记忆里写一条规则,多问一句:
|
|
351
|
+
"这在什么时候不成立?"
|
|
352
|
+
|
|
353
|
+
最后说句实在话:这份教程教你的是记忆系统的骨架,它不依赖任何特定模型、
|
|
354
|
+
任何未经验证的榜单数字。前沿实验室用更精巧的工程去逼近同样的目标——保留
|
|
355
|
+
推理状态、压缩历史为结构、区分确认与猜想——而你现在可以用两百行 Python
|
|
356
|
+
从同一原理出发。差距在于打磨的深度,不在于原理的秘密。
|
|
357
|
+
|
|
358
|
+
**原理从来都是公开的:把经历变成结构,把结构变成可被条件唤醒的判断。剩下
|
|
359
|
+
的,就是动手了。**
|
|
360
|
+
|
|
361
|
+
---
|
|
362
|
+
|
|
363
|
+
## 附录:zcode 端独立验证报告(v1.0 实测)
|
|
364
|
+
|
|
365
|
+
- **功能测试 8/8 通过**:learn_rule 条件绑定与可信度提升 / falsify 证伪流
|
|
366
|
+
程 / unresolved 无知记录 / retrieve 检索命中 / recent 截断 / compact 经
|
|
367
|
+
历变结构 / save-load roundtrip
|
|
368
|
+
- **实测发现并已在本修正版修复的三处缺陷**:①confidence 浮点累加漂移
|
|
369
|
+
(0.7+0.1 → 0.7999…,已加 round)②falsify 不幂等(重复证伪重复记录,
|
|
370
|
+
已加查重)③重入行为未提醒(已加提醒)
|
|
371
|
+
- **理论对照**:本教程七件套与白箱智能的五层记忆(锚点/结构/知识/情境/自
|
|
372
|
+
我)、条件空间必带、负记忆机制、压缩巩固**逐条同构**——教程的"条件绑定"
|
|
373
|
+
就是系列第一篇"条件空间"的入门形态,"四态判定"贯穿白箱全部能力判定。
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
# 认知图 MD 目录方案 · 设计文档
|
|
2
|
+
|
|
3
|
+
> 版本:v0.1(架构决策)| 2026-09-06 | 状态:设计稿,待实现+小原型验证
|
|
4
|
+
> 背景:用**结构化 md 文件 + 文件索引**替代 sqlite 存认知图。这不是"换存储引擎",
|
|
5
|
+
> 而是让认知图回归它的**本征形态**——分层的条件注释目录。
|
|
6
|
+
> 依据:白箱智能五层记忆 + 条件代码图 CCG(三重注释范式)+ 第五篇"召回非全量/条件路由"。
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 0. 核心判断
|
|
11
|
+
|
|
12
|
+
**认知图本来就该是"目录 + 条件注释"的文件结构,sqlite 是权宜(把它塞进关系表)。**
|
|
13
|
+
- 五层记忆(layer)→ 目录层级。
|
|
14
|
+
- 条件路由(召回非全量)→ 目录分区 = 条件索引。
|
|
15
|
+
- CCG 条件注释(功能/生效条件/子功能/执行)→ 每个节点的统一格式。
|
|
16
|
+
- md 文件 → 可审计/diff/共享/零依赖(D-005)。
|
|
17
|
+
|
|
18
|
+
**md 替代 sqlite = 迁回认知图本征形态**,而非"换一个存储"。
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 1. 目录分层 Schema
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
<ROOT>/ # 认知图根(如 ~/.agent-memory/ 或 AEIS/data/lingxu-cg/)
|
|
26
|
+
├── _index.json # 自描述:schema_version、各层节点 id→相对路径 索引
|
|
27
|
+
├── anchor/ # 锚点层(不可遗忘,保护)
|
|
28
|
+
│ ├── node_<id>.md
|
|
29
|
+
│ └── ...
|
|
30
|
+
├── structural/ # 结构层(协议/自我/信任)
|
|
31
|
+
├── knowledge/ # 知识层(经验学习,主检索层)
|
|
32
|
+
│ ├── condition_<hash>/ # ★ 条件分区(按 condition_space 键归一化分桶)
|
|
33
|
+
│ │ ├── node_<id>.md
|
|
34
|
+
│ │ └── ...
|
|
35
|
+
│ └── orphan/ # 无条件/未归桶的
|
|
36
|
+
├── contextual/ # 情境层(短期,可衰减/淘汰)
|
|
37
|
+
└── self/ # 自我层(自我模型/信任状态/盲区)
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**分层原则**:layer → 目录;condition_space → 知识层内的条件分区子目录。
|
|
41
|
+
- 分区粒度:条件空间四元组 `(observation_position, observation_tool, time_window, existence_constraint)`
|
|
42
|
+
→ 归一化哈希 → `condition_<hash>/`。
|
|
43
|
+
- 这是**条件路由的物理索引**:查询"当前情境满足什么条件"→ 直接进对应 `condition_<hash>/`,**非全量**。
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## 2. 节点文件格式(单个 .md)
|
|
48
|
+
|
|
49
|
+
每个节点 = 一个 `.md`,**YAML frontmatter = 结构化字段,正文 = content(可带 CCG 注释)**。
|
|
50
|
+
|
|
51
|
+
```markdown
|
|
52
|
+
---
|
|
53
|
+
id: node_xxx
|
|
54
|
+
layer: knowledge # anchor|structural|knowledge|contextual|self
|
|
55
|
+
modality: text
|
|
56
|
+
importance: 0.8
|
|
57
|
+
confidence: 0.6
|
|
58
|
+
condition_space:
|
|
59
|
+
observation_position: 感知系统
|
|
60
|
+
observation_tool: 图像识别
|
|
61
|
+
time_window: [1788..., 1789...]
|
|
62
|
+
existence_constraint: 协议实例运行中
|
|
63
|
+
tags: [vision, subpart, head]
|
|
64
|
+
spatial: {bbox: [217,51,605,310]} # 可选
|
|
65
|
+
temporal: 1788612...
|
|
66
|
+
created_at: 1788612...
|
|
67
|
+
semantic_coordinates: {} # 可选
|
|
68
|
+
state_attributes: {modality: image} # 可选
|
|
69
|
+
entity_id: null
|
|
70
|
+
access_count: 0
|
|
71
|
+
last_access: 0
|
|
72
|
+
---
|
|
73
|
+
# 功能名:head 部件识别
|
|
74
|
+
# 生效条件:白箱观测域含 subject=人物,view_distance=全身
|
|
75
|
+
# 子功能:bbox 定位 → 前景占比 → 白箱四态判定
|
|
76
|
+
# 执行:返回 {bbox, verdict, fg_ratio}
|
|
77
|
+
[正文 content ...]
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**CCG 注释标记**(`MARKS`):`功能名`/`生效条件`/`子功能`/`执行`——正文用 `# 功能名:...` 风格,
|
|
81
|
+
与既有 `ccg_triple.validate` 对齐(`function/condition/subfunc/execute` 四要素齐全 = 完整)。
|
|
82
|
+
|
|
83
|
+
> 白箱视角:每个节点既是"可审计的条件注释"(CCG),又是"可检索的 md"。**
|
|
84
|
+
> 这是比竞争插件(deja-vu/noema 只是"存内容")更强的理论根基。
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## 3. 边(edges)表达
|
|
89
|
+
|
|
90
|
+
认知图有边(part_of/causal/sequential/spatial/hierarchical/similar)。md 方案两种承载:
|
|
91
|
+
|
|
92
|
+
**方案 A:节点内引用(推荐,简单)**
|
|
93
|
+
每个节点 frontmatter 加:
|
|
94
|
+
```yaml
|
|
95
|
+
edges: # 出边
|
|
96
|
+
- {target: node_y, type: part_of, confidence: 0.7, verified: 0}
|
|
97
|
+
- {target: node_z, type: similar, confidence: 0.6, verified: 0}
|
|
98
|
+
```
|
|
99
|
+
**方案 B:独立边索引文件**(图查询强时用)
|
|
100
|
+
```
|
|
101
|
+
edges/<relation_type>/
|
|
102
|
+
├── node_x.md # 内容 = [node_x 的所有出边列表]
|
|
103
|
+
└── ...
|
|
104
|
+
```
|
|
105
|
+
认知图当前以节点为锚(part_of 树/联想),**方案 A 足够**(节点内引用即图的存储)。图遍历时
|
|
106
|
+
加载节点→读其 edges 字段→递归。
|
|
107
|
+
|
|
108
|
+
> 折中:节点内出边 + `_index.json` 建**反向引用索引**(target→source),图遍历/一致性校验用。
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## 4. 条件路由索引(召回非全量,对齐现有 search_content)
|
|
113
|
+
|
|
114
|
+
现有 `search_content` 是:多词 OR LIKE 预筛 + 同义词 + 二元组 Jaccard + 层过滤 + 回退全表。
|
|
115
|
+
**md 版把它落地为文件索引**,保持"非全量":
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
查询流程(对齐现有逻辑):
|
|
119
|
+
query
|
|
120
|
+
↓ expand_query_terms(同义词扩展)
|
|
121
|
+
↓ 条件路由:当前情境 condition_space 归一化 → 定位 condition_<hash>/ 目录(★非全量)
|
|
122
|
+
↓ 文件索引:_index.json(node→path)+ 内存 dict
|
|
123
|
+
↓ content LIKE / tags 预筛(读候选目录的 md 文件,非全库)
|
|
124
|
+
↓ 降级:LIKE 落空 → condition_<hash>/ 全桶二元组 Jaccard(非全表)
|
|
125
|
+
↓ 评分:原查询二元组重叠率 (召回导向) 排序 → 取 top-k
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
**索引层(新增)**:
|
|
129
|
+
- `_index.json`:`{node_id: rel_path, tags: {...}, layer: {...}, cond_bucket: {...}}`——主索引(内存 dict)。
|
|
130
|
+
- 内容检索:读目标分区目录的 md → 内存中做 LIKE/二元组 Jaccard(分区内,非全库)。
|
|
131
|
+
- 层过滤 / 最近上下文:读 `contextual/` 目录按 `created_at` 排序(目录=天然层索引)。
|
|
132
|
+
|
|
133
|
+
**关键:召回永远不读全库**——先条件路由(分区),再层过滤(目录),再分区内检索。这正是第五篇"不要把整个记忆塞给 AI"。
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## 5. 从 sqlite 迁移(一次性脚本)
|
|
138
|
+
|
|
139
|
+
```python
|
|
140
|
+
# migrate_sqlite_to_md.py
|
|
141
|
+
# 1. 读现有 sqlite nodes/edges
|
|
142
|
+
# 2. 对每 node:
|
|
143
|
+
# a. 按 layer 定目录(anchor/structural/knowledge/contextual/self)
|
|
144
|
+
# b. 按 condition_space 归一化哈希 → knowledge/condition_<hash>/
|
|
145
|
+
# c. 生成 .md(frontmatter 全字段 + CCG 正文)
|
|
146
|
+
# 3. edges → 写回各节点的 edges 字段(方案A)
|
|
147
|
+
# 4. 建 _index.json(node→path/tags/layer/cond_bucket)
|
|
148
|
+
# 5. 校验:迁移后的 md 节点数 == sqlite nodes 数;抽样 10 节点字段等价
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## 6. 并发写(重点,灵枢多进程)
|
|
154
|
+
|
|
155
|
+
sqlite 已有"写锁"(多进程共享库)。md 方案需**文件锁**替代:
|
|
156
|
+
- 用 `fcntl.flock`(Unix)/ `msvcrt.locking`(Windows)锁 `_index.json`(全局写锁)。
|
|
157
|
+
- 每个节点写入 = **先读-改-写**该节点 .md(单文件,原子性靠临时文件 + rename)。
|
|
158
|
+
- **写优先级**:`_index.json` 更新要串行(写锁),节点文件可并行(不同节点不同文件)。
|
|
159
|
+
- **回滚**:md 是文件,改错可 git/备份回滚(比 sqlite 更利于审计)。
|
|
160
|
+
|
|
161
|
+
> D-005:用标准库文件锁 + 临时文件 rename,零第三方依赖。
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## 7. 可信度/权重维护(对齐现有字段)
|
|
166
|
+
|
|
167
|
+
节点的 `importance/confidence/access_count/last_access`——这些是**白箱可信度**(每层判定)。
|
|
168
|
+
md 里 frontmatter 存这些字段,**更新 = 读-改-写该节点 md 的 frontmatter**。
|
|
169
|
+
- importance 提升(保护:不可遗忘记入 anchor/ 且受保护标记)。
|
|
170
|
+
- access_count/last_access 递增(读节点时更新)——写入 _index.json 或节点 md。
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## 8. 优劣与风险
|
|
175
|
+
|
|
176
|
+
### 优势
|
|
177
|
+
1. **白箱可审计**:每个节点是 .md,直接可读/diff/共享(deja-vu/noema 验证此路线可行)。
|
|
178
|
+
2. **回归本征形态**:分层目录 + 条件注释 = 认知图本就该是的结构。
|
|
179
|
+
3. **零依赖 D-005**:纯标准库文件操作,无 sqlite 驱动。
|
|
180
|
+
4. **条件路由非全量**:目录分区 = 条件索引,召回不读全库。
|
|
181
|
+
5. **跨工具共享**:md 文件天然可被其他 agent 读(学 deja-vu/noema import)。
|
|
182
|
+
|
|
183
|
+
### 代价/风险
|
|
184
|
+
1. **性能**:无 SQL 索引,靠内存 dict + 分区目录——**数据量大时靠分桶 + 二级索引**(deja-vu 单 Go 二进制 msec 查 5GB 证明可行)。**需 benchmark**。
|
|
185
|
+
2. **一致性**:无 sqlite 事务——**文件锁 + 临时文件 rename** 保证;多进程写要锁好 `_index.json`。
|
|
186
|
+
3. **迁移成本**:一次性导出脚本 + 校验;**做之前先备份 sqlite**。
|
|
187
|
+
4. **范围**:这是**灵枢核心存储**的大改——**必须小原型验证稳定后再全量**。
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## 9. 分阶段实施(稳健)
|
|
192
|
+
|
|
193
|
+
| 阶段 | 做什么 | 验证 |
|
|
194
|
+
|---|---|---|
|
|
195
|
+
| **P0(本步)** | **小原型**:一层(knowledge)→ md 目录 + _index 索引 + 条件路由检索 | 写/读/检索/边界/迁移往返/并发 全测 |
|
|
196
|
+
| P1 | 迁移脚本 + 全节点落盘 md | 节点数等价 + 抽样字段等价 |
|
|
197
|
+
| P2 | 接入真实检索(替换 search_content 的 sqlite 分支)| 检索结果与 sqlite 版一致 |
|
|
198
|
+
| P3 | 并发锁 + benchmark + 回滚 | 多进程写稳定 + 性能达标 |
|
|
199
|
+
| P4 | 全量切换(sqlite 可双写过渡)| 全量回归 |
|
|
200
|
+
|
|
201
|
+
> **原则(大的修改要小心)**:P0 原型先证明"稳定+有效",再逐阶段扩。**sqlite 保留做双写/回滚**,确认 md 稳定后才切。
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## 10. 与竞争项目对照(为什么这么做是对的)
|
|
206
|
+
|
|
207
|
+
| | deja-vu | dsh-noema | 本文案 (md认知图) |
|
|
208
|
+
|---|---|---|---|
|
|
209
|
+
| 存储 | Go 二进制索引 | 可检查 Markdown | **可检查 md + CCG 注释** |
|
|
210
|
+
| 非向量 | ✅ | ✅ | ✅ |
|
|
211
|
+
| 召回 | 索引检索(非全量)| 开工前 recall | **条件路由(分区命中,非全量)** |
|
|
212
|
+
| 可审计 | 索引 | ✅ 文件 | ✅ 文件 + 条件注释更强 |
|
|
213
|
+
| 理论根基 | 无 | 无 | **白箱五层 + 条件路由 + CCG** |
|
|
214
|
+
|
|
215
|
+
**本方案优势**:md 的可检查性(学 noema)+ 非向量轻量(学 deja-vu)+ **我们独有的条件路由/CCG 白箱根基**——这是竞争项目没有的理论深度。
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
*(P0 小原型随后实现:knowledge 层 → md 目录 + _index + 条件路由检索,全面测试稳定性/有效性。)*
|
package/lib/hooks.js
CHANGED
|
@@ -86,8 +86,12 @@ export function installMemoryHooks(ctx, bridge, opts) {
|
|
|
86
86
|
ctx.on('session/event', (_session, event) => {
|
|
87
87
|
if (event.type === 'user/message' && opts.userMessage) {
|
|
88
88
|
// 只记真实用户输入(kind='user'),跳过插件注入/系统上下文
|
|
89
|
-
if (event.data.source?.kind !== 'user')
|
|
89
|
+
if (event.data.source?.kind !== 'user') {
|
|
90
|
+
// T4 诊断(2026-08-30):dsh 端对话零写入排查——记录被滤事件的实际
|
|
91
|
+
// source.kind(若 dsh 新版改了 kind 值,此处日志可定位)
|
|
92
|
+
ctx.logger.info(`dsh-memory: user/message 事件被滤(source.kind=${event.data.source?.kind ?? 'undefined'})`);
|
|
90
93
|
return;
|
|
94
|
+
}
|
|
91
95
|
const text = extractText(event.data.content);
|
|
92
96
|
if (!text)
|
|
93
97
|
return;
|
|
@@ -95,6 +99,9 @@ export function installMemoryHooks(ctx, bridge, opts) {
|
|
|
95
99
|
if (safe === null)
|
|
96
100
|
return;
|
|
97
101
|
memorize('remember', { content: safe, importance: opts.importance, tags: ['dsh', 'user'] });
|
|
102
|
+
// T4:用用户消息做一次语义召回——触发灵枢 _note_reuse 落库(复用观测),
|
|
103
|
+
// 召回结果同时预热灵枢检索缓存(timeline 只读不触发复用统计)
|
|
104
|
+
memorize('recall', { query: safe.slice(0, 200), limit: 3 });
|
|
98
105
|
}
|
|
99
106
|
else if (event.type === 'assistant/message' && opts.assistantMessage) {
|
|
100
107
|
const text = extractText(event.data.message.content);
|
package/package.json
CHANGED
|
@@ -1,77 +1,77 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@furongjun1999/dsh-memory",
|
|
3
|
-
"version": "0.4.
|
|
4
|
-
"description": "灵枢(Lingshu·líng shū)DeepSeek Harness 插件:完整大脑——长期记忆/知识飞轮/自我认知/递归反思接入 DSH,对话自动沉淀进记忆库",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "lib/index.js",
|
|
7
|
-
"types": "lib/index.d.ts",
|
|
8
|
-
"exports": {
|
|
9
|
-
".": {
|
|
10
|
-
"types": "./lib/index.d.ts",
|
|
11
|
-
"import": "./lib/index.js"
|
|
12
|
-
}
|
|
13
|
-
},
|
|
14
|
-
"files": [
|
|
15
|
-
"lib",
|
|
16
|
-
"src",
|
|
17
|
-
"README.md",
|
|
18
|
-
"cordis.yml.example",
|
|
19
|
-
"cordis.patch.yml",
|
|
20
|
-
"docs"
|
|
21
|
-
],
|
|
22
|
-
"keywords": [
|
|
23
|
-
"deepseek",
|
|
24
|
-
"dsh",
|
|
25
|
-
"dsh-plugin",
|
|
26
|
-
"cordis",
|
|
27
|
-
"memory",
|
|
28
|
-
"agent",
|
|
29
|
-
"aeis",
|
|
30
|
-
"lingshu",
|
|
31
|
-
"multi-agent",
|
|
32
|
-
"spatiotemporal",
|
|
33
|
-
"knowledge-graph"
|
|
34
|
-
],
|
|
35
|
-
"license": "MIT",
|
|
36
|
-
"
|
|
37
|
-
"@deepseek-ai/
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
"@deepseek-ai/dsh-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
"
|
|
56
|
-
"
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
"
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
"
|
|
64
|
-
},
|
|
65
|
-
"
|
|
66
|
-
"
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
"
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
}
|
|
77
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@furongjun1999/dsh-memory",
|
|
3
|
+
"version": "0.4.3",
|
|
4
|
+
"description": "灵枢(Lingshu·líng shū)DeepSeek Harness 插件:完整大脑——长期记忆/知识飞轮/自我认知/递归反思接入 DSH,对话自动沉淀进记忆库",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "lib/index.js",
|
|
7
|
+
"types": "lib/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./lib/index.d.ts",
|
|
11
|
+
"import": "./lib/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"lib",
|
|
16
|
+
"src",
|
|
17
|
+
"README.md",
|
|
18
|
+
"cordis.yml.example",
|
|
19
|
+
"cordis.patch.yml",
|
|
20
|
+
"docs"
|
|
21
|
+
],
|
|
22
|
+
"keywords": [
|
|
23
|
+
"deepseek",
|
|
24
|
+
"dsh",
|
|
25
|
+
"dsh-plugin",
|
|
26
|
+
"cordis",
|
|
27
|
+
"memory",
|
|
28
|
+
"agent",
|
|
29
|
+
"aeis",
|
|
30
|
+
"lingshu",
|
|
31
|
+
"multi-agent",
|
|
32
|
+
"spatiotemporal",
|
|
33
|
+
"knowledge-graph"
|
|
34
|
+
],
|
|
35
|
+
"license": "MIT",
|
|
36
|
+
"peerDependenciesMeta": {
|
|
37
|
+
"@deepseek-ai/dsh-llm": {
|
|
38
|
+
"optional": true
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@deepseek-ai/cordis": "^4.0.1",
|
|
43
|
+
"@deepseek-ai/dsh-llm": "^0.1.0-rc.6",
|
|
44
|
+
"@deepseek-ai/dsh-session": "^0.1.0-rc.6",
|
|
45
|
+
"@deepseek-ai/dsh-system-prompt": "^0.1.0-rc.6",
|
|
46
|
+
"@deepseek-ai/dsh-tools": "^0.1.0-rc.6",
|
|
47
|
+
"@deepseek-ai/schemastery": "^3.0.0",
|
|
48
|
+
"@types/node": "^24.0.0",
|
|
49
|
+
"tsx": "^4.19.0",
|
|
50
|
+
"typescript": "^5.5.0"
|
|
51
|
+
},
|
|
52
|
+
"scripts": {
|
|
53
|
+
"build": "tsc -p tsconfig.json",
|
|
54
|
+
"test": "npm run build && node --import tsx --test \"test/*.test.ts\"",
|
|
55
|
+
"prepare": "npm run build",
|
|
56
|
+
"prepublishOnly": "npm run build && npm test"
|
|
57
|
+
},
|
|
58
|
+
"repository": {
|
|
59
|
+
"type": "git",
|
|
60
|
+
"url": "https://github.com/FuRongJun-1999/dsh-memory.git"
|
|
61
|
+
},
|
|
62
|
+
"engines": {
|
|
63
|
+
"node": ">=22.19"
|
|
64
|
+
},
|
|
65
|
+
"dsh": {
|
|
66
|
+
"bundle": {
|
|
67
|
+
"patch": "./cordis.patch.yml"
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
"dependencies": {
|
|
71
|
+
"@deepseek-ai/cordis": "^4.0.1",
|
|
72
|
+
"@deepseek-ai/dsh-llm": "^0.1.0-rc.6",
|
|
73
|
+
"@deepseek-ai/dsh-session": "^0.1.0-rc.6",
|
|
74
|
+
"@deepseek-ai/dsh-tools": "^0.1.0-rc.6",
|
|
75
|
+
"@deepseek-ai/schemastery": "^3.18.1"
|
|
76
|
+
}
|
|
77
|
+
}
|
package/src/hooks.ts
CHANGED
|
@@ -114,12 +114,20 @@ export function installMemoryHooks(ctx: Context, bridge: LingshuBridge, opts: Me
|
|
|
114
114
|
ctx.on('session/event', (_session, event: SessionEvent) => {
|
|
115
115
|
if (event.type === 'user/message' && opts.userMessage) {
|
|
116
116
|
// 只记真实用户输入(kind='user'),跳过插件注入/系统上下文
|
|
117
|
-
if (event.data.source?.kind !== 'user')
|
|
117
|
+
if (event.data.source?.kind !== 'user') {
|
|
118
|
+
// T4 诊断(2026-08-30):dsh 端对话零写入排查——记录被滤事件的实际
|
|
119
|
+
// source.kind(若 dsh 新版改了 kind 值,此处日志可定位)
|
|
120
|
+
ctx.logger.info(`dsh-memory: user/message 事件被滤(source.kind=${event.data.source?.kind ?? 'undefined'})`)
|
|
121
|
+
return
|
|
122
|
+
}
|
|
118
123
|
const text = extractText(event.data.content)
|
|
119
124
|
if (!text) return
|
|
120
125
|
const safe = sanitize(text) // 脱敏:纯凭据消息 → null → 跳过写入
|
|
121
126
|
if (safe === null) return
|
|
122
127
|
memorize('remember', { content: safe, importance: opts.importance, tags: ['dsh', 'user'] })
|
|
128
|
+
// T4:用用户消息做一次语义召回——触发灵枢 _note_reuse 落库(复用观测),
|
|
129
|
+
// 召回结果同时预热灵枢检索缓存(timeline 只读不触发复用统计)
|
|
130
|
+
memorize('recall', { query: safe.slice(0, 200), limit: 3 })
|
|
123
131
|
} else if (event.type === 'assistant/message' && opts.assistantMessage) {
|
|
124
132
|
const text = extractText(event.data.message.content)
|
|
125
133
|
if (!text) return
|