liquid-loop 1.4.0__tar.gz → 1.8.2__tar.gz
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.
- {liquid_loop-1.4.0 → liquid_loop-1.8.2}/PKG-INFO +61 -50
- {liquid_loop-1.4.0 → liquid_loop-1.8.2}/README.md +60 -49
- {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop/__init__.py +2 -2
- {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop/cli.py +12 -56
- {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop/entropy.py +5 -5
- {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop/rar.py +16 -3
- {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop/selfspin.py +6 -2
- {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop/workspace.py +385 -7
- {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop.egg-info/PKG-INFO +61 -50
- {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop.egg-info/SOURCES.txt +8 -0
- {liquid_loop-1.4.0 → liquid_loop-1.8.2}/pyproject.toml +1 -1
- liquid_loop-1.8.2/tests/test_attention_gain.py +102 -0
- liquid_loop-1.8.2/tests/test_cli_version.py +29 -0
- liquid_loop-1.8.2/tests/test_lifecycle.py +164 -0
- liquid_loop-1.8.2/tests/test_liquid_reweight.py +138 -0
- liquid_loop-1.8.2/tests/test_rar.py +106 -0
- liquid_loop-1.8.2/tests/test_replay_pressure.py +118 -0
- liquid_loop-1.8.2/tests/test_selfspin.py +83 -0
- liquid_loop-1.8.2/tests/test_semantica_borrow.py +74 -0
- {liquid_loop-1.4.0 → liquid_loop-1.8.2}/LICENSE +0 -0
- {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop/__main__.py +0 -0
- {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop/cognitive_budget.py +0 -0
- {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop/liquid_reweight.py +0 -0
- {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop/storage.py +0 -0
- {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop.egg-info/dependency_links.txt +0 -0
- {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop.egg-info/entry_points.txt +0 -0
- {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop.egg-info/requires.txt +0 -0
- {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop.egg-info/top_level.txt +0 -0
- {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop_exp/liquid_persist_ab.py +0 -0
- {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop_exp/liquid_recall_ab.py +0 -0
- {liquid_loop-1.4.0 → liquid_loop-1.8.2}/setup.cfg +0 -0
- {liquid_loop-1.4.0 → liquid_loop-1.8.2}/tests/test_auth_guard.py +0 -0
- {liquid_loop-1.4.0 → liquid_loop-1.8.2}/tests/test_consensus_expansion.py +0 -0
- {liquid_loop-1.4.0 → liquid_loop-1.8.2}/tests/test_entropy.py +0 -0
- {liquid_loop-1.4.0 → liquid_loop-1.8.2}/tests/test_layer1_persistence.py +0 -0
- {liquid_loop-1.4.0 → liquid_loop-1.8.2}/tests/test_nucleate_dual_track.py +0 -0
- {liquid_loop-1.4.0 → liquid_loop-1.8.2}/tests/test_peek_seal.py +0 -0
- {liquid_loop-1.4.0 → liquid_loop-1.8.2}/tests/test_seal_persistence.py +0 -0
- {liquid_loop-1.4.0 → liquid_loop-1.8.2}/tests/test_self_evolve.py +0 -0
- {liquid_loop-1.4.0 → liquid_loop-1.8.2}/tests/test_workspace.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: liquid-loop
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.8.2
|
|
4
4
|
Summary: Self-Organizing Cognitive Memory for AI Agents — Liquid Loop theory implementation
|
|
5
5
|
Author: fishbook0001
|
|
6
6
|
Maintainer: fishbook0001
|
|
@@ -50,6 +50,35 @@ Dynamic: license-file
|
|
|
50
50
|
|
|
51
51
|
---
|
|
52
52
|
|
|
53
|
+
## 30 秒理解:为什么禁向量?
|
|
54
|
+
|
|
55
|
+
> **向量检索没有「成核门槛」**——单独一条陈述就能进入检索池,并因为"最新"而胜出。
|
|
56
|
+
> 所以一条噪声 / 幻觉 / 误录入就能改写系统的记忆。
|
|
57
|
+
> 液环要求 **≥2 条一致证据才结晶**,单条噪声无法形成记忆。
|
|
58
|
+
|
|
59
|
+
这句话是可证伪的,有对照实验(同输入流、同种子、baseline 刻意做强):
|
|
60
|
+
|
|
61
|
+
| 系统 | 事实更新类场景 (S1/S2/S3/S5) | **S4 单条噪声注入** | 可解释 |
|
|
62
|
+
|------|------------------------|------------------|-------|
|
|
63
|
+
| naive vector | 12/36 错 | 3/6 错 | ✗ |
|
|
64
|
+
| vector + recency | 3/36 错 | 5/6 错 | ✗ |
|
|
65
|
+
| **vector + recency + slot 过滤**(最强 baseline) | **0/36 错** | **5/6 错** | ✗ |
|
|
66
|
+
| **Liquid Loop** | **0/36 错** | **0/6 错** | ✓ 可回溯到 evidence id |
|
|
67
|
+
|
|
68
|
+
**注意第三行**:最强 baseline 在常规事实更新上已完全追平液环——
|
|
69
|
+
**如果你的场景只是"事实会更新",用向量 + recency + 过滤就够了,不需要液环。**
|
|
70
|
+
分野只在**输入源不可信**时出现:向量方案无法区分"真实更新"和"一条噪声",液环可以。
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
python3 liquid_core.py # 215 行零依赖内核,看清全部机制
|
|
74
|
+
python3 examples/experiments/vector_vs_liquid_drift.py # 复现上表所有数字
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
两个脚本纯标准库,无需 `pip install`,Python 3.9+ 直接跑。
|
|
78
|
+
完整论证与液环的**成本和适用边界** → **[WHY_NO_VECTOR.md](WHY_NO_VECTOR.md)**
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
53
82
|
## 核心理念
|
|
54
83
|
|
|
55
84
|
**当前所有 Agent 记忆系统的共同缺陷:依赖外部编辑。**
|
|
@@ -74,7 +103,7 @@ Dynamic: license-file
|
|
|
74
103
|
| **Anchor** 锚点 | 晶种 | 认知关注点,有稳定性值 s ∈ [0,1] |
|
|
75
104
|
| **Evidence** 证据 | 附着粒子 | 锚点下的具体观察,权重指数衰减 w×0.95ᵗ |
|
|
76
105
|
| **Memory** 结晶 | 结晶体 | 2+ 条一致 Evidence 自动凝聚,有置信度 c |
|
|
77
|
-
| **Entropy** 熵值 (LEI) | 流体无序度 |
|
|
106
|
+
| **Entropy** 熵值 (LEI) | 流体无序度 | 九维加权(锚点漂移 / 冲突密度 / 碎片 / 活跃间隔 / 价值衰减 / 锚定强度 / CPE 三维) |
|
|
78
107
|
|
|
79
108
|
**状态判定:**
|
|
80
109
|
```
|
|
@@ -134,13 +163,23 @@ state.step(dt=10, decay_rate=0.05)
|
|
|
134
163
|
| 实验 | 问题 | 结论 |
|
|
135
164
|
|------|------|------|
|
|
136
165
|
| **E2 错误记忆恢复** | 能否主动遗忘错误并恢复? | 80%错误+20%真实 → 反证轨使错误 stability 0.67→0.30、正确升至 0.69 主导 ✅ |
|
|
137
|
-
| **E3 多 Agent 冲突** |
|
|
166
|
+
| **E3 多 Agent 冲突** | 多 Agent 冲突能否形成稳定共享认知?(MESH 集成已移除) | A support / B contradiction / C noise → 核心 claim 进入受争议稳定区(0.40),噪声隔离 ✅ |
|
|
138
167
|
| **E1 长期漂移** | 1000 轮随机注入是否收敛? | 300 轮压测 → 48 记忆(≤池×3)、plateau、LEI GREEN、avg_stab 0.80 ✅ |
|
|
168
|
+
| **E4 向量对照** | 与向量方案同台,液环赢在哪? | 最强 baseline(向量+recency+slot) 在常规更新已追平(0/36);**唯 S4 单条噪声注入失守 5/6,液环 0/6** ✅ |
|
|
139
169
|
|
|
140
170
|
```bash
|
|
141
|
-
python3 examples/experiments/run_all.py
|
|
171
|
+
python3 examples/experiments/run_all.py # E1/E2/E3 → REPORT_v0.8.json
|
|
172
|
+
python3 examples/experiments/vector_vs_liquid_drift.py # E4 向量对照(零依赖,独立可跑)
|
|
142
173
|
```
|
|
143
174
|
|
|
175
|
+
> **真实管线版 E4(推荐先看这个)**:`examples/faithful/faithful_e4.py` 用**真实**
|
|
176
|
+
> `selfspin.LiquidSelfSpin` + **真实** `workspace.WorkspaceState`(非裸内核),验证
|
|
177
|
+
> "改写 + 噪声输入下的端到端行为",并演示 selfspin「字符重叠聚类」的盲区边界
|
|
178
|
+
> (词汇不重叠的同义 → 无法成核 → 事实流失)。stdlib-only、零依赖,**直接用任意 python3 跑(无需 venv)**:
|
|
179
|
+
> ```bash
|
|
180
|
+
> python3 examples/faithful/faithful_e4.py
|
|
181
|
+
> ```
|
|
182
|
+
|
|
144
183
|
---
|
|
145
184
|
|
|
146
185
|
## 快速开始
|
|
@@ -207,47 +246,9 @@ liquid-loop snapshot
|
|
|
207
246
|
|
|
208
247
|
---
|
|
209
248
|
|
|
210
|
-
## MESH
|
|
211
|
-
|
|
212
|
-
液环从 v0.7.0 起内置官方 MESH 集成 `liquid_loop.mesh`,把"多智能体共识协议"落地为可复用代码,作为 agent-mesh 节点的标准接入层。
|
|
249
|
+
## MESH 集成与 A2A 桥接(已移除)
|
|
213
250
|
|
|
214
|
-
|
|
215
|
-
from liquid_loop.mesh import validate_evidence, compute_cci, cognitive_health, fetch_state
|
|
216
|
-
|
|
217
|
-
# agent 写入前契约自检(零向量:content 必须精确字符串,禁 embedding)
|
|
218
|
-
ok, errs = validate_evidence({"agent_id": "vera", "content": "用户偏好简洁输出"})
|
|
219
|
-
|
|
220
|
-
# 从 8790 拉取记忆状态,算主体间性共识指数 CCI
|
|
221
|
-
items = fetch_state("http://127.0.0.1:8790")
|
|
222
|
-
health = cognitive_health(items)
|
|
223
|
-
print(health["CCI"], health["consensus_crystals"])
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
零向量哲学:一致性判定走**结构化精确相等 + 审计链哈希**,绝不引入任何 embedding / 相似度。规范详见 `mesh/liquid_loop_mesh_v2_spec.md`。
|
|
227
|
-
|
|
228
|
-
---
|
|
229
|
-
|
|
230
|
-
## 固态 A2A 通道(任意 MCP 客户端接入)
|
|
231
|
-
|
|
232
|
-
把共享液环后端(地址由环境变量 `LIQUID_LOOP_BASE` 决定,默认 `http://127.0.0.1:8790`)封装成一个
|
|
233
|
-
**stdio JSON-RPC 的 MCP server**,让任意支持 Model Context Protocol 的客户端(本例以 TRAE SOLO CN 演示)
|
|
234
|
-
**原生读写同一份共享记忆**——这就是多 agent 间的固化(solidified)A2A 通道。
|
|
235
|
-
|
|
236
|
-
> 后端说明:桥接只做协议翻译,**不内置 8790 服务**;后端由你自己部署(运行你自己的液环 SSE 服务,
|
|
237
|
-
> 把地址通过 `LIQUID_LOOP_BASE` 传给桥接)。成核 / 共识 / 审计链全部由后端按液环理论执行。
|
|
238
|
-
|
|
239
|
-
```bash
|
|
240
|
-
# 在你的 MCP 客户端注册该 server(以 TRAE 为例;其 code CLI 路径随安装而异,请替换为你的路径)
|
|
241
|
-
export PY=python3 # 任意 Python 3.10+ 解释器
|
|
242
|
-
export SVR=examples/trae_mesh_mcp/mcp_server.py # 本仓库内路径
|
|
243
|
-
export LIQUID_LOOP_BASE=http://127.0.0.1:8790 # 改成你的后端地址
|
|
244
|
-
"<path-to-your-trae-code-cli>" \
|
|
245
|
-
--add-mcp '{"servers":{"liquidloop-mesh":{"command":"'"$PY"'","args":["'"$SVR"'"]}}}'
|
|
246
|
-
```
|
|
247
|
-
|
|
248
|
-
桥接暴露 `liquidloop_remember` / `liquidloop_recall` / `liquidloop_metrics` 三个工具(写入**必须声明 `agent_id`**)。
|
|
249
|
-
压测脚本与运维说明见 [`examples/trae_mesh_mcp/README.md`](examples/trae_mesh_mcp/README.md)
|
|
250
|
-
(直连 + 经桥双路并发,零丢写 / 共识幂等 / 崩溃恢复三关全 PASS;所有路径走环境变量,适配不同部署拓扑)。
|
|
251
|
+
> ⚠️ `liquid_loop.mesh`(多智能体共识协议)与 `examples/trae_mesh_mcp`(stdio MCP 桥接 demo)已于 v0.7.x 后从发行包移除(commit `ac7260e`,过度工程化过滤)。相关 API(`validate_evidence` / `compute_cci` / `cognitive_health` / `fetch_state`)与桥接代码当前不在仓库中;"多 Agent 共享认知"仍属理论目标,未随包发布。
|
|
251
252
|
|
|
252
253
|
---
|
|
253
254
|
|
|
@@ -268,7 +269,7 @@ export LIQUID_LOOP_BASE=http://127.0.0.1:8790 # 改成你的后端地址
|
|
|
268
269
|
↓
|
|
269
270
|
Memory State ←──────────────┐
|
|
270
271
|
↓ │
|
|
271
|
-
LEI Evaluation (
|
|
272
|
+
LEI Evaluation (九维熵) │
|
|
272
273
|
↓ │
|
|
273
274
|
Decay / Reinforcement ────────┘
|
|
274
275
|
↓
|
|
@@ -321,22 +322,32 @@ Liquid Loop 是唯一完全自组织 + 零 LLM 管理的系统。
|
|
|
321
322
|
|
|
322
323
|
```
|
|
323
324
|
liquid-loop/
|
|
325
|
+
├── liquid_core.py # ★ 215 行零依赖最小内核(单文件可跑,读它就懂全部机制)
|
|
326
|
+
├── WHY_NO_VECTOR.md # ★ 禁向量的完整论证 + 对照实验数据 + 适用边界
|
|
324
327
|
├── liquid_loop/
|
|
325
328
|
│ ├── __init__.py # 公共 API 导出
|
|
326
329
|
│ ├── workspace.py # 核心数据模型 + AuditChain + auto_classify + decay
|
|
327
330
|
│ ├── storage.py # JSON 持久化 + 审计链写入
|
|
328
|
-
│ ├── entropy.py #
|
|
329
|
-
│ ├── mesh/ # MESH v2 多智能体共识协议集成(validate_evidence / compute_cci / ...)
|
|
331
|
+
│ ├── entropy.py # 九维熵值计算(6 基础 + CPE 三维)
|
|
330
332
|
│ └── cli.py # Click CLI (11 命令)
|
|
331
333
|
├── examples/
|
|
332
|
-
│
|
|
333
|
-
├──
|
|
334
|
+
│ ├── quickstart.py
|
|
335
|
+
│ ├── experiments/
|
|
336
|
+
│ │ ├── e1_drift.py / e2_recovery.py / e3_conflict.py # 液环自证实验
|
|
337
|
+
│ │ └── vector_vs_liquid_drift.py # ★ E4 向量对照(零依赖·核心机制 demo)
|
|
338
|
+
│ └── faithful/
|
|
339
|
+
│ └── faithful_e4.py # ★ 真实管线 E4(selfspin→WorkspaceState,零依赖 无污染)
|
|
340
|
+
├── tests/
|
|
334
341
|
├── pyproject.toml
|
|
335
342
|
├── README.md
|
|
336
343
|
├── LICENSE
|
|
337
344
|
└── CHANGELOG.md
|
|
338
345
|
```
|
|
339
346
|
|
|
347
|
+
> **`liquid_core.py` 与完整版行为一致性已验证**:结晶 / 反证 / 共识轨 / step 衰减
|
|
348
|
+
> 四场景 stability 数值完全相同(4/4 PASS)。内核是可信的教学与审计入口,
|
|
349
|
+
> 不是简化到失真的玩具。
|
|
350
|
+
|
|
340
351
|
---
|
|
341
352
|
|
|
342
353
|
## 开发
|
|
@@ -352,7 +363,7 @@ pytest -v
|
|
|
352
363
|
|
|
353
364
|
## 路线图
|
|
354
365
|
|
|
355
|
-
- [
|
|
366
|
+
- [ ] 多 Agent 液环耦合(`liquid_loop.mesh` 已移除,见 commit ac7260e)
|
|
356
367
|
- [x] **[v0.8] 反证轨(Evidence Graph)**:Evidence 分 support / contradiction,一致增稳、冲突降稳,驱动 memory stability score(不再"一致即真")
|
|
357
368
|
- [x] **[v0.8] 显式时间动力学**:`M(t+1) = M(t) + reinforcement − decay − contradiction_penalty`,让记忆成为"过程"而非"对象"(真正的液态循环)
|
|
358
369
|
- [x] **[v0.8] 三实验全 PASS**:E2 错误记忆恢复 → E3 多 agent 冲突 → E1 长期漂移(见上节)
|
|
@@ -11,6 +11,35 @@
|
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
14
|
+
## 30 秒理解:为什么禁向量?
|
|
15
|
+
|
|
16
|
+
> **向量检索没有「成核门槛」**——单独一条陈述就能进入检索池,并因为"最新"而胜出。
|
|
17
|
+
> 所以一条噪声 / 幻觉 / 误录入就能改写系统的记忆。
|
|
18
|
+
> 液环要求 **≥2 条一致证据才结晶**,单条噪声无法形成记忆。
|
|
19
|
+
|
|
20
|
+
这句话是可证伪的,有对照实验(同输入流、同种子、baseline 刻意做强):
|
|
21
|
+
|
|
22
|
+
| 系统 | 事实更新类场景 (S1/S2/S3/S5) | **S4 单条噪声注入** | 可解释 |
|
|
23
|
+
|------|------------------------|------------------|-------|
|
|
24
|
+
| naive vector | 12/36 错 | 3/6 错 | ✗ |
|
|
25
|
+
| vector + recency | 3/36 错 | 5/6 错 | ✗ |
|
|
26
|
+
| **vector + recency + slot 过滤**(最强 baseline) | **0/36 错** | **5/6 错** | ✗ |
|
|
27
|
+
| **Liquid Loop** | **0/36 错** | **0/6 错** | ✓ 可回溯到 evidence id |
|
|
28
|
+
|
|
29
|
+
**注意第三行**:最强 baseline 在常规事实更新上已完全追平液环——
|
|
30
|
+
**如果你的场景只是"事实会更新",用向量 + recency + 过滤就够了,不需要液环。**
|
|
31
|
+
分野只在**输入源不可信**时出现:向量方案无法区分"真实更新"和"一条噪声",液环可以。
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
python3 liquid_core.py # 215 行零依赖内核,看清全部机制
|
|
35
|
+
python3 examples/experiments/vector_vs_liquid_drift.py # 复现上表所有数字
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
两个脚本纯标准库,无需 `pip install`,Python 3.9+ 直接跑。
|
|
39
|
+
完整论证与液环的**成本和适用边界** → **[WHY_NO_VECTOR.md](WHY_NO_VECTOR.md)**
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
14
43
|
## 核心理念
|
|
15
44
|
|
|
16
45
|
**当前所有 Agent 记忆系统的共同缺陷:依赖外部编辑。**
|
|
@@ -35,7 +64,7 @@
|
|
|
35
64
|
| **Anchor** 锚点 | 晶种 | 认知关注点,有稳定性值 s ∈ [0,1] |
|
|
36
65
|
| **Evidence** 证据 | 附着粒子 | 锚点下的具体观察,权重指数衰减 w×0.95ᵗ |
|
|
37
66
|
| **Memory** 结晶 | 结晶体 | 2+ 条一致 Evidence 自动凝聚,有置信度 c |
|
|
38
|
-
| **Entropy** 熵值 (LEI) | 流体无序度 |
|
|
67
|
+
| **Entropy** 熵值 (LEI) | 流体无序度 | 九维加权(锚点漂移 / 冲突密度 / 碎片 / 活跃间隔 / 价值衰减 / 锚定强度 / CPE 三维) |
|
|
39
68
|
|
|
40
69
|
**状态判定:**
|
|
41
70
|
```
|
|
@@ -95,13 +124,23 @@ state.step(dt=10, decay_rate=0.05)
|
|
|
95
124
|
| 实验 | 问题 | 结论 |
|
|
96
125
|
|------|------|------|
|
|
97
126
|
| **E2 错误记忆恢复** | 能否主动遗忘错误并恢复? | 80%错误+20%真实 → 反证轨使错误 stability 0.67→0.30、正确升至 0.69 主导 ✅ |
|
|
98
|
-
| **E3 多 Agent 冲突** |
|
|
127
|
+
| **E3 多 Agent 冲突** | 多 Agent 冲突能否形成稳定共享认知?(MESH 集成已移除) | A support / B contradiction / C noise → 核心 claim 进入受争议稳定区(0.40),噪声隔离 ✅ |
|
|
99
128
|
| **E1 长期漂移** | 1000 轮随机注入是否收敛? | 300 轮压测 → 48 记忆(≤池×3)、plateau、LEI GREEN、avg_stab 0.80 ✅ |
|
|
129
|
+
| **E4 向量对照** | 与向量方案同台,液环赢在哪? | 最强 baseline(向量+recency+slot) 在常规更新已追平(0/36);**唯 S4 单条噪声注入失守 5/6,液环 0/6** ✅ |
|
|
100
130
|
|
|
101
131
|
```bash
|
|
102
|
-
python3 examples/experiments/run_all.py
|
|
132
|
+
python3 examples/experiments/run_all.py # E1/E2/E3 → REPORT_v0.8.json
|
|
133
|
+
python3 examples/experiments/vector_vs_liquid_drift.py # E4 向量对照(零依赖,独立可跑)
|
|
103
134
|
```
|
|
104
135
|
|
|
136
|
+
> **真实管线版 E4(推荐先看这个)**:`examples/faithful/faithful_e4.py` 用**真实**
|
|
137
|
+
> `selfspin.LiquidSelfSpin` + **真实** `workspace.WorkspaceState`(非裸内核),验证
|
|
138
|
+
> "改写 + 噪声输入下的端到端行为",并演示 selfspin「字符重叠聚类」的盲区边界
|
|
139
|
+
> (词汇不重叠的同义 → 无法成核 → 事实流失)。stdlib-only、零依赖,**直接用任意 python3 跑(无需 venv)**:
|
|
140
|
+
> ```bash
|
|
141
|
+
> python3 examples/faithful/faithful_e4.py
|
|
142
|
+
> ```
|
|
143
|
+
|
|
105
144
|
---
|
|
106
145
|
|
|
107
146
|
## 快速开始
|
|
@@ -168,47 +207,9 @@ liquid-loop snapshot
|
|
|
168
207
|
|
|
169
208
|
---
|
|
170
209
|
|
|
171
|
-
## MESH
|
|
172
|
-
|
|
173
|
-
液环从 v0.7.0 起内置官方 MESH 集成 `liquid_loop.mesh`,把"多智能体共识协议"落地为可复用代码,作为 agent-mesh 节点的标准接入层。
|
|
210
|
+
## MESH 集成与 A2A 桥接(已移除)
|
|
174
211
|
|
|
175
|
-
|
|
176
|
-
from liquid_loop.mesh import validate_evidence, compute_cci, cognitive_health, fetch_state
|
|
177
|
-
|
|
178
|
-
# agent 写入前契约自检(零向量:content 必须精确字符串,禁 embedding)
|
|
179
|
-
ok, errs = validate_evidence({"agent_id": "vera", "content": "用户偏好简洁输出"})
|
|
180
|
-
|
|
181
|
-
# 从 8790 拉取记忆状态,算主体间性共识指数 CCI
|
|
182
|
-
items = fetch_state("http://127.0.0.1:8790")
|
|
183
|
-
health = cognitive_health(items)
|
|
184
|
-
print(health["CCI"], health["consensus_crystals"])
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
零向量哲学:一致性判定走**结构化精确相等 + 审计链哈希**,绝不引入任何 embedding / 相似度。规范详见 `mesh/liquid_loop_mesh_v2_spec.md`。
|
|
188
|
-
|
|
189
|
-
---
|
|
190
|
-
|
|
191
|
-
## 固态 A2A 通道(任意 MCP 客户端接入)
|
|
192
|
-
|
|
193
|
-
把共享液环后端(地址由环境变量 `LIQUID_LOOP_BASE` 决定,默认 `http://127.0.0.1:8790`)封装成一个
|
|
194
|
-
**stdio JSON-RPC 的 MCP server**,让任意支持 Model Context Protocol 的客户端(本例以 TRAE SOLO CN 演示)
|
|
195
|
-
**原生读写同一份共享记忆**——这就是多 agent 间的固化(solidified)A2A 通道。
|
|
196
|
-
|
|
197
|
-
> 后端说明:桥接只做协议翻译,**不内置 8790 服务**;后端由你自己部署(运行你自己的液环 SSE 服务,
|
|
198
|
-
> 把地址通过 `LIQUID_LOOP_BASE` 传给桥接)。成核 / 共识 / 审计链全部由后端按液环理论执行。
|
|
199
|
-
|
|
200
|
-
```bash
|
|
201
|
-
# 在你的 MCP 客户端注册该 server(以 TRAE 为例;其 code CLI 路径随安装而异,请替换为你的路径)
|
|
202
|
-
export PY=python3 # 任意 Python 3.10+ 解释器
|
|
203
|
-
export SVR=examples/trae_mesh_mcp/mcp_server.py # 本仓库内路径
|
|
204
|
-
export LIQUID_LOOP_BASE=http://127.0.0.1:8790 # 改成你的后端地址
|
|
205
|
-
"<path-to-your-trae-code-cli>" \
|
|
206
|
-
--add-mcp '{"servers":{"liquidloop-mesh":{"command":"'"$PY"'","args":["'"$SVR"'"]}}}'
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
桥接暴露 `liquidloop_remember` / `liquidloop_recall` / `liquidloop_metrics` 三个工具(写入**必须声明 `agent_id`**)。
|
|
210
|
-
压测脚本与运维说明见 [`examples/trae_mesh_mcp/README.md`](examples/trae_mesh_mcp/README.md)
|
|
211
|
-
(直连 + 经桥双路并发,零丢写 / 共识幂等 / 崩溃恢复三关全 PASS;所有路径走环境变量,适配不同部署拓扑)。
|
|
212
|
+
> ⚠️ `liquid_loop.mesh`(多智能体共识协议)与 `examples/trae_mesh_mcp`(stdio MCP 桥接 demo)已于 v0.7.x 后从发行包移除(commit `ac7260e`,过度工程化过滤)。相关 API(`validate_evidence` / `compute_cci` / `cognitive_health` / `fetch_state`)与桥接代码当前不在仓库中;"多 Agent 共享认知"仍属理论目标,未随包发布。
|
|
212
213
|
|
|
213
214
|
---
|
|
214
215
|
|
|
@@ -229,7 +230,7 @@ export LIQUID_LOOP_BASE=http://127.0.0.1:8790 # 改成你的后端地址
|
|
|
229
230
|
↓
|
|
230
231
|
Memory State ←──────────────┐
|
|
231
232
|
↓ │
|
|
232
|
-
LEI Evaluation (
|
|
233
|
+
LEI Evaluation (九维熵) │
|
|
233
234
|
↓ │
|
|
234
235
|
Decay / Reinforcement ────────┘
|
|
235
236
|
↓
|
|
@@ -282,22 +283,32 @@ Liquid Loop 是唯一完全自组织 + 零 LLM 管理的系统。
|
|
|
282
283
|
|
|
283
284
|
```
|
|
284
285
|
liquid-loop/
|
|
286
|
+
├── liquid_core.py # ★ 215 行零依赖最小内核(单文件可跑,读它就懂全部机制)
|
|
287
|
+
├── WHY_NO_VECTOR.md # ★ 禁向量的完整论证 + 对照实验数据 + 适用边界
|
|
285
288
|
├── liquid_loop/
|
|
286
289
|
│ ├── __init__.py # 公共 API 导出
|
|
287
290
|
│ ├── workspace.py # 核心数据模型 + AuditChain + auto_classify + decay
|
|
288
291
|
│ ├── storage.py # JSON 持久化 + 审计链写入
|
|
289
|
-
│ ├── entropy.py #
|
|
290
|
-
│ ├── mesh/ # MESH v2 多智能体共识协议集成(validate_evidence / compute_cci / ...)
|
|
292
|
+
│ ├── entropy.py # 九维熵值计算(6 基础 + CPE 三维)
|
|
291
293
|
│ └── cli.py # Click CLI (11 命令)
|
|
292
294
|
├── examples/
|
|
293
|
-
│
|
|
294
|
-
├──
|
|
295
|
+
│ ├── quickstart.py
|
|
296
|
+
│ ├── experiments/
|
|
297
|
+
│ │ ├── e1_drift.py / e2_recovery.py / e3_conflict.py # 液环自证实验
|
|
298
|
+
│ │ └── vector_vs_liquid_drift.py # ★ E4 向量对照(零依赖·核心机制 demo)
|
|
299
|
+
│ └── faithful/
|
|
300
|
+
│ └── faithful_e4.py # ★ 真实管线 E4(selfspin→WorkspaceState,零依赖 无污染)
|
|
301
|
+
├── tests/
|
|
295
302
|
├── pyproject.toml
|
|
296
303
|
├── README.md
|
|
297
304
|
├── LICENSE
|
|
298
305
|
└── CHANGELOG.md
|
|
299
306
|
```
|
|
300
307
|
|
|
308
|
+
> **`liquid_core.py` 与完整版行为一致性已验证**:结晶 / 反证 / 共识轨 / step 衰减
|
|
309
|
+
> 四场景 stability 数值完全相同(4/4 PASS)。内核是可信的教学与审计入口,
|
|
310
|
+
> 不是简化到失真的玩具。
|
|
311
|
+
|
|
301
312
|
---
|
|
302
313
|
|
|
303
314
|
## 开发
|
|
@@ -313,7 +324,7 @@ pytest -v
|
|
|
313
324
|
|
|
314
325
|
## 路线图
|
|
315
326
|
|
|
316
|
-
- [
|
|
327
|
+
- [ ] 多 Agent 液环耦合(`liquid_loop.mesh` 已移除,见 commit ac7260e)
|
|
317
328
|
- [x] **[v0.8] 反证轨(Evidence Graph)**:Evidence 分 support / contradiction,一致增稳、冲突降稳,驱动 memory stability score(不再"一致即真")
|
|
318
329
|
- [x] **[v0.8] 显式时间动力学**:`M(t+1) = M(t) + reinforcement − decay − contradiction_penalty`,让记忆成为"过程"而非"对象"(真正的液态循环)
|
|
319
330
|
- [x] **[v0.8] 三实验全 PASS**:E2 错误记忆恢复 → E3 多 agent 冲突 → E1 长期漂移(见上节)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
"""Liquid Loop — Workspace Cognitive Runtime v1.
|
|
2
|
-
__version__ = "1.
|
|
1
|
+
"""Liquid Loop — Workspace Cognitive Runtime v1.8.2 (禁向量·活态液态神经网络:成核门槛/反证轨/老化回收/原理优先成核/因果演化/软取代supersede+治理查询state_at/impact/duplicates)"""
|
|
2
|
+
__version__ = "1.8.2"
|
|
3
3
|
|
|
4
4
|
from .workspace import (
|
|
5
5
|
WorkspaceState, Anchor, Evidence, Memory, Conflict,
|
|
@@ -87,7 +87,7 @@ def init():
|
|
|
87
87
|
|
|
88
88
|
@main.command()
|
|
89
89
|
def status():
|
|
90
|
-
"""显示当前认知状态(CPE
|
|
90
|
+
"""显示当前认知状态(CPE九维熵值)"""
|
|
91
91
|
s = _load()
|
|
92
92
|
ent = calculate(s)
|
|
93
93
|
level = "GREEN" if ent < 0.3 else ("YELLOW" if ent < 0.6 else "RED")
|
|
@@ -96,7 +96,7 @@ def status():
|
|
|
96
96
|
click.echo(f"熵值: {ent:.4f} [{level}] | 最新活动: {latest_ev}")
|
|
97
97
|
click.echo(f"CPE干预: {s.cpe_regularization_count}次 | 版本: {s.version}")
|
|
98
98
|
|
|
99
|
-
#
|
|
99
|
+
# 九维熵值快速
|
|
100
100
|
det = calculate_detail(s)
|
|
101
101
|
click.echo(f" [原五维] 漂移{det['anchor_drift']:.2f} 冲突{det['conflict_density']:.2f} 碎片{det['evidence_fragmentation']:.2f} 活动{det['activity_gap']:.2f} 价值{det['value_decay']:.2f}")
|
|
102
102
|
click.echo(f" [CPE三维] 回顾{det['cpe_retrospective_decay']:.2f} 漂移{det['cpe_behavioral_drift']:.2f} 泛化{det['cpe_generalization_erosion']:.2f}")
|
|
@@ -235,7 +235,7 @@ def relation_list():
|
|
|
235
235
|
|
|
236
236
|
@main.command()
|
|
237
237
|
def check():
|
|
238
|
-
"""
|
|
238
|
+
"""检查工作区熵值(九维)"""
|
|
239
239
|
s = _load()
|
|
240
240
|
det = calculate_detail(s)
|
|
241
241
|
ent = det["combined"]
|
|
@@ -501,10 +501,10 @@ def cpe_status():
|
|
|
501
501
|
else:
|
|
502
502
|
click.echo(f" 活跃侵蚀告警: 无")
|
|
503
503
|
|
|
504
|
-
#
|
|
504
|
+
# 九维熵值详情
|
|
505
505
|
from .entropy import calculate_detail
|
|
506
506
|
det = calculate_detail(s)
|
|
507
|
-
click.echo(f"\n━━━
|
|
507
|
+
click.echo(f"\n━━━ 九维熵值详情 ━━━")
|
|
508
508
|
click.echo(f" 综合熵: {det['combined']:.4f}")
|
|
509
509
|
click.echo(f" ── 基础五维 ──")
|
|
510
510
|
click.echo(f" 锚点漂移: {det['anchor_drift']:.4f}")
|
|
@@ -519,57 +519,13 @@ def cpe_status():
|
|
|
519
519
|
click.echo(f" 泛化崩塌(CPE): {det['cpe_generalization_erosion']:.4f}")
|
|
520
520
|
|
|
521
521
|
|
|
522
|
+
@main.command()
|
|
523
|
+
def version():
|
|
524
|
+
"""显示当前版本号"""
|
|
525
|
+
from . import __version__
|
|
526
|
+
click.echo(f"liquid-loop {__version__}")
|
|
527
|
+
|
|
528
|
+
|
|
522
529
|
if __name__ == "__main__":
|
|
523
530
|
main()
|
|
524
531
|
|
|
525
|
-
@cli.command()
|
|
526
|
-
@click.argument("content")
|
|
527
|
-
@click.option("--evidence-ids", help="证据ID列表,逗号分隔")
|
|
528
|
-
def memory_add(content: str, evidence_ids: str):
|
|
529
|
-
"""添加一条记忆结晶"""
|
|
530
|
-
state = load_state()
|
|
531
|
-
eids = [eid.strip() for eid in evidence_ids.split(",")] if evidence_ids else None
|
|
532
|
-
state.add_memory(content, eids)
|
|
533
|
-
save_state(state)
|
|
534
|
-
click.echo(f"Memory added: {content[:50]}...")
|
|
535
|
-
|
|
536
|
-
@cli.command()
|
|
537
|
-
def memory_list():
|
|
538
|
-
"""列出所有记忆结晶"""
|
|
539
|
-
state = load_state()
|
|
540
|
-
if not state.memories:
|
|
541
|
-
click.echo("No memories yet")
|
|
542
|
-
return
|
|
543
|
-
for m in state.memories:
|
|
544
|
-
click.echo(f" {m.id[:8]} | conf={m.confidence:.2f} | {m.content[:60]}...")
|
|
545
|
-
|
|
546
|
-
@cli.command()
|
|
547
|
-
@click.argument("anchor_id")
|
|
548
|
-
def conflict_resolve(anchor_id: str):
|
|
549
|
-
"""标记冲突为已解决(移除该锚点的冲突记录)"""
|
|
550
|
-
state = load_state()
|
|
551
|
-
before = len(state.conflicts)
|
|
552
|
-
state.conflicts = [c for c in state.conflicts if c.anchor_a != anchor_id]
|
|
553
|
-
after = len(state.conflicts)
|
|
554
|
-
save_state(state)
|
|
555
|
-
click.echo(f"Resolved {before - after} conflict(s) for anchor {anchor_id}")
|
|
556
|
-
|
|
557
|
-
@cli.command()
|
|
558
|
-
@click.argument("anchor_id")
|
|
559
|
-
@click.argument("description")
|
|
560
|
-
def anchor_describe(anchor_id: str, description: str):
|
|
561
|
-
"""手动设置锚点描述"""
|
|
562
|
-
state = load_state()
|
|
563
|
-
anchor = next((a for a in state.anchors if a.id == anchor_id or a.name == anchor_id), None)
|
|
564
|
-
if not anchor:
|
|
565
|
-
click.echo(f"Anchor not found: {anchor_id}")
|
|
566
|
-
return
|
|
567
|
-
anchor.description = description
|
|
568
|
-
save_state(state)
|
|
569
|
-
click.echo(f"Anchor '{anchor.name}' description updated")
|
|
570
|
-
|
|
571
|
-
@cli.command()
|
|
572
|
-
def version():
|
|
573
|
-
"""显示版本号"""
|
|
574
|
-
from . import __version__
|
|
575
|
-
click.echo(f"liquid-loop {__version__}")
|
|
@@ -52,7 +52,7 @@ def activity_gap(state: WorkspaceState) -> float:
|
|
|
52
52
|
return min(gap / timedelta(days=7), 1.0)
|
|
53
53
|
|
|
54
54
|
|
|
55
|
-
# 熵值分量(综合见 calculate
|
|
55
|
+
# 熵值分量(综合见 calculate,九维加权含 CPE 三维)
|
|
56
56
|
|
|
57
57
|
def value_decay_entropy(state: WorkspaceState) -> float:
|
|
58
58
|
"""锚点价值衰减熵。0=全部高价值, 1=全部低价值 — 纯函数,不改 state"""
|
|
@@ -173,7 +173,7 @@ def cpe_dimension_entropy(state: WorkspaceState) -> dict:
|
|
|
173
173
|
|
|
174
174
|
|
|
175
175
|
# ==============================================================================
|
|
176
|
-
#
|
|
176
|
+
# 综合熵值(九维加权 — 六维基础 + CPE三维 = 九维)
|
|
177
177
|
# ==============================================================================
|
|
178
178
|
|
|
179
179
|
def calculate(state: WorkspaceState,
|
|
@@ -182,9 +182,9 @@ def calculate(state: WorkspaceState,
|
|
|
182
182
|
w_decay: float = 0.10, w_strength: float = 0.10,
|
|
183
183
|
w_retro: float = 0.15, w_behavior: float = 0.10,
|
|
184
184
|
w_generalize: float = 0.10) -> float:
|
|
185
|
-
"""综合熵值 0.0-1.0
|
|
185
|
+
"""综合熵值 0.0-1.0(九维加权 — 新增CPE三维)
|
|
186
186
|
|
|
187
|
-
CPE 三维权重合计 0.35
|
|
187
|
+
CPE 三维权重合计 0.35,与六维基础(0.65)形成均衡。
|
|
188
188
|
"""
|
|
189
189
|
return (
|
|
190
190
|
w_drift * anchor_drift(state) +
|
|
@@ -200,7 +200,7 @@ def calculate(state: WorkspaceState,
|
|
|
200
200
|
|
|
201
201
|
|
|
202
202
|
def calculate_detail(state: WorkspaceState) -> dict:
|
|
203
|
-
"""
|
|
203
|
+
"""返回九维详细熵值(用于 display 和诊断)"""
|
|
204
204
|
return {
|
|
205
205
|
"anchor_drift": anchor_drift(state),
|
|
206
206
|
"conflict_density": conflict_density(state),
|
|
@@ -20,7 +20,13 @@ import time
|
|
|
20
20
|
from datetime import datetime
|
|
21
21
|
|
|
22
22
|
# ── token / entity extraction ──────────────────────────────
|
|
23
|
-
_TOKEN = re.compile(r"[a-z0-9_]
|
|
23
|
+
_TOKEN = re.compile(r"[a-z0-9_]+|[\u4e00-\u9fff]", re.I)
|
|
24
|
+
# 中文按单字切(与 selfspin 同源字符级:中文单字 + 英数串),虚词/高频字作
|
|
25
|
+
# 停用过滤,避免噪声。此前仅 [a-z0-9_]+ → 中文 _tokens 恒空 → 中文检索失效。
|
|
26
|
+
_CJK = re.compile(r"[\u4e00-\u9fff]")
|
|
27
|
+
_STOP_CJK = set(
|
|
28
|
+
"的了吗呢吧啊哟哦嗯是与我不人都和也就很着没看说自己这那它她什么怎么哪"
|
|
29
|
+
)
|
|
24
30
|
_NAME = re.compile(r"\b([A-Z][a-z]+(?:\s+[A-Z][a-z]+){0,3})\b")
|
|
25
31
|
_ACR = re.compile(r"\b([A-Z]{2,6})\b")
|
|
26
32
|
_DATE = re.compile(
|
|
@@ -98,8 +104,15 @@ def _struct_entities(text: str) -> set:
|
|
|
98
104
|
|
|
99
105
|
|
|
100
106
|
def _tokens(text: str) -> set:
|
|
101
|
-
|
|
102
|
-
|
|
107
|
+
out: set = set()
|
|
108
|
+
for t in _TOKEN.findall(text or ""):
|
|
109
|
+
tl = t.lower()
|
|
110
|
+
if _CJK.match(t): # 中文单字:保留(过滤虚词)
|
|
111
|
+
if tl not in _STOP_CJK:
|
|
112
|
+
out.add(tl)
|
|
113
|
+
elif len(tl) >= 3 and tl not in _STOP: # 英文 / 数字:原逻辑
|
|
114
|
+
out.add(tl)
|
|
115
|
+
return out
|
|
103
116
|
|
|
104
117
|
|
|
105
118
|
def _jaccard(a: str, b: str) -> float:
|
|
@@ -44,6 +44,7 @@ import re
|
|
|
44
44
|
import json
|
|
45
45
|
import time
|
|
46
46
|
import hashlib
|
|
47
|
+
import logging
|
|
47
48
|
import argparse
|
|
48
49
|
import urllib.request
|
|
49
50
|
import urllib.error
|
|
@@ -174,6 +175,7 @@ class LiquidSelfSpin:
|
|
|
174
175
|
# 液态重排持久化(v1.2.0):激活态跨会话保持「活」
|
|
175
176
|
self.liquid_persist = True
|
|
176
177
|
self.liquid_cache_dir = os.path.expanduser("~/.liquidloop")
|
|
178
|
+
self._persist_errors = 0 # 持久化失败计数(去吞错:让故障可观测)
|
|
177
179
|
self._lr = None # 持久化 LiquidReweight 实例(懒构造,复用跨 recall)
|
|
178
180
|
|
|
179
181
|
# ── 本地快自转:摄入 ──
|
|
@@ -192,8 +194,10 @@ class LiquidSelfSpin:
|
|
|
192
194
|
for f in self._facts[report_id]:
|
|
193
195
|
lr.propagate(self._liquid_anchor_id(f), f, steps=1)
|
|
194
196
|
lr.save()
|
|
195
|
-
except Exception:
|
|
196
|
-
|
|
197
|
+
except Exception as e:
|
|
198
|
+
self._persist_errors += 1
|
|
199
|
+
logging.getLogger(__name__).warning(
|
|
200
|
+
"liquid persist failed for %s: %s", report_id, e)
|
|
197
201
|
return len(self._facts[report_id])
|
|
198
202
|
|
|
199
203
|
# ── 液态重排持久化支持(v1.2.0)──
|