MoonBit 嵌入式 Agent 记忆层 —— 零部署、崩溃可恢复、按用户结构隔离。
[!NOTE] 尚未发布到 mooncakes。本地开发请用本仓库做 path 依赖,或把 src/ 拷进工程。
{
"deps": {
"heyq02/moomem": "0.2.2"
}
}fn main {
let mem = @moomem.MemoryStore::open("./memory").unwrap()
// 对话结束后写入:提取 → 去重 → 冲突 → 嵌入 → 双索引 → 落盘
let summary = mem.add("user-42", "我对花生过敏").unwrap()
println("extracted=\{summary.extracted} inserted=\{summary.inserted}")
// LLM 调用前召回:混合检索,只返回该用户记忆
let hits = mem.recall("user-42", "花生过敏", top_k=3).unwrap()
for e in hits {
println("[\{e.created_at}] \{e.content}")
}
ignore(mem.close())
}moon build src/cli --target native
BIN=_build/native/debug/build/src/cli/cli.exe
$BIN add --db ./mem --user user-42 --text "我对花生过敏"
$BIN recall --db ./mem --user user-42 --query "花生过敏"
$BIN list --db ./mem --user user-42
$BIN stats --db ./mem
$BIN export --db ./mem > backup.jsonl
$BIN import --db ./mem --file backup.jsonlexport MOOMEM_LLM_API_KEY=...
# export MOOMEM_LLM_BASE_URL=https://api.deepseek.com # 可选
# export MOOMEM_LLM_MODEL=deepseek-chat # 可选,缺省 gpt-4o-mini
$BIN add --db ./mem --user user-42 --text "你好!我对花生过敏" --llm
# 同时启用 LLM 冲突判定:加 --llm-judge(隐含 --llm)| 方法 | 语义 | 返回 |
|---|---|---|
| open(path, config?) | 打开或创建记忆库 | Result[MemoryStore, MoomemError] |
| add(user_id, text) | 提取→去重→冲突→双索引→落盘 | Result[AddSummary, MoomemError] |
| recall(user_id, query, top_k?) | 混合检索(仅 Active / Unstructured) | Result[Array[MemoryEntry], MoomemError] |
| forget(user_id, target) | 软删除 ById(id) / All | Result[Int, MoomemError] |
| stats() | 计数 / 字节 / 截断恢复 / 提取模式 | Result[StoreStats, MoomemError] |
| close() | flush 后关闭(幂等) | Result[Unit, MoomemError] |
| trait | 缺省(离线) | 生产替换 |
|---|---|---|
| Embedder | HashingEmbedder(256 维词袋哈希) | 宿主 / vcdb 嵌入 |
| Extractor | RawExtractor(原文 unstructured 入库) | src/llm_extractor 的 LlmExtractor |
| ConflictJudge | SimilarityJudge(余弦 + Jaccard,阈值 0.82) | LlmConflictJudge |
| PersistenceBackend | native FsBackend;wasm/js MemoryBackend | IndexedDB 胶水等 |
| Clock | LogicalClock | 系统时钟 / 测试用 FixedClock |
let cfg : Config = Config::{
..Config::default(),
judge : Some(MyLlmJudge::new() as &ConflictJudge),
clock : Some(FixedClock::new(42L) as &Clock),
}
let store = MemoryStore::open("./memory", config=cfg).unwrap()let provider = @openai.OpenAIProvider::new(
"sk-...",
endpoint=OpenAIEndpoint::OpenAI, // 或 Custom(base_url="https://...")
model="gpt-4o-mini",
)
let extractor = @llm_extractor.LlmExtractor::new(provider)
let judge = @llm_extractor.LlmConflictJudge::new(provider)
let cfg : Config = Config::{
..Config::default(),
extractor : Some(extractor as &Extractor),
judge : Some(judge as &ConflictJudge),
}
let store = MemoryStore::open("./memory", config=cfg).unwrap()[!TIP] 请在宿主包内自行 mock Provider。零网络范例见 examples/llm-extractor 与 src/llm_extractor/*_test.mbt。
<path>/moomem/slot0.jsonl # 快照槽 A(首行 header + 每行一条 entry JSON)
<path>/moomem/slot1.jsonl # 快照槽 B
<path>/moomem/head # "0" 或 "1",指向当前有效槽(空) → Active → Superseded (冲突 Replace,记录 superseded_by)
→ Deleted (forget 软删除,快照保留可审计)| 命令 | 用途 |
|---|---|
| add | 写入(--db / --user / --text;可选 --llm、--llm-judge) |
| recall | 混合召回(--query,可选 --top-k) |
| list | 列出条目(可选 --all) |
| stats | 库统计 |
| export / import | JSONL 备份 / 恢复 |
| help | 用法 |
moon run examples/basic-store --target native
moon run examples/llm-extractor --target native
moon run examples/conflict-supersede --target native
moon run examples/cli-smoke --target nativemoon test # native(核心 + llm_extractor + cli)
moon test --target wasm # 四后端;native 专属磁盘/CLI 测试除外
moon test --target wasm-gc
moon test --target js
moon run ci/tools/retrieval-tuning --target native # 离线调参台
moon run ci/eval/locomo --target native # LoCoMo 子集;成功日志含 LOCOMO_PASS
moon run ci/eval/locomo --target native -- --report /tmp/offline.jsonmoon run ci/eval/locomo --target native -- --embedder api # 需 MOOMEM_EMBED_*
moon run ci/eval/locomo --target native -- --live # 需 DEEPSEEK_*set -a && source .env && set +a # QWEN_* + DEEPSEEK_*
NEW_VERSION=0.0.0-dev SKIP_COMMIT=1 bash scripts/ci/run-locomo-benchmark-archive.shsrc/ 核心库(MemoryStore 编排)
llm_extractor/ 可选 LLM 提取 / 冲突判定适配
cli/ add / recall / list / stats / export / import
examples/ E2 演示(basic-store / llm-extractor / conflict-supersede / cli-smoke)
ci/
gates/ Live LLM 发版门禁
eval/locomo/ L3 LoCoMo harness + 数据
tools/ 离线检索调参
benchmarks/locomo/ 发版归档的 LoCoMo 分数(站点消费)
docs/ 项目文档(架构 / PRD / 评测报告)
site/ Rspress 文档站(GitHub Pages)[!IMPORTANT] 库不做角色鉴权。 moomem 是嵌入式库,信任边界在宿主进程:能调用 API 的代码即拥有该记忆库全部读写权。用户隔离是结构保证(user_id 分片 + 检索强制带 user_id),不能替代宿主信任模型。