乐于分享
好东西不私藏

告别"我刚才说什么来着"—给你的 AI 助手一个靠谱的大脑

告别"我刚才说什么来着"—给你的 AI 助手一个靠谱的大脑
作者 |婴宁

导读:Octop 是腾讯云开源的自托管 AI 助手平台,支持多用户、多 Agent 协作。OctopMemory 是其记忆内核,通过证据溯源、冲突检测、分层存储和受控召回,让 Agent 的记忆从“能存能搜”走向“可信、可控、可迁移”。

Octop 是什么

Octop 是腾讯云自研并开源的 AI 助手平台,专为个人、家庭和小团队设计。

Octop 项目地址:

github.com/TencentCloud/Octop

它的核心理念是本地优先、数据归属用户:一个进程即可运行 Web 面板、CLI、IM 通道和定时任务,所有对话、工作区和凭证都存储在用户自己的机器上,不经过第三方服务器。

Octop 支持多用户隔离、多 Agent 并行,每个 Agent 可配置不同的大模型和工具集,还内置了专家库、远程桌面、浏览器自动化等能力。你可以把它理解为——一个跑在自己机器上的、可定制的 AI 团队。

而 OctopMemory,是 Octop 的记忆内核。它要解决的不是“让 Agent 记住”,而是“让 Agent 记对”。

为什么要重做记忆

在实际使用中,Agent 记忆出错往往不是因为“忘了”,而是因为“记混了”。

一个典型场景:你对 AI 助手说过“这个项目暂时先别上 Postgres,本地 SQLite 够用”。两周后再问,它却回答“用 Postgres 做主库”——因为三个月前你确实这么说过,只是后来方案变了。

AI 同时检索到了新旧两条记忆,却无法判断哪条仍然有效,于是选了一条看起来更完整的。

它没有忘记,但它记错了。

忘记,最多让你再说一次;记错,可能让一个过期结论变成下一步行动的依据。

当记忆越来越多,新的问题浮现:

  • 找到的内容,是用户原话,还是模型的改写?
  • 新旧事实冲突时,该信哪一条?
  • 一段经历和一个稳定事实,应该混在一起吗?
  • 记忆换到另一个 Agent,还能继续使用吗?

OctopMemory 正是对这些问题的重新回答。它不再是某个助手内部的记忆模块,而是一层可以独立接入不同 Agent 的长期记忆基础设施。目标是:

让每条记忆有证据、有状态、有层次,并且真正属于用户。

证据可溯源

模型抽取事实时会改写,而改写最容易丢掉语气。

“暂时先别上 Postgres”,可能被压缩成“使用 Postgres”。只少了一个“别”字,意思正好相反。

所以在 OctopMemory 里,原始对话首先会作为 RawEvent 保存。它只追加、不改写,是后续所有记忆的证据源。

模型从中提取出 Candidate,通过价值、证据、实体、重复和冲突检查后,才会成为正式的 AtomCard。

最终留下的不只有整理后的结论:

该项目暂不使用 Postgres,先用本地 SQLite

它旁边还会保留用户原话:

“暂时先别上 Postgres 了,本地 SQLite 够用”

模型可以整理表达,但不能把证据改没。

一条无法溯源的记忆,和一次写得很像真的幻觉,没有本质区别。

冲突可检测

如果系统里已经有一条旧记忆:

该项目使用 Postgres 做主库

新决定到来时,OctopMemory 会检测两者是否冲突。

它不会让模型静默覆盖,而是把冲突交给人确认。

确认后,新事实生效;旧事实不会消失,而是被标记为“已被替代”,并退出默认召回范围。

什么时候变化、依据哪句原话、旧结论被什么替代——都有迹可循。

这样,两周后再问:

“那个项目数据库当时怎么定的?”

Agent 拿到的是当前有效的决定、时间和原话证据。那条已经过期的 Postgres 方案,不会进入候选列表干扰模型判断。

记忆不是一张可以反复擦写的纸,而是一段有来路、有变化、有去向的历史。

分层有结构

OctopMemory 的底层是一棵 root → branch → leaf 的记忆树。

树适合人理解和整理:一个人、一个项目、一个长期主题,都可以拥有自己的分支。

但树上的 leaf 不再保存另一份事实副本,而是指向 AtomCard,读取时再投影出内容。

这样,同一个事实不会在两个地方各存一份,改着改着变成两个版本。

在树之外,记忆还有清晰的层次:

  • RawEvent
     保存原始证据
  • Candidate
     保存等待核验的候选
  • AtomCard
     是当前事实的唯一真相源
  • Episode
     保存生活事件和情绪经历
  • EntityPage
     汇总一个人、项目或组织的相关事实
  • Journal
     记录每一次晋升、冲突、替代与清理

一句“我老婆叫小丽”和一句“我上周跟老婆吵架了”,因此不会再被混成同一种数据。

前者是需要核验的稳定事实;后者是需要被理解的生活经历。

系统不仅要拥有记忆,还要知道不同记忆应该被相信到什么程度。

召回有约束

长期记忆越积越多,不可能每轮全部塞进上下文。

OctopMemory 把写入和召回设计成两个相反方向:

  • 写入宁可多记。
    漏掉的记忆通常没有第二次机会,多记的内容之后还能去重和清理。
  • 召回必须克制。
    所有候选互相竞争,只有最相关、最重要、最可信、时间上最合适的内容才能进入提示词。

召回会解析问题、识别实体和时间范围,从事实、原话、实体摘要、生活事件以及可选的向量索引中收集候选,再经过重排、去重、多样性控制和 token 预算裁剪,生成一份可以直接交给 Agent 的精选摘要。

默认情况下,整个过程要在 200 毫秒、1500 token 内完成。

到达时限即交付当前最优结果,超出预算的部分按优先级裁剪;预算中会专门给用户原话留出空间,避免整理后的结论把证据全部挤走。

搜索解决的是“找得到”,记忆召回解决的是“此刻最应该想起什么”。

记忆可迁移

如果记忆只能留在某一个 Agent 里,它更像平台的资产,而不是用户的资产。

OctopMemory 因此把存储抽象成 MemoryBackend 协议。

核心只依赖 Python 标准库和 SQLite,默认使用 SQLite + FTS5;也可以切换到 PostgreSQL,或接入 Chroma、Qdrant 等可选向量索引。

它同时提供面向不同宿主 Agent 的适配层,也可以被其他 Agent 通过 Memory 或 MemoryService 接口直接接入。

整套记忆还能打包成一个 .hmpkg 文件,再导入另一个宿主环境。导入过程支持备份、幂等执行和完整性校验。

你更换模型、框架或 Agent 时,过去积累的事实、经历和偏好,不必全部从零开始。

记忆应该是用户的资产,不应该是某个 Agent 厂商的护城河。

一次记录,随处检索;换个 Agent,记忆也能一起走。

写在最后

好的 Agent 记忆,不是把所有对话都永久保存,也不是为每个问题搜索出最多的结果。

它应该知道:

  • 哪些内容只是说过,哪些已经核验
  • 哪些事实仍然有效,哪些已经被替代
  • 哪些是稳定事实,哪些只是某段经历
  • 此刻应该想起什么,又应该忘掉什么
  • 这些记忆从哪里来,最终又属于谁

我们想做的,不是一个什么都不忘的 AI。

而是一个知道什么是真的、什么已经改变、什么值得在此刻被想起的 AI。

Octop 项目地址:

github.com/TencentCloud/Octop

扫码加入 Octop 用户服务群 3:

如果你也在做 Agent、长期记忆或个人 AI,欢迎来提 Issue,或者扫码进用户群交流。

毕竟——

AI 最危险的不是忘记,而是带着十足的把握,记住了一个错误答案。

< 干货知识推荐 >

Octop正式开源,让AI从聊天助手变工作搭档

腾讯云Octop|开源贡献季·第一期

Lighthouse Agent焕新升级:管理更统一

相关学习资料