您的位置首页 >人工智能 >

AI记忆系统测试 799 KB、零依赖 5 行代码跑起来

先核实这条消息指向哪个具体的开源项目或产品:799 KB、零依赖、5 行代码这些特征很有辨识度。

实测报告来自阿里云开发者社区。为了确认这个包真实存在、版本对得上,我核一下 npm registry。

包已核到:npm @rsrsai/memlite 0.3.1,11 月 9 日发布,registry 记录解包体积 818,095 字节。这条实测报告的细节可以逐项对上。

标题:799 KB 的记忆引擎:5 行代码跑起来,3000 条查询 176 毫秒

一句话概括:memlite 不是一个 “AI 记忆系统”,而是一个能塞进宿主程序里的记忆内核 ——799 KB 左右、运行零依赖、5 行代码就能跑,代价是它只做词面检索、数据明文落盘、只支持单写者。阿里云开发者社区 11 月 12 日那篇实测把它的数字全摊开了:npm 包 @rsrsai/memlite 0.3.1 整个 node_modules 只有 818,724 字节、一个包,3000 条记忆占 1,179,427 字节(一条约 413 字节),单条查询 p50 176.1 毫秒、p95 270.1 毫秒;作为对照,同一台机器上一套带本地嵌入推理的方案跑 3437 条,同一条查询要 933 到 1195 毫秒。我顺手核了 npm registry:这个包 11 月 7 日首次发布,0.3.1 是 11 月 9 日上线,MIT 协议,官方描述是 “可嵌入的本地记忆引擎(TypeScript),与 Rust 版 respire-memlite 数据互通”,解包体积 818,095 字节。

为什么有人要做这么小的东西,起因很具体:只想给编辑器插件加一行 “记住上次的结论”,问了三家方案,一家要起常驻服务,一家要登录拿密钥,一家要先建向量库。为几十条判断搭一套基础设施,成本明显不划算。

维度memlite 的做法
形态npm 包 @rsrsai/memlite(TypeScript)+ Rust 单文件二进制 respire-memlite,两者读写同一份数据
存储追加写的 memory.jsonl,一条记忆一行
检索BM25 词面匹配 + 用 parent_id 串起来的因果树
依赖运行时零依赖,fs-ext 是可选件,装不上也能用
协议MIT,无云、无账号、无端口
版本0.3.1,发布于 2026-11-09(首次发布 11-07)

“轻” 这件事,得看四个不同的数,混着说就容易失真。

项实测值说明
包体积818,724 字节(约 799 KB)registry 记 818,095 字节,差在打包细节
运行时依赖0 个fs-ext 可选,不装照用
主逻辑 index.js118 KB真正干活的就这一份
sourcemap483 KB占了包体积一半多,运行时不加载
3000 条数据1,179,427 字节,413 字节 / 条明文 JSONL,记事本能直接打开
常驻内存89.6 MB裸 node 是 29.4 MB,净增约 60 MB
向量文件无默认档不产 emb.f32

冷启动也够快:import 21 到 27 毫秒,空库打开 10.9 毫秒,3000 条的库冷开 39 到 41 毫秒。但要注意 “一条查询端到端 376 到 429 毫秒” 这个数里,有 130 毫秒左右是 Node 自己启动的开销,当 CLI 用没问题,做常驻服务会更快。

检索速度是一条接近直线的曲线,这既是它的优点,也是它的天花板。

库规模p50p95
100 条10.2 ms25.8 ms
500 条26.2 ms36.0 ms
1000 条55.7 ms80.3 ms
2000 条119.2 ms154.5 ms
3000 条176.1 ms270.1 ms

三十倍的数据换来十七倍的延迟,基本是线性增长。作者从曲线形状推断原因是 “每次查询对全库重新分词、没有持久倒排”,并注明这条没跑 profiler—— 这个标注很重要,它意味着 “为什么慢” 目前只是合理推测。

上手确实是五行,185 个字符:

import { Memlite } from '@rsrsai/memlite';

const m = new Memlite({ dataDir: './data' });

m.open();

await m.remember('结论', { title: '标题' });

const r = await m.recall('结论', { limit: 5 });

dataDir 不传也能跑,它按 MEMLITE_DATA 环境变量、项目内 .memlite/、用户级目录、~/memlite-data 四层依次回退。写完之后立刻能查到,因为主路径是同步落盘、不等索引;这条很关键,意味着它放弃了索引带来的查询速度,换来了 “写完就能用” 的确定性。

几个设计细节,比体积更值得看。

  • 因果树:remember(..., { parent }) 挂上因,show() 返回时直接带祖先和子孙,命中一条就知道它的前因后果,不用再发一轮请求。
  • 乐观锁没省:两个实例指向同一个库,A 按 revision=0 写成功,B 还拿 0 去写会直接抛 STALE_VERSION 并带回当前版本号。
  • 敏感信息默认拦住:写 “数据库密码是 xxx” 会被拒,提示改存位置指针;手机号、JWT 也拦得住,普通技术结论照过。
  • 坏一行不炸库:手工塞一行非 JSON,bad_lines 记 1,其余记录照常可查。
  • 自带 bench:20 条语料 × 20 条改写查询,hit@1 为 17/20、85%,升级版本后重跑就能看有没有退化。

用之前必须知道的三条边界,比参数更重要。

边界具体表现后果
明文落盘memory.jsonl 是纯文本,git 能同步、记事本能开能读这台机器文件的人就能读你的记忆
查询靠词19 条真实查询撞 8 条记忆,17 条命中;“gateway timeout”“TLS 握手失败” 漏了换语言、换整句说法就找不到,除非宿主先把查询扩成同义词
单写者两个进程各写 400 条能全落盘,但 lock_backend 是 in-process、cross_process=false,各进程读自己的索引快照会有几十条滞后,一个库最好只交给一个进程写

对照一下就能看出它的位置。同一台机器、同一条查询,另一套带本地嵌入的方案在 3437 条上跑了 1195、971、933、904、906 毫秒。memlite 在 300 条档上比它快一个量级,但两者不是同一件事:对方那 933 毫秒里含本地嵌入推理,能按 “意思” 找;memlite 默认只按 “词” 找。要按意思找,它得显式开嵌入档,而这一档这次没测。

什么场合适合它,其实条件很窄也很清楚。

  • 库规模在几千条以内,不是百万级知识库。
  • 内容是技术结论、项目上下文、踩坑记录这类 “关键词打得出来” 的东西。
  • 宿主会替你改写查询,或者用户本来就会用相近的词去问。
  • 你确实需要明文和 git 同步,比如想让记忆跟着仓库走。
  • 你只需要 “记住并召回”,不需要多租户、权限、加密、图谱推理。

反过来,这几种情况就别用它:要给团队共用一套带权限的记忆、要处理隐私数据、要做跨语言语义检索、要多进程高并发写。这些正是 respire 主线和加密方案在做的事。

几个容易传错的说法,单独纠一下。

常见说法更准确的说法
“799 KB 的记忆系统”799 KB 是 npm 包体积(registry 记 818,095 字节),不含 Rust 单文件二进制;包内 483 KB 还是不加载的 sourcemap
“零依赖”是运行时零依赖,但仍要求 Node ≥ 18;fs-ext 为可选;Rust 版才免 Node
“召回 1ms 级”实测 100 条约 10 毫秒、3000 条约 176 毫秒,官方这句宜改成 “毫秒级,随条数增长”
“5 行代码就能用”5 行 185 字符是最小示例,真实项目还要定数据目录、写入策略和查询改写
“能替代向量库”默认纯 BM25 词面,语义近似、跨语言都会漏
“支持多进程”官方口径是 single-writer,跨进程锁未启用,多进程写会有索引滞后

【常见问题】

问题 1:memlite 这个 799 KB 的记忆系统,和 mem0、Zep 那类方案差在哪?

回答 1:差在定位,不在功能多少。mem0、Zep 这类是 “记忆系统”,带向量库、抽取管线、服务端、账号体系;memlite 是 “记忆内核”,799 KB、零运行时依赖、无端口无账号,import 进来就能用,数据就是一个 memory.jsonl。它换来的是极低的接入成本和可携带性 —— 一个包、一个文件、git 能同步、Rust 和 TS 两端读同一份;放弃的是语义检索深度、多租户权限和加密。库到几千条、内容以技术结论为主,它够用;要到百万条、要按意思找,就得换方案。

问题 2:799 KB 这么小的记忆系统,检索性能靠什么撑住?

回答 2:靠 BM25 词面匹配加一棵 parent_id 因果树,没有向量索引,也没有持久倒排。实测 p50 是 100 条 10.2 毫秒、1000 条 55.7 毫秒、3000 条 176.1 毫秒,曲线接近线性,因为每次查询都要对全库重新分词。它的优势是 “写完立刻能查”,主路径同步落盘不等索引;劣势是条数上万后延迟会明显上去,那时要么加缓存,要么开嵌入档。所以 799 KB 买到的是 “够用且确定”,不是 “又快又全”。

问题 3:零依赖的 memlite,数据安全和隐私怎么处理?

回答 3:分两层,一层做了,一层没做。做了的是写入前的敏感扫描:密码、手机号、JWT 这类内容默认被拒,提示你改存 “位置指针”;还有乐观锁防并发覆盖,坏行不会炸库。没做的是静态加密 —— 数据就是明文 memory.jsonl,记事本能打开,本机能读文件的人都能读。所以它适合存 “技术结论、项目上下文” 这种不怕被看见的内容,不适合存凭证、客户隐私、医疗记录。要加密,得走 respire 主线那套加密库,或者自己在宿主侧加一层。

问题 4:什么样的人应该试 memlite,什么样的人不该试?

回答 4:给编辑器插件、CLI 工具、个人 agent 加一层 “记住上次结论” 的能力,库规模几百到几千条,查询里带得出关键词,这套很合适,5 行代码、一个文件就能收工。反过来,三种情况别碰:一是团队共用、需要按人隔离权限的记忆;二是要存敏感数据;三是要跨语言、按意思检索。还有一条容易被忽略 —— 多进程并发写,官方口径就是单写者,两个进程各写各的会出现几十条索引滞后。先用小库验证召回质量,再决定要不要上,比一上来就替换现有记忆层稳妥。

【参考资料】

[2026-11-12](AI 记忆系统测试 799 KB、零依赖 5 行代码跑起来)阿里云开发者社区

[2026-11-09](@rsrsai/memlite 0.3.1 版本发布与包元数据:解包体积 818,095 字节、MIT)npm Registry

[2026-11-07](memlite 首次发布记录与仓库 risense-ai/memlite-js)npm Registry

【免责声明】

本文依据阿里云开发者社区 2026 年 11 月 12 日发布的单机实测报告,以及 npm Registry 上 @rsrsai/memlite 的公开包元数据整理。文中体积、延迟、内存等数字均来自该报告在 i5-1135G7 / 15.8 GB / Windows 11 / Node 22.23.2 环境下的测试,属单机单次样本,不代表其他硬件与数据分布下的表现;Rust 单文件版本(respire-memlite)作者未实机测试,相关描述为官方口径转述。“线性增长的原因” 为作者依据曲线形状的推断,未经 profiler 验证。包体积一处存在 818,724 与 818,095 字节的细微差异,已并列标注。本文为技术选型参考,不构成对任何产品的推荐或采购建议;涉及敏感数据存储的,请自行评估合规要求。

今日大家都在搜的词: