🌉 给 AI 一个跟着你走的记忆 —— 跨设备 × 跨平台的共享记忆层
CDSMP(大模型跨设备语义记忆连续性架构)的官方工程实现。 English · 设计 RFC · 容器一致性 RFC · 路线图 · 移动端接入 · 隐私威胁模型 · 版本历程
早上通勤时你在手机上和 AI 讨论到一半的推理,回到办公室想在 PC 上继续—— 今天的做法是:翻聊天记录、复制粘贴、重新解释一遍背景。
云全量同步很重也未必安全;RAG 是"到了新设备再被动检索";主流记忆系统 (Mem0、MemGPT/Letta 等)本质上是单机的。记忆桥的答案是三个差异化主张:
- 跨设备连续性:记忆跟着人走,而不是跟着 App 走。手机、PC、平板共享同一份语义记忆,通过增量差分同步。
- 边缘预加载:在你打开新设备之前,高热度的记忆已经被推送到位——切换即连续,而不是切换后等待检索。
- 内容冻结原则:记忆桥只提取语义关联、只调节结构参数,永不改写你的原始记忆内容。这正是论文所依据的 Faulty Memory 研究的结论:让 LLM 自动改写/摘要记忆,必然引入幻觉式失真。
同时,记忆桥是跨平台的:通过 MCP 协议,同一个记忆库可以被 Claude Code、Cursor、Cline 等任意 MCP 客户端共享使用(平台覆盖详情见下文矩阵)。
| 能力 | 说明 | 状态 |
|---|---|---|
| 跨设备互通零配置(密码写在项目文档里,加密形态) | 通道密钥由源码种子确定性派生(PBKDF2-HMAC-SHA256 200000 轮,纯标准库),各端各自算、逐字节相同;通道目录不再存明文口令。README 逐字公布算法/盐/轮数/自检密文,任何 AI 或语言不装本项目也能独立算出密钥并解包。本机历史口令(环境变量 / 保险库)不再盖住它,旧通道仍用旧密钥并显式告警 | ✅ v0.31 |
| 时间窗检索(Hindsight 借鉴·只取结构层) | scope 新增 at: 时间窗:相对量 at:7d / at:12h / at:30m / at:2w、月 at:2026-09、日 at:2026-09-20、区间 at:2026-09-01..2026-09-20(任一端可省,右端点含当日整天)——对齐 Hindsight recall 的第 4 路 temporal,先过滤再融合;纯标准库解析、写法非法一律=不过滤,tag: / scene: / kind: 老用法逐字节不变 |
✅ v0.30 |
| 证据计数(proof count,Hindsight 借鉴) | 按边表统计「这条记忆被多少条不同记忆引用」(入边出边去重):search 结果行尾只读尾注 · 被 N 条记忆引用,RRF 同分时作次级排序键;注入块刻意不加(每轮常驻 token 优先省)。v0.14 起就落库、却一直只在内部可见的边关系数,第一次对外可见 |
✅ v0.30 |
| 容器一致性(各端 schema 可声明可对账) | 容器清单 schema.py 实读库结构生成本端身份证(schema 版本 / 节点边字段 / 边类型枚举 / 三存储平面 / 迁移登记);membridge schema 查看本端、--peer 与对端双向对账,缺列按迁移登记自动 ALTER 补齐;差分包携带 edges_v2 五元组(含 kind/evidence)随包对账——v0.14 的类型化边跨端往返不再退化 |
✅ v0.16 |
| 三存储平面声明(mem0 借鉴) | manifest 声明 graph(edges)/ vector(nodes.embedding)/ kv(meta)三平面,实读表结构判定,缺平面即指纹不同、体检可查 | ✅ v0.16 |
| seq 版本协商(rig 借鉴) | 发包 seq 单调递增,接收端按设备记 sync_watermark 水位线(只增不减),重复/乱序包内容指纹去重天然幂等 |
✅ v0.16 |
| 通道密钥随通道走(各端零输入) | 通道目录里的 channel.key 随网盘同步到各端,首次发布自动生成——跨端共享不必再记、再传、再复述任何口令;--passphrase 仍优先,严格端到端加密一字未改 |
✅ v0.17 |
| 设备心跳(谁在通道里一眼可查) | 每端只写自己的 devices/<设备>.json(设备名 / 平台 / 最后活跃 / 节点数 / 容器指纹),只写自己的文件 → 无共享可变状态 → 零冲突;init 即登记,没发过包的设备不再隐身 |
✅ v0.17 |
membridge sync 一键双向 |
先取回他端记忆、再发布本机新记忆,输出一行汇总;网页 / 手机 / 平板无计划任务也能对齐,各端共享节奏统一 | ✅ v0.17 |
| 通道接线描述(配一次,各端自动) | 首次配置那台设备把「接了哪家网盘 / 远端子路径 / 角色 / 凭据」加密写进通道目录的 wiring.json——只写一次:写者唯一(written_by 非本机则本机只读),所以没有共享可写状态,网盘上不会出现 wiring (1).json 冲突副本(与 devices/ 心跳同约定)。其他端 init 读到即自动接上,不必再输一遍账号与应用密码。凭据走差分包同一条加密链(Fernet + PBKDF2,随机盐随文件携带),明文里只有写者/时间/版本/通道 ID,账号与密码整块加密;拿不到钥匙宁可不写(nocrypto),绝不落明文凭据。接线状态同时改回本机文件 <库目录>/netdisk.json(原先写进共享网盘=读-改-写,多端并发必丢更新;老位置自动迁移、老文件不删) |
✅ v0.27 |
| 网盘三端直达(双网盘主备分明:坚果云主通道 + OneDrive 备胎) | 无头端三步接线:rclone 就位(Linux 容器自动装)→ 授权(凭据只落盘权限 600 永不打印)→ 首次拉取。坚果云走 WebDAV + 应用密码(全端可达,无浏览器往返);OneDrive 走 OAuth token(备胎,坚果云出问题时顶上,不是淘汰)。同一通道目录可两家同时接、主通道先跑;--role 可显式定主备。PC / Mac 已装网盘客户端则探测即指向、零配置。netdisk-sync 一条命令逐家完成「文件夹级双向 + 包级同步」,电脑、手机平板、网页端容器三端自动双向;channel --move 一条命令迁通道宿主(v0.20);旧版 rclone 自动降级双向复制(v0.21);体检识别桌面客户端直连、--dir 省略时回落已配置通道(v0.22) |
✅ v0.22 |
| 交接班(交接卡 + 工作台) | 第三种记忆类型 kind=handover:任务告一段落、上下文将满、或切换设备前写一张交接卡(goal:/done:/failed:/next:/refs: 行前缀约定;failed 行用硬句式留下「试过什么;因为什么;除非什么否则别重试」)。全库最新未过期交接卡成为工作台:注入时恒定在场、不走相关性检索——交接卡是状态声明,不是检索命中;新卡自动取代旧卡(取代是推导出来的,零新增状态位,跨设备同步后各端自动收敛到同一张卡);超 7 天未更新自动降级为普通记忆(过期工作台比没有更危险);交接卡触点边权重结构衰减,防止其连成超级枢纽抬排名;membridge handoff 查看工作台,membridge handoff-hint 打印常驻交接提示,随身记页面内置交接卡表单 |
✅ v0.15 |
| 类型化边 + 证据 | 边带 kind(semantic / cooccur / entity)+ 极短 evidence——每条边可回答「为什么相关」;存量库打开自动迁移(旧边标 semantic),只加结构不碰内容 |
✅ v0.14 |
| 实体锚点边 | 零依赖正则抽取代码符号 / 文件路径 / 仓库 / 标签为确定性锚点,共享同一锚点即连边——不靠字面巧合,中英混写也能连上 | ✅ v0.14 |
| 整簇预加载 | preload --cluster:连通分量把记忆切簇,按「当前最热节点所在簇」整簇加载——到新设备,整条任务线的上下文已就位 |
✅ v0.14 |
| 召回理由标注 | context 注入时标注极短命中路径(向量 / 关键词 / 图谱)——一眼判断该不该信这条记忆;hybrid_search 兼容封装,行为不变 |
✅ v0.14 |
| 通道归一(多设备指向同一云盘通道) | 通道身份证 channel.json:首设备创建,后续设备 init / 同步时自动认领;分裂(本机与通道身份证不一致)显式告警,先到先得不改写;membridge channel 一屏体检(本机通道 / 身份证 / 通道内出现过的设备);OneDrive 多根目录识别(OneDrive - 个人 等变体);doctor 通道健康告警。纯元数据:不含口令、不碰记忆内容 |
✅ v0.13 |
| 网关可观测 + IP 白名单 | 基站常驻服务的排障刚需:运行时长 / 请求数 / 写入数 / 检索命中数实时可查(/health + 随身记页面);--allow 按 IP/网段白名单放行,口令 + 白名单双保险 |
✅ v0.12 |
| 手机 / 平板接入 | membridge gateway 基站模式:家里一台常开设备跑网关,手机经口令保护的 HTTP 读写记忆库(内置随身记网页,可加主屏幕;iOS 快捷指令直连),纯标准库零新依赖;旧手机可当 24 小时低功耗基站(5–10 瓦),还能与 OlliteRT 本地模型拼成零云端个人 AI 栈,见 移动端指南 |
✅ v0.11 |
| Markdown 导出视图 | membridge export 把整座库渲染成人类可读的 Markdown(场景分组 + fact/procedure 分节 + 出处)——只读视图,永不回写,记忆可审计、可进 Git、可带走 |
✅ v0.10 |
| 常驻召回提示 | membridge recall-hint 打印一行提示,自愿粘贴进 CLAUDE.md / AGENTS.md——「任务前主动召回」代替「被动等想起」;只打印不代写宿主文件 |
✅ v0.10 |
| 三路混合检索 + RRF | 向量 + 关键词(字面命中兜底)+ SAN 图谱一跳三路召回,按排名做 RRF 融合(k=60)——多路共识天然加分,无新参数可调 | ✅ v0.9 |
| 预算注入 + 沉默契约 | Path A 注入受 token 预算约束,超预算条目注入原文前缀(截断 ≠ 改写,内容冻结无损);无高质量命中时明确返回「本轮不干预」,不硬凑弱命中;v0.26 起预算装不下的召回降为一行指针(mb:#id 片段,按需 search "片段" 取全文,借鉴 Headroom CCR——原文冻结在库,只省注入视图),注入块稳定前缀排序 + 同输入字节一致,命中宿主 KV-cache |
✅ v0.9 / v0.26 |
| MCP 工具描述瘦身 | 三个工具的描述各压缩到一行——工具描述常驻每个客户端会话,省 token 从描述面开始 | ✅ v0.9 |
| 缺口发现 | 零命中查询记入本地(纯元数据),doctor 显示缺口并提示——系统只提醒,内容永远由用户写 |
✅ v0.9 |
| 可选 kind 标注 | fact(稳定事实)/ procedure(试过什么、结果怎样)可选标注,纯可选不强制 |
✅ v0.9 |
| 增量建边 | 写入时只计算新节点与既有节点的关联(O(n),不再每次全量 O(n²) 重算);membridge rebuild-edges 提供全量重建出口 |
✅ v0.8 |
| 工程健壮性 | SQLite WAL 并发 + 单事务原子提交(add+建边、差分应用);差分包"数据错误跳过 / 环境错误保留重试"分流 | ✅ v0.8 |
| token 经济 | MCP 工具收敛为 3 个(context 并入 search)、检索相对阈值滤除弱命中、超长记忆写入软引导拆分 | ✅ v0.8 |
| doctor 库位置健康 | 库位于临时/生成目录、多库分裂(默认库与环境变量库并存)、设备名未设置——显式告警 | ✅ v0.8 |
| 记忆库内容体检 | membridge lint:四项确定性结构检查(悬空边 / 孤立 / 陈旧 / 凭证泄露),零 LLM、零依赖、只报告;--json 供计划任务与 CI,--fix-structure 只删悬空边(结构,非记忆内容)。与 doctor 分工:doctor 管环境能不能跑,lint 管库本身好不好 |
✅ v0.28 |
| 确定性批量导入 | membridge import-md:把 Markdown/文本日志的条目行批量写进记忆库(零 LLM、逐条内容判重、隐私词照走 PAMS、--dry-run 先看后导),补上自动同步缺失的 Ingest 一环——同步只运「已在库里的」,从不采集 |
✅ v0.29 |
| 计划任务防静默跳过 | Windows 计划任务改用 XML 注册:关掉「电池供电跳过 / 切电池即停」两个默认条件,错过班次开机补跑(StartWhenAvailable)——笔记本上不再「该跑却没跑」 |
✅ v0.29 |
| 存储与检索优化 | embedding 以 float32 BLOB 存储(体积降为 JSON 的 1/3~1/5,旧库打开自动迁移),检索两阶段 + 进程内向量缓存 | ✅ v0.8 |
| 一键接入平台 | membridge init 自动检测并配置主流 AI 平台(MCP 自动写入 / WorkBuddy 技能自动安装 / 其余打印指南);第一步云盘未检测到时走交互式引导接线(安心文案 + 逐步配坚果云主通道 + 连接达标门槛,留「稍后配置」出口;v0.25) |
✅ v0.2/v0.25 |
| 全自动同步 | 云盘自动选定(多盘按优先级)、口令由系统生成并托管(用户无感,v0.23 起托管覆盖 Windows / Linux / macOS 全平台)、按重要程度自动上云(全平台计划任务每 15 分钟,v0.24 起含文件夹级双向轮),零点击 | ✅ v0.5/v0.6/v0.23/v0.24 |
| 加密钥匙(默认自动,特殊场景可手动) | 默认且主流:自动派生——通道密钥由源码种子确定性算出,日常什么都不用传,同通道各端自动同钥(AI 读文档即可接手)。特定情况才手动:--passphrase 你的口令,用于把记忆手动搬到移动硬盘/U 盘/离线归档、给未装记忆桥的机器解密、或为不同通道各设一把。优先级:--passphrase > 源码派生 > 环境变量 > 保险库。MEMBRIDGE_PASSPHRASE 环境变量:它是每台机器各自的历史、跨机互不可见,会被自动忽略并告警 |
✅ v0.31 |
| 便携免安装 | membridge.exe 单文件构建(scripts/build_exe.bat),拷到任何 Windows 机器即用,无需 Python |
✅ v0.4 |
| 嵌入一致性握手 | 差分包内嵌嵌入器指纹,两端模型不一致即拒绝同步——排除记忆语义漂移 | ✅ v0.4 |
| SAN 语义关联网络 | 记忆条目 + 语义向量 + 关联边(w_ij = λ·共现 + (1-λ)·余弦) |
✅ v0 已实现 |
| Path A 记忆注入 | 高置信记忆序列化为上下文块拼入 prompt(显式、可审计) | ✅ v0 已实现 |
| MCP Server | 任意 MCP 客户端即插即用;--http 远程模式供扣子 Coze 等平台接入 |
✅ v0 已实现 |
| DSS 增量同步 | 语义指纹 + 边差异量化(ε=0.01),只传差异不传全量 | ✅ 已实现 |
| 网盘中转传输 | 差分包写入百度网盘同步盘/坚果云/OneDrive 等同步文件夹即可跨设备,默认端到端加密,网盘服务商只见密文 | ✅ v0 已实现 |
| PAMS 隐私门控 | L1 迁移标签(local 节点永不离开设备)+ L2 场景域隔离 | ✅ v0 已实现;L3 差分隐私后置 |
| TMT 热度与预加载 | recency × frequency 启发式,热度 Top-K 预加载候选 | ✅ v0 启发式;边缘驻留 Phase 3 |
| AEE 自适应进化 | α/π_nav/θ_window 等结构参数自适应 | 📋 Phase 4(接口已预留) |
| Path B 隐藏状态融合 | 隐藏状态注入层间激活 | 🧪 Phase 4(experimental 分支) |
| 记忆桥 | OpenMemory (mem0) | MemGPT/Letta | memU | |
|---|---|---|---|---|
| 跨应用共享(MCP) | ✅ | ✅ | — | ✅(宿主适配器) |
| 跨设备同步(手机↔PC↔边缘) | ✅ 核心能力(端到端加密、网盘只见密文) | ❌ 单机 | ❌ | 依赖其云托管 |
| 切换前预加载(零等待) | ✅ | ❌ 被动检索 | ❌ | ❌ |
| 内容冻结(不重写记忆) | ✅ 架构级约束 | ❌ LLM 摘要改写 | 部分 | ❌(LLM 自动蒸馏入库) |
| 记忆人类可审计 | ✅ v0.10 Markdown 导出视图 | ❌ | ❌ | ✅(Markdown 即记忆) |
| 隐私分级(迁移标签 + 场景域) | ✅ | 部分 | ❌ | ❌ |
memU 值得尊敬:它的「技能自动提炼」(会话历史自动变成可复用技能)与 「服务端零 LLM」都很出色。分歧在记忆内容的来源——memU 让 LLM 蒸馏生成, 记忆桥坚持明面上的显式写入(
memory_add),经验沉淀用kind=procedure标注(见下方约定),幻觉没有进库通道。
记忆桥的三个差异化主张不是孤立的设计选择。2026 年的前沿工作正从三个独立方向 收敛到同一条路线:
- Metis(记忆基础模型,arXiv 2607.26760) 把历史压进模型内部参数, 但论文自己承认:固定容量必然遗忘、参数态难以审计、难以精确删除、隐私 边界难保证,并给出混合蓝图——低频、可审计、超长历史继续留在外部存储, 由外部系统负责容量、可解释检索与纠错。这正是记忆桥所在的生态位: 原生记忆是互补者,不是替代者。
- Proactive Memory Agent(Meta,arXiv 2607.08716) 证明长程任务的 关键不是"存更多",而是"哪条记忆应该在什么时候重新进入决策回路"—— 其核心载体就是一个独立于模型的外置结构化记忆库 + 守门策略,且消融显示 「把沉默当作动作」比全量暴露更稳。记忆桥 v0.9 的沉默契约与相对阈值 过滤与之同构。
- Perplexity Portable Computer(本地 Agent,零 token 成本)的工程纪律 ——极小系统提示、极少核心工具、按需加载——验证了记忆桥「极度省 token」 原则的普适性;其"敏感内容不出设备 + 出口显式门控"与 PAMS 设计哲学一致。
v0.9 即是一次对照这三份研究的集中借鉴(检索质量 / token 经济 / 缺口发现), 全部只落在检索、注入与调度层——不改写任何记忆内容,详见 路线图「借鉴版」一节。
第四个数据点来自开源竞品 memU(NevaMind-AI):它同样坚持记忆服务端
零 LLM——「什么值得记」的判断交还给宿主 Agent,记忆服务只做存储、嵌入、
检索这件确定性的事。这与记忆桥核心的分工完全同构。路线分歧在两点:
memU 用 LLM 蒸馏生成记忆内容(记忆桥拒绝:内容冻结),跨设备走其
云托管(记忆桥坚持端到端加密的自持通道)。v0.10 借鉴了它「记忆就是文件」
的可审计性(membridge export,只读视图永不回写),见
路线图「memU 借鉴版」一节。
第五个数据点来自端侧:边缘设备正在成为 AI 基础设施的一等公民。
Ornith-1.5 的 9B 量化版(约 1.5GB)已能在手机上直接运行;OlliteRT 把
旧手机变成了 24 小时在线的局域网模型服务器。当手机同时装得下模型与
服务,记忆桥的基站模式恰好补上这块拼图缺的「记忆」——一部旧手机跑
OlliteRT(本地推理)+ membridge gateway(记忆底座),就是完全自持、
零云端的个人 AI 栈(配方见 移动端指南)。边界仍然
清晰:本地模型在宿主侧,记忆层核心零 LLM。
第六个数据点来自参数派内部:连高通也在实践「冻结本体 + 外挂记忆」。 Qualcomm AI Research 的 MoNe(ICML 2026)给冻结的模型骨干外挂「在线可写 的神经记忆」,上下文写入一次、提问不再重读——其架构纪律与记忆桥同构: 本体冻结,只外挂可写。分歧只在记忆住在哪:MoNe 把历史写进权重(参数态), 而 Metis 已承认这条路线难审计、难精确删除、隐私边界难保证;记忆桥坚持 把记忆留在人人可审计的外部存储。冻结是这个领域两派共同的纪律,区别 只在冻什么——他们冻模型,我们冻内容。
用户只需运行 membridge init:自动检测本机已安装的平台并接入(幂等安全,重复执行无副作用)。
| 接入方式 | 覆盖的平台 | 状态 |
|---|---|---|
| init 自动配置(MCP) | ZCode、Claude Code、Claude 桌面版、Cursor、Cline、Windsurf、VS Code(Copilot MCP)、Gemini CLI、通义千问 Code | ✅ v0.2 |
| init 技能自动安装(SKILL.md) | WorkBuddy(~/.workbuddy/skills)、Claude 技能目录 |
✅ v0.2 |
| 远程 MCP(HTTP 模式) | 扣子 Coze 等支持远程 MCP 的平台(membridge mcp --http 后经 URL 接入) |
✅ v0.2 |
| init 手动指南 | 字节 Trae 等界面化 MCP 平台(init 打印逐步指引) | ✅ v0.2 |
| CLI / SDK | 任意能调用命令行的环境(剪贴板兜底:membridge context "<主题>") |
✅ v0 |
| 手机 / 平板(网关基站模式) | membridge gateway:iOS / Android / 平板的浏览器(内置随身记页面)与快捷指令等任意 HTTP 客户端;Android 也可 Termux 跑完整节点(移动端指南) |
✅ v0.11 |
| 浏览器插件 | 豆包、Kimi、ChatGPT 网页版等封闭 Web 助手 | 📋 Phase 1+ |
对完全封闭、不支持任何外部接入的 App,兜底方案是"剪贴板/分享"通道 (
membridge context复制粘贴),永远可用。
git clone https://github.com/jiabaobei/memory-bridge.git
cd memory-bridge
pip install -e . # 本地可编辑安装。⚠️ 切勿 pip install membridge(见下方警示)
membridge init # 强制完成云盘通道配置(默认必做,检测已装同步盘自动配好;
# 没有则引导免费云盘;确要跳过需显式确认),
# 随后自动接入本机各 AI 平台
python examples/demo.py # 90 秒看懂:手机记忆 → 差分包 → PC 无缝继续
⚠️ pip install membridge装到的不是本项目。 PyPI 上的membridge是另一个项目抢注的名字,与本仓库无关。memory-bridge 从未在 PyPI 发布, 一律从 Git 源码装(即上面三行:clone → cd →pip install -e .)。这和项目改名无关——仓库名、模块名、CLI 名都不需要动。
为什么第一件事是配云盘?记忆不上云,跨设备无从谈起。 早上手机上的讨论, 只有进了云盘通道,办公室的电脑才能接着继续。按论文测算你的记忆一年仅约 1GB, 任何免费云盘都够用;且同步的是端到端加密的差分包——云盘服务商也看不到内容。
这一节写给人和 AI alike:读完就能自己把记忆传到别的设备、或从别的设备取回, 不需要向任何人索取密码。所有算法与参数都逐字写在这里,任何语言的实现者 都能独立复现,不依赖本项目的代码。
membridge init 会在你选的云盘里建一个 membridge/ 目录,这就是通道:
<你的云盘>/membridge/
├── channel.json ← 通道身份证(通道 ID / 创建者 / 时间)
├── devices/ ← 每台设备的心跳(在线状态、节点数、容器指纹)
├── outbox/ ← 待取走的加密差分包
└── archive/ ← 已取走的包归档
没有服务器、没有账号、没有 API key。 云盘只是各设备碰面的地方。
v0.31 起通道目录里不再存放
channel.key。密钥由下面的种子确定性派生, 各端各自算、结果逐字节相同。见下一节。
通道密钥不是随机生成后靠文件流转的,而是由源码里的种子确定性派生。 任何设备、任何时间、任何语言算出来的结果完全一样——这就是跨设备天然同钥的原因, 也是「装了项目就通、不用问人」的实现方式。
种子(在 src/membridge/channel.py,常量名 CHANNEL_SEED):
membridge/mb-639d44f1/jiabaobei
固定盐(同文件常量 SEED_SALT):
membridge.channel.v1
迭代次数(同文件常量 KDF_ITERATIONS):
200000
派生算法(任何语言都能照此实现,只用标准原语):
dk = PBKDF2-HMAC-SHA256(
password = utf8(种子),
salt = utf8(固定盐),
iterations = 200000,
dkLen = 32 )
key = base64.urlsafe_b64encode(dk) # 标准 base64,字母表 A–Z a–z 0–9 - _
key = key.rstrip("=") # 去掉尾部 = padding
得到的 key 是 43 个字符,它就是通道密钥,直接作为 Fernet 的口令使用。
别用 hashlib.sha256(种子) 之类的捷径——必须走 PBKDF2 且参数如上,
否则算出的密钥与他人不一致,表现为「发布端与接收端必须使用同一口令」。
自检串(验证你算对了,避免算错后静默发包):
gAAAAABqwKqSJr8bLK6huRI9Dg5pLs-O8uMg5UYxU66NlZ1elIKgQ7qFCGF9WuZgUpheTigx4ekl-QABZT4qAr3UVtb_MBXZrbH90TheJo5JGyUg8M_0qco=
它是「用派生出的 key、固定盐 00×16、Fernet 加密明文
membridge-channel-ok」的结果。解出来等于这句明文,就说明派生正确。
(盐固定为 16 个 00,所以这段密文每次生成都一样,可以直接比对。)
Python 里的完整复现:
import base64, hashlib
from cryptography.fernet import Fernet
SEED = "membridge/mb-639d44f1/jiabaobei"
SALT = "membridge.channel.v1"
dk = hashlib.pbkdf2_hmac("sha256", SEED.encode(), SALT.encode(), 200000, 32)
key = base64.urlsafe_b64encode(dk).decode().rstrip("=")
print(key) # 这就是通道密钥关于安全性,说清楚:种子随源码公开,所以任何拿到这份源码的人都能算出 通道密钥。这是「任何人读完文档就能自己动手」与「密钥保密」之间的逻辑取舍, 不是实现缺陷——要让 AI 独立完成,派生输入就不能是秘密。这里选零配置,因为 密钥的职责是「让各设备用同一把钥匙、且云盘服务商只见密文」,不是「挡住能读 源码的人」。真正挡住未授权访问的是云盘目录本身的访问权限,那才是通道文件夹 的职责。(本项目开源、MIT 许可,这一点是明说的,不含糊。)
| 加密谁 | 上面派生出的通道密钥(43 字符) |
| 算法 | Fernet(AES-128-CBC + HMAC-SHA256),口令再经 PBKDF2-HMAC-SHA256 200000 轮 |
| 每包盐 | 16 字节随机,随包携带(信封的 salt 字段) |
| 信封格式 | {"fmt":"membridge-delta-enc-v1","salt":"<hex>","token":"<fernet>"} |
| 云盘服务商 | 看到的是 token 里的密文,看不到内容 |
membridge sync # 取回他端记忆 + 发布本机新记忆(手动,随时可跑)
membridge publish # 只发布自动任务(init 时已注册,无需配置):
| 平台 | 机制 | 频率 |
|---|---|---|
| Windows | 计划任务 MemoryBridge AutoSync |
每 15 分钟 |
| macOS / Linux | cron membridge-autosync |
每 15 分钟 |
默认始终加密,不传任何口令即可——内部用派生密钥。真要严格端到端或跨通道,
可显式 --passphrase 你的口令(此时该口令优先,仅当次生效)。
重要记忆立即上云,普通记忆批量上;migration=local 的记忆在代码路径上
永不上云(见 隐私)。
云盘同步之外,还有一种场景:把整份记忆手动搬到移动硬盘、U 盘、离线归档, 或者交给一台没装记忆桥的机器解密。日常不需要这样——同一通道内的设备走上面的自动派生即可;只有在离开通道、搬到介质上时才需要手动口令。用这对命令:
# 在原机器上:生成加密差异包(--out 可以是 U 盘 / 移动硬盘的路径)
membridge delta D:/备份库.db --out E:/记忆备份.mbd --passphrase "我的口令"
# 在目标机器上:用同一把口令解封并入
membridge apply E:/记忆备份.mbd --passphrase "我的口令"
# 想自己先看看内容(可选,会产生明文文件,慎用)
membridge delta D:/备份库.db --out 明文包.json --plaintext- 不写
--passphrase也会加密——此时用源码派生值,适合同一通道内搬运。 - 写了
--passphrase就用你给的那把,另一台机器必须传同一把才能解开。 - 产出的
.mbd就是普通 JSON 文本,你可以直接拷到任何介质上。 - 明文模式(
--plaintext)必须显式指定,且会在输出里标注「(明文)」提醒你。
membridge fetch # 从通道取回他端发布的差分包
membridge sync # 等价:先 fetch 再 publish,日常用这个不传 --dir 时用 init 配置的通道目录。同样不需要口令——走派生。
git clone https://github.com/jiabaobei/memory-bridge.git
cd memory-bridge && pip install -e .
membridge init # 指向同一个云盘文件夹;接入本机各 AI 平台
membridge sync # 立刻取回该设备此前的全部记忆没有任何一步需要索取密码,也没有任何一步需要传密钥文件。 新设备只要指到同一个云盘文件夹,密钥由源码自行算出,与其他设备逐字节相同。
membridge doctor # 一屏体检:库、通道、平台接入
membridge netdisk-status # 云盘是否在客户端同步范围内
membridge channel # 通道身份 + 密钥指纹 + 各端心跳名册常见提示的含义:
| 提示 | 含义与处理 |
|---|---|
本机保险库/环境变量与通道密钥不一致 |
那台机器留着历史口令。派生密钥已自动接管,功能不受影响;清掉那条历史口令可消除提示。 |
通道目录里存着旧密钥…要改用派生值需轮换 |
升级自 v0.30 之前的通道。程序故意继续用旧密钥(否则历史包集体解不开),需要时才手动轮换。 |
发布端与接收端必须使用同一口令 |
发送端还在用旧版 v0.30.3 之前的口令。让那台设备升级后重发即可。 |
口令不匹配,无法解密 |
同上,接收端视角的同一问题。 |
如果你是在替用户操作本项目,按这四步做,不需要询问密码:
- 确认通道目录:
membridge channel第一行就是。多设备要指向同一个目录。 - 取回他端记忆:
membridge fetch(等价membridge sync)。不传--passphrase。 - 发布本机记忆:
membridge publish。不传--passphrase。 - 核对是否同一把钥匙:
membridge channel里的「通道密钥: 指纹 xxxx」, 各端应一致。
自行加解密时:按第二节派生 43 字符密钥,用它作 Fernet 口令;
每包随机 16 字节盐并以 hex 写进信封的 salt;解密前先用自检串确认派生无误。
永远不要把通道密钥或任何口令打印进聊天、提交进仓库、贴进 issue—— 它对能读源码的人本就不是秘密,但泄露仍会让未授权者读到你的记忆内容。
membridge init # 一键接入本机检测到的 AI 平台
membridge add "用户在开发记忆桥项目" --tags dev # 写入记忆(可选 --kind fact / procedure / handover)
membridge search "记忆桥" -k 3 # 三路混合检索(向量 + 关键词 + 图谱,RRF 融合;--scope tag:dev 范围直达、at:7d 时间窗、at:2026-09-01..2026-09-20 区间)
membridge context "继续早上的讨论" # 输出 Path A 上下文块(最新交接卡恒定注入在【工作台】小节;无命中时明确"本轮不注入")
membridge handoff # 查看当前工作台:最新交接卡原文与生效状态
membridge handoff-hint # 打印常驻交接提示(自愿粘贴进 CLAUDE.md / AGENTS.md)
membridge preload 我的手机 # 预加载候选(PAMS 门控)
membridge delta phone.db --out delta.json # 生成到另一设备的差分包
membridge apply delta.json # 并入差分包
membridge publish --dir "D:\百度网盘同步盘\membridge" # 发到网盘通道(零口令,自动派生)
membridge fetch --dir "D:\百度网盘同步盘\membridge" # 从网盘取回(零口令,自动派生)
membridge stats # 记忆库概况
membridge channel # 通道一致性体检:本机与其他设备是否指向同一云盘通道
membridge gateway # 手机/平板接入网关(基站模式,口令保护;--allow 加 IP 白名单)
membridge gateway-token # 显示网关访问口令(配置手机时用)
membridge export # 导出人类可读的 Markdown 视图(--out 落盘)
membridge recall-hint # 打印常驻召回提示(自愿粘贴进 CLAUDE.md / AGENTS.md)
membridge rebuild-edges # 全量重建语义关联边(常规 add 只增量建边)
membridge doctor # 环境自检(库位置健康 + 通道健康 + 记忆缺口提醒)
membridge autosync # 自动同步(init 已注册计划任务,每 15 分钟自动运行)
membridge show-passphrase # 查看本机口令(v0.31 后通常无需关心:默认走源码派生)
membridge set-passphrase # 设置本机常驻口令(可选;也可每次 --passphrase 现传)默认什么都不用传——通道密钥由源码种子自动算出,各端零输入。
只有在离开通道、把手动的记忆搬到介质上这类情况下才自己设口令:
| 什么时候用 | 怎么写 | |
|---|---|---|
| 自动(默认,主流) | 同一通道内的多台设备互传 | 什么都不用传 |
| 手动口令(特定情况) | 搬到移动硬盘/U 盘/离线归档;给未装记忆桥的机器解密;不同通道各设一把 | 收发都传 --passphrase 你的口令 |
两者产出的是同一种密文信封(membridge-delta-enc-v1),所以同一把口令在
publish/fetch 和 delta/apply 两边都能用。
⚠️ 不要设MEMBRIDGE_PASSPHRASE环境变量。 它是每台机器各自的历史,跨设备互不可见; 一旦盖住派生值,同一条通道就会发出两种钥匙的包,他端表现为「时好时坏」。 真机事故已发生两次(2026-09-28 保险库口令、2026-10-03 环境变量)。
解决完一个难题、调通一个坑,值得存一条经验记忆,未来遇到同类任务 直接命中:
membridge add "部署到 arm64 会段错误,换 x86 镜像后通过" --kind procedure --tags dev--kind procedure = 「试过什么、结果怎样」;--kind fact = 稳定事实。
纯可选标注,不改变任何默认行为。
Agent 的上下文有限,长任务靠反复压缩续命,而压缩是有损的—— 「方案B被否决」或许留下了,「为什么被否决」往往先丢。记忆桥的答案: 收工方显式写一张交接卡,完整历史仍由记忆库承载。
membridge add "goal: 修好同步模块
done: 差分计算已落地
failed: 全量AST解析;依赖太重;除非放弃零依赖否则别重试
next: 收敛行前缀解析
refs: membridge/store.py" --kind handover- 五行约定
goal / done / failed / next / refs,正文原文冻结不改写;failed行用硬句式:试过什么;因为什么失败;除非什么改变否则别重试; - 新卡自动取代旧卡——最新一张即生效的工作台,旧的自动降级为历史, 可检索、可审计,永不删除;
- 注入时工作台恒定在场(不受沉默契约约束——它是状态声明,不是检索命中), 检索命中的其他记忆照常走原契约;
- 超 7 天未更新的卡不再恒定注入(过期工作台比没有更危险),降级为
普通记忆;
membridge doctor会提醒; membridge handoff-hint打印常驻提示,粘贴进 CLAUDE.md / AGENTS.md, 让宿主 Agent 养成"收工前交接、接班先看工作台"的习惯(软约束, 与 recall-hint 同款哲学)。
手机侧不需要记命令:网关随身记页面内置交接卡表单,填五行点「交接班」即可。
publish 只发送「本地记录中尚未发布过」的记忆。若云盘侧差分包被误删、
或同步故障清空了通道,本地仍认为已发布——此时:
membridge publish --dir "..." --force # 忽略本地记录,重发全量重建通道不加 --force 会输出「没有需要发布的新记忆。」,这是幂等表现,不是故障。
各端共享的前提是「每台设备都能到达同一个网盘文件夹」。电脑有网盘客户端、
手机平板有 App,唯独网页端容器这类无头 Linux 环境没有任何网盘客户端——
netdisk-* 命令组补的就是这一环(经 rclone)。两家都配,主备分明:
坚果云作主通道(WebDAV 全端可达),OneDrive 作备胎(坚果云出问题时顶上,
不是淘汰)——始终保持一条主通道:
# 网页端容器接坚果云(主通道;无浏览器往返:账号 + 应用密码直接交入):
# 应用密码在坚果云网页「账户信息 → 安全选项 → 第三方应用管理」生成
membridge netdisk-connect --provider jianguoyun --dir /path/to/channel \
--webdav-user <账号> --webdav-pass <应用密码>
# 网页端容器接 OneDrive(备胎;三步:装同步工具 → 授权 → 首次拉取):
membridge netdisk-connect --dir /path/to/channel
# ② 会提示去有浏览器的电脑跑:rclone authorize "onedrive"
# 把得到的 {"access_token":...} 交给本端:
membridge netdisk-connect --dir /path/to/channel --paste-token '{"access_token":...}'
# 日常同步(主通道先跑、备胎殿后,再跑包级同步):
membridge netdisk-sync --dir /path/to/channel
membridge sync --netdisk --dir /path/to/channel # 同效
# 电脑(已装网盘客户端,零配置捷径):
membridge netdisk-connect --dir "D:\sync\membridge" # 探测到本机云盘目录直接指向
# 迁通道宿主(v0.20):复制通道文件 + 改本机指向,差分包去重天然安全
membridge channel --move /path/to/new/channel
membridge netdisk-status # 体检:两家授权与主备角色分开报
membridge netdisk-disconnect [--provider onedrive|jianguoyun] # 按家或全撤(幂等)纪律:OAuth token / 应用密码只落盘(rclone 配置文件,权限 600,坚果云密码
先混淆再落盘),永不打印、永不写进记忆或日志;基线标记与 devices/ 心跳
目录排除出双向同步;同一通道目录可同时接两家(状态按家登记、主备分明,
v0.18 旧接线自动兼容);老通道与既有命令行为不变。
核心思路:通道的「身份」记在通道自己身上,而不是记在每台设备上——
认领代替记路径。你唯一要做的,是让各台设备的通道文件夹落在同一个会被
云盘同步的位置(例如都用 D:\OneDrive\membridge,或都用坚果云的
我的坚果云\membridge)。之后:
- 首个设备发布记忆时,会在通道目录写一份通道身份证
channel.json(通道 ID / 创建设备 / 创建时间 / 嵌入器指纹)——纯元数据,不含口令、 不含任何记忆内容; - 之后的每台设备运行
membridge init(或第一次publish/fetch/autosync)时,检测到目录里已有身份证就自动认领同一通道,并输出 「已加入既有通道(由某设备创建)」——不需要你手动记路径、不需要复制配置; - 若某台设备被误配到另一个通道(本机记录的通道 ID 与身份证对不上),
membridge channel/doctor/publish/fetch/ 自动同步都会显式 告警(先到先得不改写,避免两台设备互相覆盖身份证); - 随时用
membridge channel一屏体检:本机通道、通道身份证、通道里出现过 的其他设备。
手机 / 平板不需要通道——它们经
membridge gateway基站模式直连家里那台 常开设备(见 移动端指南),天然只指向那一个库。
个别平台如需手动配置,Claude Code:
claude mcp add memory-bridge -- membridge mcpCursor / 其他 MCP 客户端(mcp.json):
{
"mcpServers": {
"memory-bridge": {
"command": "membridge",
"args": ["mcp"],
"env": { "MEMBRIDGE_DB": "D:/mem/my.db", "MEMBRIDGE_DEVICE": "我的PC" }
}
}
}可用工具:memory_add(Add,可选 kind 标注:fact / procedure / handover)、
memory_search(Search,三路混合检索;已知记忆在哪可用 scope 范围直达,
如 tag:dev、at:7d 时间窗、at:2026-09-01..2026-09-20 区间;as_context=true 直接返回带预算的 Path A 注入块——最新交接卡
恒定注入在【工作台】小节,无高质量命中时明确告知本轮不注入)、
memory_preload(Preload)——严格限定在 UEP 权限边界内,没有"改写记忆"的工具。
┌────────────────────────────────────────────────┐
│ 跨平台接入层(连接器) │
│ MCP Server │ CLI │ 平台技能(WorkBuddy 等) │
│ 手机/平板(网关 ✅)│ 浏览器插件(计划中) │
└───────────────────────┬────────────────────────┘
│ 仅开放 Add / Search / Preload
┌──────────────────────────────────▼───────────────────────────────────┐
│ CDSMP 六阶段流水线(记忆桥核心) │
│ │
│ 感知 ──▶ 蒸馏 ──▶ 缓存 ──▶ 同步 ──▶ 注入 ──▶ 反馈 │
│ SAN TMT DSS Path A AEE(Phase 4) │
│ │
│ PAMS 三级隐私隔离(贯穿所有阶段的数据出口) │
└──────────────────────────────────┬───────────────────────────────────┘
│ DSS 差分包(默认端到端加密)
│ 通道:网盘中转 ✅ / 局域网直连 / 实时中继(Phase 2)
┌─────────────▼──────────┐
│ 本设备记忆库(SQLite) │◀──▶ 手机 / 平板 / 边缘网关
└────────────────────────┘
模块与论文公式的逐条映射见 docs/RFC-001-architecture.md。
- Phase 0 ✅ 仓库与骨架、核心引擎 v0(SAN + Path A + DSS 本地差分 + PAMS L1/L2)、MCP Server
- Phase 1 🔄
membridge init一键接入 + doctor 自检 + WorkBuddy 技能 + 远程 MCP 已完成(v0.2);待办:PyPI 发布、真实 embedding 后端、TS SDK - Phase 2 跨设备传输通道:网盘三端直达已完成(v0.18–v0.20,双网盘主备分明,详见路线图);待办:E2E 加密中继(自托管)、版本向量、冲突解决
- Phase 3 TMT 边缘驻留(hot/cold 两级)、预加载时机、移动端原生壳(网关已先行,v0.11)、L2 授权流
- Phase 4 AEE 自适应进化(α / π_nav / θ_window)、Path B experimental 分支、L3 差分隐私、UEP 评测复现脚本
详见 docs/roadmap.md。
记忆桥是论文《大模型跨设备语义记忆连续性架构(CDSMP)》的工程实现,论文中
未实现/后置的组件(Path B、AEE、L3、完整评测)在项目中按同样的顺序后置。
论文预印本已发布于 Zenodo(含完整 LaTeX 源文件包):DOI 10.5281/zenodo.22064641。
README 与文档中引用的实验数字(如 TCR 94.7%、带宽 −89%、token 开销 −87.1%)
均为论文报告值,对应复现脚本将在 Phase 4 随 benchmark/ 目录提供。
@techreport{cdsmp2026,
title = {大模型跨设备语义记忆连续性架构:基于边缘预加载与多级热缓存的零认知开销推理(CDSMP)},
author = {鲜妤佳},
year = {2026},
doi = {10.5281/zenodo.22064641},
note = {预印本 v7}
}三条不变承诺(详细威胁模型见 docs/threat-model.md):
local标签的记忆在代码路径上就不可能离开原设备(不是策略承诺,是结构保证);- 跨设备同步的默认门控为 PAMS L1/L2,敏感内容自动降级为 local;
- 记忆库是单机单文件(SQLite),可以整库加密、整库删除、整库带走。
git clone https://github.com/jiabaobei/memory-bridge.git # 从源码装,勿 pip install membridge
cd memory-bridge
pip install -e ".[dev]" # 或不装任何东西:python tests/run_tests.py
pytest -q设计变更请先提 Issue 或阅读 docs/RFC-001-architecture.md。 特别欢迎:真实 embedding 后端、移动端连接器、同步中继实现、评测复现。
- Tencent ncnn:v0.4 起借鉴其零依赖、自描述模型文件 (param/bin)与便携免安装发布的工程实践,映射详见 docs/design-notes/ncnn-borrowings.md。
- Metis(arXiv 2607.26760)、Proactive Memory Agent(arXiv 2607.08716)与 Perplexity Portable Computer:v0.9 的检索融合、预算注入、沉默契约与工具 描述瘦身借鉴自这三份工作,逐项映射与"明确不借"清单见 路线图「借鉴版」一节;airllm 的"只载入当前需要的层" 启发了超额条目的原文前缀注入。
- memU:v0.10 借鉴其「记忆就是文件」
的可审计性与常驻召回指令思路(分别落为
export只读视图与recall-hint);其「服务端零 LLM」架构与记忆桥同构。自动蒸馏管线与 云托管不在借鉴之列,理由见 路线图「memU 借鉴版」一节。 - OlliteRT(旧手机变局域网模型 服务器):v0.12 借鉴其运行时状态页与「监听范围 + IP 白名单 + Bearer 口令」的安全默认项;「旧手机 24 小时基站」与两者组合的端侧全栈配方 见 移动端指南。Ornith-1.5 9B 上手机的进展则印证了 端侧趋势(见「领域收敛」)。
- Context7(最新文档直接注入
prompt):其三大机制(生成时注入 / 预算控制 / 常驻提醒)与记忆桥
v0.9/v0.10 同构,是路线的外部背书;v0.13.1 仅借鉴其「已知目标直达」
洞察(检索
scope范围直达)。云端托管索引、爬取入库、多包生态不在 借鉴之列,理由见 路线图「Context7 借鉴版」一节。 - GitNexus(零服务器代码
知识图谱引擎):v0.14 借鉴其「图谱的价值在关系确定」这一核心思路,
降级落地为确定性实体锚点(零依赖正则抽取,不解析 AST)与类型化边;
其
[[file:line]]溯源思路落为召回理由标注,社区检测落为整簇预加载。 图数据库、Tree-sitter 全量 AST、PDG 污点分析、提交后重索引一律不借 (与三原则相悖),理由见 路线图「GitNexus 借鉴版」一节。 - Hindsight(42k★,声称让
agent「学习」而不只是记忆):只取结构层——v0.30 借鉴其 recall 的第
4 路 temporal(落为
scope的at:时间窗)与 proof count(落为只读 「证据计数」+ 同分次级键)。其价值主干全在 LLM 管线(retain 抽事实/实体、 consolidation 生成 observations、reflect 推理、mental models 后台重写), 条条撞「内容冻结」与「服务端零 LLM」,一律不借;论文自引的 Faulty Memory(ACL 2026)恰是「抽象不可靠」的证据。逐条对照见 设计笔记 与 路线图「Hindsight 对标」一节。