为什么用 Rust 重写了 Agent 长效记忆系统?
本文分享了我们将 EverMemOS 从 Python 重写为 Rust 的历程,以及如何通过“记忆基础设施化”为多语言生态提供原生支持。

摘要:在 AI Agent 遍地开花的今天,记忆系统(Memory)往往被视为一段 Python 脚本。但当我们要支撑高并发、低延迟的生产级 Agent 时,Python 的性能瓶颈开始显现。本文分享了我们将 EverMemOS 从 Python 重写为 Rust 的历程,以及如何通过“记忆基础设施化”为多语言生态提供原生支持。
1. 现状:被困在 Python 里的“记忆”
目前市面上绝大多数 Agent 框架(如 LangChain, CrewAI) and 记忆组件都是纯 Python 实现的。Python 在原型开发和 AI 实验阶段非常优秀,但当我们将视角转到生产级基础设施时,问题接踵而至:
- 并发瓶颈:Python 的 GIL 限制了多线程处理大规模检索排序(Reranking)的能力。
- 冷启动与内存占用:Python 运行时的臃肿对于边缘计算或轻量化部署并不友好。
- 记忆即脚本 vs 记忆即服务:记忆不应该只是一个
json文件或简单的chromadb封装,它应该像 Redis 或 PostgreSQL 一样,作为一种高性能、高可靠的**基础设施(Infra)**存在。
2. 变革:Rust 重写背后的“硬核”逻辑
我们决定使用 Rust 对 EverMemOS 进行底层重写(即 evermemos-rs),主要基于以下三个维度的考量:
🚀 极致性能
通过 Rust 的异步运行时(Tokio)和零成本抽象,我们将记忆提取(Extraction)和检索(Retrieval)的端到端延迟降低了约 60%。在处理复杂的 Hybrid Search(向量+全文+RRF)时,Rust 的表现堪称惊艳。
🛠️ 记忆即基础设施(Memory as Infra)
我们将记忆系统重新定义为底层的 Infra:
- 底层存储:切换到了 SurrealDB,利用其原生支持的图查询和向量索引。
- 通信协议:除了 REST API,我们原生支持了 MCP (Model Context Protocol),让 Agent 能够像调用系统指令一样调用记忆。
🧩 真正的多语言生态
记忆不应该只服务于 Python 开发者的 pip install。重写后,我们通过 Rust 的 FFI 和高效的 REST/gRPC 接口,正式推出了三大主流语言的 SDK。
3. 开发者体验:三路并进的 SDK
无论你是在写 Python AI 应用,还是在构建 Next.js 的 AI 交互界面,甚至是开发高性能的 Rust Agent,EverMemOS 都能无缝接入。
🐍 Python SDK
针对数据科学家 and 主流 Agent 框架开发者的习惯,保持了极简的 API 设计。
from evermemos import MemoryClient
client = MemoryClient(api_key="your_key")
# 自动提取 MemCell 并存储
client.memorize(
user_id="user_123",
content="我明天下午三点在上海有个关于 Rust 性能优化的会议。"
)
📦 TypeScript SDK
为 Web 端和 Node.js 环境提供全类型的异步支持。
import { EverMemos } from '@evermemos/sdk-js';
const memos = new EverMemos({ endpoint: 'http://localhost:8080' });
const context = await memos.retrieve({
userId: 'user_123',
query: '明天的行程安排?',
strategy: 'agentic' // 启用智能检索策略
});
🦀 Rust SDK
对于追求极致性能的底层开发者,提供原生的 async/await 支持和类型安全。
use evermemos_rs_sdk::{Client, RetrievalStrategy};
#[tokio::main]
async fn main() {
let client = Client::new("http://localhost:8080");
let results = client.search("user_123")
.query("Rust 性能")
.strategy(RetrievalStrategy::Hybrid)
.limit(5)
.await?;
}
4. 性能数据对比
TODO