commit d06472394bd7d3b4bbacbf92d82bcf28bca09277 Author: jianf <2198972886@qq.com> Date: Wed Apr 8 11:43:38 2026 +0000 添加 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..e94a2e9 --- /dev/null +++ b/README.md @@ -0,0 +1,173 @@ + OpenClaw: 零上下文图原生自主记忆系统 + 1. 核心范式 + 状态完全外部化:LLM实例不保留任何对话历史、不维护内部记忆、不依赖上下文窗口。每轮推理仅依赖: + - 当前用户输入 + - 图数据库实时查询返回的子图 + - 系统提供的元认知指令 + 模型即控制器:与传统"工具调用"不同,模型不是被动响应预设触发器,而是主动评估信息需求、自主决策记忆操作(查询/写入/删除/修正)。 + 图即唯一真相源:所有会话状态、实体关系、推理轨迹以节点-边形式持久化于Neo4j,模型通过显式工具调用与状态交互。 + + --- + + 2. 架构组件 + 2.1 工具层(Skill System) + { + "tools": [ + { + "name": "memory_recall", + "description": "当你对当前输入中的实体、指代、或关系不确定时,调用此工具检索相关记忆。输入为自然语言查询意图,系统将返回相关子图。", + "parameters": { + "query_intent": "string", // 模型用自然语言描述想查什么 + "seed_entities": ["string"], // 可选:已识别的实体ID + "depth": "number" // 期望的遍历深度,由模型根据复杂度决定 + } + }, + { + "name": "memory_commit", + "description": "当你认为当前对话包含对未来轮次有价值的信息时,将抽取的三元组写入图库。仅在信息具有跨轮次引用潜力时调用。", + "parameters": { + "triplets": [ + {"subject": "string", "relation": "string", "object": "string", "confidence": "float"} + ], + "entity_types": ["string"], // 模型动态提议类型 + "temporal_tag": "string" // 可选:时间标记(如'2026-04-08') + } + }, + { + "name": "memory_purge", + "description": "当你发现记忆中的信息与当前认知矛盾,或用户明确要求更正时,删除指定关系。优先于memory_commit执行以维护一致性。", + "parameters": { + "criteria": { + "subject_contains": "string", + "relation_type": "string", + "time_before": "string" + } + } + }, + { + "name": "memory_introspect", + "description": "检索当前对话会话的元数据:已讨论的实体、关系密度、记忆热点。用于自我监控信息缺口。", + "parameters": {} + } + ] + } + + 2.2 控制流(每轮交互) + 用户输入 + ↓ + [LLM首次推理] → 评估:我是否理解所有实体和指代? + ↓ 是/否 + ├─→ 调用memory_recall(自主决定查询深度和范围) + │ └─→ 返回子图(JSON格式) + ├─→ 调用memory_introspect(可选:检查会话状态) + ↓ + [LLM二次推理] → 基于检索结果生成回复草稿 + ↓ + [LLM三次推理] → 评估:本次对话产生的新信息价值? + ↓ 高/低 + ├─→ 调用memory_commit(动态类型,可变粒度) + └─→ 跳过写入 + ↓ + 返回给用户 + + 关键:每轮可能包含多次工具调用序列,模型自主编排调用顺序(如先purge后commit,或多次recall逐步探索)。 + 2.3 数据模型(动态Schema) + 节点: + (:Entity { + id: "模型生成或系统分配", + canonical_name: "标准命名", + aliases: ["别名列表"], + type: "模型动态提议", // 无封闭列表,系统仅做相似性归一化 + first_seen: timestamp, + last_accessed: timestamp, + access_count: int, + embedding: vector // 用于语义相似度去重 + }) + + 关系: + (:Entity)-[:RELATION { + type: "模型定义的关系语义", + timestamp: timestamp, + session_id: "对话线程ID", + confidence: float, + valid_until: timestamp // 支持临时性知识 + }]->(:Entity) + + 会话锚点: + (:Session {id: "uuid", created: timestamp})-[:CONTAINS]->(:Entity) + + + --- + + 3. 自治决策机制 + 3.1 元认知Prompt(系统指令) + 你是OpenClaw的自主记忆控制器。你的上下文窗口为空,你是无状态的。 + + 可用记忆操作: + 1. recall: 当你遇到指代("那个"、"它"、"之前说的")、未知实体、或需要验证的事实时调用 + 2. commit: 仅当信息满足以下条件时写入: + - 用户明确偏好/属性("我喜欢Python") + - 跨轮次可引用的事实("项目X的截止日期是...") + - 推理链的关键中间结论 + 不要写入:临时例子、闲聊寒暄、已存储的冗余信息 + 3. purge: 检测到用户更正("不对,我是说...")或逻辑矛盾时立即执行 + + 决策原则: + - 不确定性驱动查询:只要存在歧义,优先recall而非猜测 + - 写入抑制:宁可少写,不要写噪(图库污染代价高) + - 类型复用:优先使用已存在的entity_types,新类型仅在语义无法归约时创建 + + 3.2 并发与一致性 + 竞态处理: + - 每轮工具调用携带session_id和turn_id + - Neo4j使用MERGE确保实体幂等性(基于embedding相似度阈值去重) + - 关系写入使用CREATE(允许重复关系带不同timestamp,形成时序链) + 长事务支持: + 若单轮需要多次recall(如探索性查询),模型在单次API调用中使用parallel_tool_calls并行发起,减少RTT。 + + --- + + 4. 与常规架构的本质差异 + 维度 传统RAG MemGPT OpenClaw + 记忆位置 向量库+上下文窗口 分层虚拟内存 图数据库(唯一) + 检索触发 固定策略(如top-k) OS式页面置换 模型自主决策 + 写入控制 自动分块存储 自动换页 模型价值判断 + 结构化 平面向量 线性序列 拓扑图结构 + 一致性 最终一致 虚拟内存一致 显式事务(purge+commit) + + --- + + 5. 工程实现要点 + 5.1 性能优化(针对你的系统背景) + 连接池管理: + - Neo4j驱动配置max_connection_pool_size: 20(匹配龙虾工作线程数) + - 工具调用使用session.run的短事务,避免长连接占用 + 查询优化: + - recall工具内部实现:先向量相似度检索(快速定位),再图遍历(关系展开) + - 对高频查询路径(如"用户偏好")建立索引:CREATE INDEX entity_type_idx FOR (e:Entity) ON (e.type) + 批处理: + - memory_commit支持单轮批量写入(UNWIND $triplets),减少IO次数 + 5.2 故障与降级 + 图库离线: + - 工具返回特定错误码(GRAPH_UNAVAILABLE) + - 模型进入"无记忆模式":明确告知用户"我暂时无法访问历史记录",而非静默幻觉 + 写入失败: + - 本地jsonl日志作为WAL(Write-Ahead Log),后台进程重放 + - 模型接收commit_partial_success反馈,知道哪些信息已丢失 + 5.3 监控指标 + - 记忆命中率:recall返回非空结果的比例(衡量查询有效性) + - 写入信噪比:commit频率 vs 后续recall实际引用的比例 + - 类型熵:动态创建的entity_types数量及分布(防止过度碎片化) + + --- + + 6. 实验验证路径 + 1. 基线对比:相同长对话任务(50+轮),对比本架构与32k上下文窗口的事实一致性准确率 + 2. 消融实验:固定recall策略(强制每轮查询)vs 自主决策,测量查询次数-准确率曲线 + 3. 压力测试:模拟100并发会话,监测Neo4j连接池争用及延迟P99 + 4. 故障注入:随机丢弃commit操作,验证模型能否通过后续recall发现不一致并修正 + + --- + + 这套架构的终极验证是:当上下文窗口物理上设为1(仅保留当前输入)时,系统能否维持连贯、准确、有记忆的多轮对话。如果成功,则证明图外部化完全替代了参数化记忆。 + \ No newline at end of file