一个本机优先、证据可追溯、能够理解事实变化的 AI 长期记忆引擎。
Nemos Memory 面向 AI 助理、Agent、陪伴应用和个人知识工具。它不只是保存聊天片段,而是把原始输入、派生记忆、当前事实、历史版本、时间关系和来源链组织成一套可持续维护的记忆系统。
项目以嵌入式 TypeScript SDK 交付,默认数据存储为本机 SQLite。应用可以直接接入,不需要另行部署向量数据库或记忆服务器。
当前版本:
0.7.5-alpha.17。核心写入、事实更新、召回、纠正、失效、隔离和导出链路已经可用;API 在正式版前仍可能调整。
普通的向量检索擅长找“相似内容”,但长期记忆还必须回答另外几类问题:
- 用户现在住在哪里,而不是曾经住在哪里?
- 一条结论来自哪句话,是否还能回到原始证据?
- 新旧说法冲突时,应该更新、保留历史,还是等待确认?
- 玩笑、引用、角色扮演和第三方信息会不会被误记成用户事实?
- 不同用户、角色和使用场景之间是否真正隔离?
- 用户纠正或删除后,依赖旧事实的记忆如何同步处理?
Nemos Memory 围绕这些问题设计。它把“发生过的内容”和“系统当前相信的事实”分开保存,并让每次召回都保留来源、时间和命中理由。
| 能力 | Nemos Memory 的处理方式 |
|---|---|
| 五层记忆 | 分为原始档案、事件、通用知识、个人事实和做事方法 |
| 证据与结论分离 | 原始输入不可变保存,派生记忆可追溯到来源事件 |
| 事实演化 | 使用稳定的 claim_key、有效时间和事件顺序维护当前值与历史值 |
| 冲突与纠正 | 支持确认、取代、争议、人工纠正、显式失效和身份合并/拆分 |
| 可控召回 | 组合结构化事实、全文、向量、实体、时间和证据回退通道 |
| 长期保留 | 持久化显著性、证据数量和覆盖状态,降低陈旧琐事的召回概率 |
| 隔离与敏感性 | 所有读写受租户、用户、scope 和敏感级别约束 |
| 本机部署 | 默认使用 SQLite;向量能力可选,不依赖常驻服务 |
| 可解释性 | 返回来源、召回理由和轨迹,可检查候选、过滤与排序过程 |
| 数据主权 | 支持纠正、失效、删除以及 JSON-LD / Markdown 导出 |
用户输入
↓
原始证据归档(不可变)
↓
抽取 → 规范化 → 事实对账 → 来源关联
↓
五层记忆 + 事实版本 + 时间与来源
↓
查询规划 → 多通道召回 → 边界过滤 → 排序与解释
同一事实的新值不会抹掉旧记录。Nemos Memory 会保留它的历史版本,并在默认查询中只返回当前有效值。即使较早事件的异步抽取较晚完成,也不能覆盖时间上更新的事实。
0.7.5-alpha.17 完成了全量 500 题、五产品同条件 LongMemEval 对比。五个系统均完成 500 题,生成和裁判错误均为 0;Nemos Memory 以 89.8% 的总准确率排名第一。
| 产品 | 总准确率 | 六类任务平均 | 拒答准确率 | 端到端耗时 P50 |
|---|---|---|---|---|
| Nemos Memory | 89.8% | 91.2% | 96.7% | 94.6 s |
| Hindsight | 79.2% | 78.0% | 96.7% | 29.6 s |
| Mem0 OSS | 74.6% | 80.8% | 93.3% | 36.8 s |
| Graphiti OSS | 60.0% | 63.5% | 96.7% | 74.1 s |
| LangMem | 52.0% | 56.4% | 93.3% | 18.9 s |
| Nemos Memory 任务类型 | 准确率 |
|---|---|
| 单轮用户事实 | 97.1% |
| 单轮偏好 | 90.0% |
| 单轮助手陈述 | 96.4% |
| 多轮综合 | 82.7% |
| 时间推理 | 88.7% |
| 知识更新 | 92.3% |
评测使用 LongMemEval oracle 数据变体、Top-20 召回、统一外部回答模型 gpt-5.6-terra 和官方裁判模型 gpt-4o-2024-08-06。赛道只比较记忆事实,不使用产品自带 Agent 的回答能力,因此结果衡量的是记忆写入、召回和事实使用链路,而不是整个应用的综合智能。
Nemos Memory 的 469 个可追溯题目全部命中至少一个答案来源,全部来源命中率为 94.9%;独立搜索阶段延迟为 P50 378 ms、P95 640 ms。当前最明显的工程短板是端到端写入与生成耗时,准确率领先不代表完整产品体验已经领先。
这不是对公开 LongMemEval 排行榜的直接对照:oracle 数据变体和统一外部回答模型构成了独立赛道。上表中的 Mem0、LangMem、Graphiti 和 Hindsight 均在本次相同数据、模型、参数和裁判协议下重新运行,结果只适用于该可复现协议。
需要 Node.js 20 或更高版本。当前版本从源码接入:
git clone https://github.com/mmlong818/nemos-memory.git
cd nemos-memory\sdk\typescript
npm install
npm run build在另一个 TypeScript 项目中安装本地包:
npm install <仓库路径>\sdk\typescriptimport { Nemos } from "@nemos/sdk";
const nemos = new Nemos({
storage: { type: "sqlite", path: "./nemos.db" },
llm: {
provider: "zhipu",
apiKey: process.env.ZHIPU_API_KEY!,
},
embedding: {
provider: "zhipu",
apiKey: process.env.ZHIPU_API_KEY!,
},
});
const memory = nemos.forUser("user-001");
await memory.ingest("我最近搬到了福州,并开始骑车通勤。", {
scenario: "chat",
contentDate: "2026-07-25",
});
const packet = await memory.recall("我现在住在哪里?");
for (const item of packet.items) {
console.log(item.memory.content, item.reasons);
}
await nemos.close();LLM 支持 Anthropic、OpenAI、智谱和自定义 Provider。Embedding 可选;未配置时仍可使用结构化、全文和时间检索。
| 接口 | 用途 |
|---|---|
ingest(content, options) |
归档原文并抽取派生记忆 |
recall(query, options) |
返回带来源和命中理由的记忆包 |
getRelevantContext(query) |
生成可直接加入模型提示词的上下文 |
write(input) |
写入显式结构化记忆 |
correct(memoryId, correction) |
纠正事实并传播到依赖记忆 |
invalidate(memoryId, reason) |
显式使记忆失效 |
resolveDispute(claimKey, winnerId) |
解决冲突事实 |
forget(memoryId) |
删除允许删除的记忆及相关索引 |
export(format) |
导出 JSON-LD 或 Markdown |
explainRecall(traceId) |
查看召回通道、过滤和排序依据 |
- 架构说明:数据流、五层记忆、事实更新、召回与存储设计。
- TypeScript SDK:初始化、写入、查询和数据操作示例。
在 sdk/typescript 目录运行完整检查:
npm run checkPolyForm Noncommercial 1.0.0。允许非商业使用、修改和分发;商业使用需要单独授权。