OpenClaw记忆替换Node.js Postgres后降低幻觉但提高延迟

AI老瞎编?把它的记忆从记事本换成数据库,世界清净了

别再让AI拿TXT当大脑了!我用Postgres给OpenClaw换了颗“固态硬盘”

拆掉OpenClaw原生markdown记忆,换用Node.js+Postgres API层,通过严格表结构、类型校验和不可变事实注入,彻底消除模型幻觉和上下文漂移,代价仅150ms延迟。

我彻底拆掉了 OpenClaw 自带的记忆功能,换成了 Node.js 加 Postgres 做的 API 层。原来那个记性实在太差,老瞎编东西。换了之后,模型乱编的概率直接降到零。

开头碰到的麻烦事

和很多人一样,我用 OpenClaw 自带那个 MEMORY.md 文件,几周后就撞墙了。我当时在做一个“认知效率分析器”,就是能跟踪深度工作、生成专注力热力图、还能预测疲劳风险的全栈应用。我指望 OpenClaw 帮我画系统架构、写项目文档。

但是项目一复杂,那个原生记忆简直是个灾难。它就是一个纯文本文件,结果变成了“瞎编发动机”。模型会特别自信地拿出三周前已经废弃的 API 设计当真理,或者完全忘掉刚刚商量好的数据库取舍方案。

LLM 往 .md 文件里写东西,根本没有任何结构上的保证。这就好比你让一个实习生拿小本本记所有事,结果他记了五十页之后开始前后矛盾,还特别肯定地告诉你错的才是对的。

于是我直接干掉原生记忆插件

我把 memory-core 插件整个关掉,重新做了一个强制性的执行层。不再让模型直接写文件,而是跑了一个轻量的 Node.js 加 Express 中间件,背后用严格的 PostgreSQL 数据库撑着。然后我把这一整套通过自定义工具调用,完全暴露给 OpenClaw 使用。

你可以理解成:之前是让模型自己拿草稿纸随便写,现在是我给它发了张带格子的答题卡,而且每个格子只能填特定类型的内容。填错了,系统直接不让交。

实际架构怎么跑

第一,严格数据库表结构。我建了几个专门的 Postgres 表,分别存系统架构规则、API 设计决策、功能路线图。每个表都有明确的字段类型和外键约束,就像停车位画好了线,车必须停在线里面。

第二,带类型的 API 契约。如果模型想记住某个设计取舍,或者记录一个新 API 路由,它必须调用 POST /memory/architecture 这个工具,并且传一个严格的 JSON 参数。这个 JSON 要能通过我的 TypeScript 接口校验。

这招特别狠。模型如果说“我记得数据库里用户表有个 phone_number 字段”,但实际上架构规则表里根本没这条,那调用就直接报错。模型没法硬编,因为后端不认。

第三,不可变的事实。当我问 OpenClaw 一个关于项目的问题时,工具层先去 Postgres 快速查数据,然后把精确的、带类型的规则塞进上下文窗口,模型才开始推理。换句话说,模型看到的是“当前时刻唯一正确的快照”,而不是一堆历史 markdown 笔记里互相打架的段落。

这就像你问路,我不会给你看过去三年的地图草稿,而是直接拿出一张最新的导航截图。模型根本没有机会读到旧信息,自然也就没机会瞎编。

这么搞的代价

代价很实在。每次工具调用大约多了 150 毫秒的延迟,不算大,但能感觉到。另外我花了一个周末写后端代码,处理 API 路由、参数校验、数据库连接这些事情。

你可能会问,值不值?我当时的想法是:与其每天花两小时排查模型编出来的假架构,不如花两天彻底断了它瞎说的根。

最终结果

上下文漂移直接归零。模型再也无法瞎编数据库结构,因为它被 Postgres 里的关系数据物理锁死了。如果某条架构规则更新了,数据库里老的记录会被覆盖掉,模型永远不会被巨型 markdown 日志里那些相互矛盾的笔记搞糊涂。

我觉得我们一直把智能体记性当成“存储”问题,实际上这是个“API 设计”问题。你不可能扔给 LLM 一张空白的文本文件,然后指望它在几百次对话里准确维护状态。你必须强迫它通过严格的工具边界来分类记录自己的“想法”。

打个比方:你不能让一个健忘的图书管理员靠脑子记几千本书的位置,然后每次让他自己写纸条贴在书架上。你得给他一个扫码枪,每本书入库必须扫条码,出库也必须扫条码,所有记录进电脑。这样他再健忘,电脑不会骗人。

我挺好奇有没有人已经彻底放弃原生记忆插件,换成外部数据库的?如果这个痛点很多人都遇到,我在考虑把这个 Node 仓库开源出来。

我把AI的记忆从草稿纸换成了数据库,它再也不瞎编了