mnemo
给任意LLM装上本地持久化的知识图谱记忆层,零云依赖,50ms内检索
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
给任意LLM装上本地持久化的知识图谱记忆层,零云依赖,50ms内检索
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
你是否有过这样的经历:花了一个小时和 AI 助手指点项目架构,第二天再打开却发现它完全"失忆"了——不记得你们讨论过什么,更别说把那些关键信息串联起来。这种"金鱼记忆"是当前几乎所有 LLM 应用的通病。mnemo 正是为解决这一问题而生。
mnemo 是一个完全本地运行的 AI 记忆层(Memory Layer),由 Rust 编写,发布于 2024 年末,曾在 Hacker News 上引发 60+ 的讨论热度。它的核心思路非常清晰:给 AI 装一个持久化的知识图谱大脑。你把对话内容 POST 进去,它调用本地 LLM(默认 Ollama)从中抽取人名、工具、概念、事件等实体,以及实体间的关系,构建成一张不断生长的知识网络。下次查询时,它在 50ms 内从这张网络中检索相关记忆,组装成上下文字符串,注入到你的 prompt 里——整个过程不需要任何云服务,也不依赖 Python 运行时。
该项目由独立开发者 zaydmulani 开发,采用 MIT 许可证,目前 228 Stars,在"AI Memory"细分领域增长迅速。它的技术选型(Rust + SQLite + petgraph)让它区别于大多数 Python 方案的臃肿和云依赖,真正做到了"一次部署,永久记忆"。
mnemo 的记忆检索并非简单的向量相似度匹配,而是一套精密的 6 阶段管道:
第一阶段:全文检索(Full-Text Chunk Search)
对你的查询文本在 SQLite 的 memory_chunks 表中进行全文搜索,取回最多 50 个候选文本块。
第二阶段:实体名搜索(Entity Name Search)
同时在 entities 表中按实体名称做精确匹配,找出所有包含查询关键词的实体。
第三阶段:知识图谱扩展(Graph Expansion / BFS)
这是 mnemo 的核心差异化能力。以 top 实体为起点,按指定深度(默认 2 跳)在 petgraph DiGraph 中做广度优先遍历,找出与这些实体有直接关联的其他实体。扩展出来的实体分数乘以 0.5,确保直接匹配永远排在推理结果之前。
第四阶段:关系过滤(Relation Filter)
根据查询中的关系类型约束(如"谁用过这个工具"),过滤不符合的关系。
第五阶段:评分排序(Score + Rank)
综合 chunk 相关度、实体匹配度、图谱扩展衰减,计算最终得分,取 top 结果。
第六阶段:上下文组装(Context Assembly)
将 chunk 内容、实体信息、关系网络组装成结构化的 context_prompt 字符串,直接塞进 LLM 的 system prompt。
实体提取(Entity Extraction)
调用配置的 LLM(支持 Ollama/OpenAI/Anthropic/任意 OpenAI 兼容接口),用结构化 JSON schema 提示词从文本中提取 Entity(人/组织/地点/概念/工具/事件等)和 Relation(关系)。提取后通过 name + entity_type 做去重,相同实体的别名会被合并,关系权重在每次重复出现时递增(MIN(1.0, weight + 0.1))。
mnemo 采用 Rust workspace 结构,4 个 crate 各司其职,依赖关系单向且严格:
| Crate | 类型 | 职责 | 核心文件 |
|---|---|---|---|
| mnemo-core | lib | 所有业务逻辑,不依赖 HTTP 层 | db.rs, graph.rs, extractor.rs, retrieval.rs, models.rs, provider.rs |
| mnemo-api | bin | Axum REST API 服务,thin handler 层 | main.rs, tests.rs |
| mnemo-cli | bin | 命令行工具,blocking reqwest | main.rs |
| mnemo-bench | bin | 12 套基准测试,彩色 ASCII 输出 | main.rs |
数据模型(models.rs):Entity 包含 UUID、类型(8 种)、别名数组、置信度;Relation 是有向加权边(from_entity → to_entity);MemoryChunk 是存储的文本片段,与 Entity 通过 join table(memory_chunk_entities)关联。
持久化层(db.rs):基于 sqlx + SQLite,支持同步/异步 API,使用 sqlx::migrate! 宏管理迁移脚本。数据先写入 SQLite,再更新内存中的 petgraph 图。
知识图谱层(graph.rs):内存中的 DiGraph 由 petgraph 实现,与 SQLite 保持同步。resolve_or_create_entity() 负责实体的增量更新和别名合并。
LLM 抽象层(provider.rs):统一封装 Ollama/OpenAI/Anthropic 三种后端,支持结构化 JSON 输出,提取失败时有 graceful fallback。
技术栈总结: Rust 1.78 + Tokio(异步运行时)+ Axum 0.7(HTTP)+ SQLx 0.7 + petgraph 0.6(内存图)+ reqwest 0.12(HTTP 客户端)+ clap 4.5(CLI)。
mnemo 对部署体验下了功夫。三种方式:
Docker Compose(推荐): docker compose up -d,5 分钟内同时启动 mnemo REST 服务和 Ollama 服务。Ollama 默认用 llama3 模型(约 4GB)。所有数据持久化到 Docker volumes,restart: unless-stopped 确保持久运行。健康检查覆盖服务、数据库、LLM 可达性。
Rust 二进制: cargo install --path crates/mnemo-api,配置 MNEMO_LLM_BASE_URL 和 MNEMO_LLM_API_KEY 环境变量,run。产出一个 ~10MB 静态链接二进制(musl target)。
Python SDK: pip install mnemo-sdk,3 行代码完成 ingest 和 retrieve。
硬件需求极低: 不需要 GPU(可选),512MB RAM + 200MB 磁盘即可运行。Docker 多阶段构建的最终镜像从 scratch 起家,裸二进制仅约 10MB。
实体提取的质量依赖 LLM: 如果 Ollama 模型能力较弱(如 llama3),提取的实体准确率和召回率会明显下降。作者在 README 中也坦承这点。
非向量检索: mnemo 使用 SQLite FTS 而非向量数据库(如 Chroma/Pinecone)。对于语义相似度要求高的场景,petgraph 图扩展的 0.5 衰减系数是一种折中,但在纯语义歧义场景下不如 embedding 方案。
没有 Web UI: 纯 REST API + CLI,对于非开发者用户有一定门槛。
Rust 学习曲线: 对于习惯 Python 的 AI 开发者,二次开发需要 Rust 能力。
mnemo 代表的"本地知识图谱记忆"方向,正在成为 AI Agent 基础设施的重要分支。与 LangChain Memory、MemGPT 等基于云/内存的方案相比,mnemo 的差异化在于:完全本地、SQLite 持久化、petgraph 图引擎。这个组合让它成为树莓派、小型服务器甚至边缘设备上运行 AI 记忆层的理想选择。
随着 Ollama 在社区的快速普及,"本地 LLM + 本地记忆层"的组合正在降低 AI 应用的云依赖门槛。mnemo 恰好站在这个趋势的交汇点——它不需要你买 GPU 服务器,不需要给 OpenAI 付费,数据完全留在本地,却能提供接近有状态 AI Agent 的体验。
对于构建客服机器人、研究助手、个人知识库等应用,mnemo 是一个值得关注的轻量级记忆基础设施。