添加 README.md
This commit is contained in:
173
README.md
Normal file
173
README.md
Normal file
@ -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(仅保留当前输入)时,系统能否维持连贯、准确、有记忆的多轮对话。如果成功,则证明图外部化完全替代了参数化记忆。
|
||||
|
||||
Reference in New Issue
Block a user