mcpField
G
genome

genome

本地服务
github.com/NORTHTEKDevs记忆与知识108 周前更新

关于 genome

GENOME 是面向 AI Agent 的本地记忆系统,通过本地嵌入和向量检索保存并召回跨会话信息,无需写入时调用 LLM 或联网。它还可选记录事实的时间变化,并提供可审计的记录与重放能力。

主要功能

  1. 01本地嵌入写入记忆
  2. 02向量搜索与可选重排
  3. 03按时间追踪事实变化
  4. 04来源信任策略与隔离
  5. 05记忆日志审计和重放

适用场景

  1. 01为 Agent 保存跨会话记忆
  2. 02在离线或隔离环境写入记忆
  3. 03查询某个历史时点成立的事实
  4. 04审查记忆来源并重现变更

MCP 相关

附带的本地 MCP 服务为客户端提供 remember、recall、forget 和 reset_memories 工具。记忆保存在本机,无需 API 密钥或向外传输数据。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"northtekdevs-genome": {
"command": "uvx",
"args": [
"genome-memory"
]
}
}
}
启动命令uvx genome-memory

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypigenome-memory1.2.1

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

GENOME

面向 AI Agent 的开放记忆。答案准确率与 Mem0 相同,但存储成本约低 1,000×,可完全离线运行,并保留可审计记录。

tests install canary PyPI License: Apache 2.0 Python 3.11-3.14 DOI

论文: Do Agents Need an LLM to Remember?(核心评估,2026)以及 What Does Each Memory Feature Buy?(对全部五项可选功能进行实测审计,涵盖成功与失败,2026)。PDF 文件位于 papers/;结果表位于 benchmarks/AUDIT-RESULTS.md。

大多数 Agent 记忆工具(如 Mem0)都会在每条消息上调用大模型,以决定要记住什么。这是耗时又昂贵的部分,而 GENOME 的核心判断是:其实并不需要这么做。GENOME 只在本地为每条消息生成嵌入:无需大模型、API,也无需在写入路径上访问网络。

在公开数据集(LoCoMo、LongMemEval)上进行了诚实的基准测试后,GENOME 的回答准确率与 Mem0 相同,但存储记忆的成本极低,而且可以完全离线运行。

先说明实情:在回答准确率方面,GENOME 与 Mem0 不相上下——我们不声称在这方面胜过它(六种独立的基准测试配置均确认了这一点,且差异在任一方向上都不显著)。GENOME 的优势在于成本、速度、离线运行,以及 Mem0 无法生成的时间记录和可审计记录。

查看运行效果

GENOME 存储两年的时间线并回答特定时间点的问题

每一帧都是 examples/demo_timeline.py 的真实输出,由 tools/render_demo_gif.py 捕获。你也可以亲自运行,无需 API 密钥:

python examples/demo_timeline.py

有意思的是第 3 步。同一个问题会根据你询问的时间得到三个不同但正确的答案,因为存储会保留每条事实开始成立的时间,而不是将其覆盖:

问题答案
Priya 在 2023 年 5 月住在哪里?波士顿 [2023 年 3 月 - 2024 年 1 月]
Priya 在 2024 年 3 月住在哪里?西雅图 [2024 年 1 月 - 2025 年 2 月]
Priya 现在住在哪里?奥斯汀 [2025 年 2 月 - 至今]

“在考虑也许搬去丹佛,还没做决定”这段对话会被存储,但永远不会成为答案:这是一个计划,而非持久事实。

工作原理

写入路径刻意设计得简单、低成本。所有智能处理都发生在读取时,由查询来聚焦。

flowchart LR
    M["incoming message"] --> E["local embedder<br/>all-MiniLM-L6-v2"]
    E --> S[("local store<br/>SQLite or Postgres")]
    M -. "optional, opt-in" .-> B["belief extraction<br/>(the only LLM call)"]
    B --> K[("bi-temporal<br/>fact log")]

    Q["query"] --> R["exact cosine search<br/>over this tenant's rows"]
    S --> R
    R --> RR["optional cross-encoder<br/>rerank"]
    RR --> A["context for the agent"]
    Q --> PIT["as-of resolution<br/>facts_valid_at(entity, T)"]
    K --> PIT
    PIT --> A

    style E fill:#0A84FF,color:#fff
    style S fill:#1c2530,color:#fff
    style K fill:#1c2530,color:#fff
    style B fill:#3a3a3a,color:#fff

写入:在本地生成嵌入并存储。耗时约 10 ms,不调用大模型,不访问网络。嵌入是确定性的——相同文本始终生成相同向量,不会经过抽样提取步骤来判定哪些内容重要——因此存储内容由输入决定,重放日志可以精确还原存储内容。(ID 和时间戳会在每次写入时生成,因此对同一对话进行两次独立导入,内容和向量会一致,但记录 ID 不会一致。)

读取:在租户范围内进行精确余弦相似度搜索(无需构建或更新 ANN 索引),并可选择使用本地交叉编码器重排序器。

双时态层(可选):按每条事实的领域时间记录,即它在现实世界中开始成立的时刻,而非导入时刻。这样,即使事实以乱序到达,也能回答特定时间点的问题。

为什么记录可以重新推导
flowchart TB
    subgraph LLM["LLM-extraction memory"]
        A1["message"] --> A2["LLM decides what matters<br/>(sampled, non-deterministic)"]
        A2 --> A3[("store")]
        A3 --> A4["replaying the same input<br/>can produce a different store"]
    end
    subgraph GEN["GENOME"]
        B1["message"] --> B2["local embedding<br/>(deterministic)"]
        B2 --> B3[("store")]
        B3 --> B4["replaying the same input<br/>reproduces the same store"]
    end
    style A4 fill:#5c1f1f,color:#fff
    style B4 fill:#1f4d33,color:#fff

无法重新推导的记录很难审计。这种属性,而非准确性,才是这一设计的真正理由。

不相信?亲自验证

成本、速度和离线方面的说法无需 API 密钥——用 60 秒在你自己的机器上测量:

git clone https://github.com/NORTHTEKDevs/genome && cd genome
pip install -e . && python -m genome.verify

首次运行会先下载本地嵌入模型(约 90 MB,仅需一次),然后才会打印任何内容,因此在冷启动的机器上,可能会出现 30-120 秒看似无响应的情况。此后的每次运行都会立即完成。

它会在物理阻断出站网络的情况下写入记忆,并打印实时通过/失败回执——0 次网络调用、0 次大模型调用、个位数毫秒的写入耗时,以及正常工作的检索:

  [PASS] Air-gapped write path: wrote 200 memories with every outbound socket blocked -> 0 network attempts, 0 LLM calls
  [PASS] Write latency: 7.1 ms/message  (Mem0's measured write path: ~2,055 ms + 1 LLM call/message)
  [PASS] Retrieval works: top hit score 0.598

这份回执只涵盖成本/速度/离线方面的说明。与 Mem0 准确率持平的说法需要单独进行更大规模的验证,并且需要大模型密钥——使用你自己的密钥,通过 python benchmarks/head_to_head.py 针对相同问题进行正面对比复现(一个 OpenRouter 密钥即可;n=90/n=205 的运行结果、配对显著性检验和已公布的无显著差异结果,见 benchmarks/RESULTS.md)。完整测试套件在公开 CI 中运行(见上方徽章)。我们的主张不是“相信我”,而是“亲自运行”。

一行代码为你的 Agent 添加持久记忆(MCP)

GENOME 提供完全本地运行的 MCP 服务——为 Claude Desktop、Claude Code 或 Cursor 提供跨会话记忆,无需 API 密钥,数据也不会离开你的机器:

pip install "genome-memory[mcp]"
{ "mcpServers": { "genome": { "command": "genome-mcp" } } }

也可以通过 uv 零安装运行:{ "command": "uvx", "args": ["--from", "genome-memory[mcp]", "genome-mcp"] }

Agent 可使用的工具:remember、recall、forget、reset_memories。 记忆会持久保存在本地的 ~/.genome/memories.db 中。查看完整 MCP 详情 ↓

GENOME 与 Mem0 一览

GENOMEMem0
回答准确率(LoCoMo、LongMemEval)持平持平
存储一条消息所需的大模型调用次数01+
写入速度约 10 ms约 2,000 ms
支持离线/隔离网络运行是否(需要大模型 API)
摄取成本(部署规模为 10k 用户)约 $190/年$159k-$1.6M/年
“3 月份哪些内容为真?”(时间点查询)是否
确定性、可审计的记忆是否

所有数字都在同一个测试框架内测得——使用相同的回答模型、评判模型、嵌入模型和 top-k,仅更换记忆层,并进行了配对显著性检验。完整详情和各数字的来源:benchmarks/RESULTS.md。格式化报告:benchmarks/GENOME-LoCoMo-Report.pdf。

为什么成本低约 1,000 倍:记忆时从不调用大模型

存储一条消息,Mem0 需要 1 次大模型调用,GENOME 需要 0 次(只做本地嵌入)。 这是无法争辩的基准——它只是算术,无论你按哪种大模型的价格计算都成立。按 10,000 名用户 × 每天 50 条消息(每月 15M 条消息)计算:

Mem0 用于提取的模型Mem0 年度摄取费用GENOME
Claude Haiku$1,601,757$190
gpt-4o-mini$238,596$190
最便宜的托管模型$159,064$190

即使使用最便宜的模型,差距依然存在,而且在生产环境中还会扩大(随着存储内容增加,Mem0 会把已存储的记忆重新发送给大模型)。复现方法:python benchmarks/tco_project.py(无需 API 密钥)。

支持隔离网络环境运行

GENOME 的默认嵌入模型在本地运行。我们通过在写入期间阻断所有网络,证明写入流程确实可以离线运行——写入仍然成功:

  • 约 10 ms/条消息、0 次网络调用、0 次大模型调用(python benchmarks/local_writepath.py)
  • Mem0 无法做到这一点——它需要调用大模型 API 才能摄取内容。

因此,GENOME 可用于本地部署、受监管环境或完全离线的场景。这是一项是/否的能力,而非价格优势。

工作原理

  • **写入:**在本地嵌入消息并存储。不使用大模型,不访问网络。(约 10 ms)
  • **读取:**对记忆进行向量搜索;对于较难的查询,可选择使用本地交叉编码器重排器。
  • **可选的双时态层:**跟踪事实随时间的变化,并回答“在时间 T 时什么为真”——详见下文。

确定性带来的优势

由于写入路径上的任何环节都不会解读你的内容,GENOME 能做到一些原则上 LLM 摄取式记忆系统无法做到的事:

  • 记忆防火墙(genome.firewall):为每次写入标记其来源(user、agent、tool、web),将低信任来源隔离,避免其被检索,并执行来源绑定的权限控制——即使提示词注入的冲突解决器要求这样做,网页内容也永远无法 UPDATE 或 DELETE 用户说过的话。注入内容也没有可攻击的提取步骤:写入路径中没有大模型。

    from genome import Memory
    from genome.firewall import TrustPolicy
    
    m = Memory(trust_policy=TrustPolicy(recall_min_trust=1))
    m.add("I live in Anchorage", user_id="u1", provenance="user")
    m.add(scraped_page_text, user_id="u1", provenance="web")   # quarantined
    
  • 可解释的检索(genome.explain):explain_search() 会报告每个候选项的密集向量分数、BM25 排名、融合分数;如果某个候选项未被返回,还会给出确切原因(被父级过滤、被隔离、超出限制)。两次运行的结果一致,因此检索错误可以作为回归测试提交,而不必无奈地耸耸肩。

  • 日志与重放(genome.journal):记录每次变更,并以可验证的方式重现存储内容——verify_journal() 会重放历史记录并比较规范哈希。重放日志前缀即可回滚;重放到不同存储中,即可为假设场景运行创建记忆分支。日志位于提取步骤之后,因此即使配置了大模型提取器,重放结果仍然是确定的。每行都与前一行相链接,因此即使改动在最终状态中相互抵消,也能检测到行被删除或编辑的情况。

    # Tamper-EVIDENT by default. Pass a key (kept outside the journal's directory)
    # to make it tamper-PROOF: an unkeyed chain can be recomputed by anyone with
    # write access, an HMAC chain cannot.
    m = Memory(journal="mem.journal", journal_key=os.environb[b"GENOME_JOURNAL_KEY"])
    
  • 多 Agent 信念归属(record_fact(..., believed_by="agent-a")):共享存储的 Agent 各自保留自己的信念时间线——Agent B 的不同意见不会覆盖 Agent A 的事实——而 belief_conflicts() 会呈现分歧,供人有意解决,而不是悄悄选定赢家。

  • 中立的基准测试框架(benchmarks/neutral/):使用相同的响应器、评判器和嵌入器运行 GENOME、Mem0 和完整上下文基线,并提供成对 McNemar 矩阵和完整披露区块。GENOME 只是表格中的一行,而不是主场。

安装

pip install genome-memory

默认嵌入器在本地运行(sentence-transformers/all-MiniLM-L6-v2),无需 API 密钥,可离线使用;首次运行时会下载约 90 MB 的模型。也可选用 OpenAI 嵌入,以实现更高维度的检索。

**如实说明依赖:**核心安装依赖 numpy、sentence-transformers、scikit-learn 和 rank-bm25。本地嵌入使用 PyTorch(由 sentence-transformers 引入),因此安装并不轻量——这是为离线、零成本嵌入而有意作出的权衡。绘图和基准测试图表依赖位于可选的 [viz] 扩展中,不属于核心依赖。要从 Mem0 迁移?请参阅 docs/migrating_from_mem0.md。

快速入门(完全本地,无需 API 密钥)

from genome import Memory

mem = Memory(storage="genome.db")   # local embedder by default; ":memory:" for ephemeral

# Store a message -- embedded locally, no LLM call, no network
mem.add("Ada met Lin at the robotics summit in Berlin.", user_id="u1")
mem.add("They are collaborating on an open-source planning library.", user_id="u1")

# Retrieve the most relevant memories
for hit in mem.search("Where did Ada meet Lin?", user_id="u1", limit=5):
    print(f"{hit.score:.3f}  {hit.content}")

Memory 的 API 与 Mem0 一致(add / search / get / delete / reset)——几乎可以直接替换。若要改用 OpenAI 嵌入(设置 OPENAI_API_KEY):

from genome import Memory, EmbeddingProvider
mem = Memory(storage="genome.db",
             embedding_provider=EmbeddingProvider(model_name="openai:text-embedding-3-small"))

将其用作 MCP 服务(为任何 Agent 提供完全本地的记忆)

GENOME 内置了 MCP 服务,因此任何 MCP 客户端(Claude Desktop、Claude Code、Cursor 等)都能获得持久的跨会话记忆,且完全在本地计算机上运行——不调用大模型、不需要 API 密钥、数据不会离开本机。大多数记忆 MCP 都无法做到这一点。

安装 mcp extra,然后将其添加到客户端的配置中:

pip install "genome-memory[mcp]"
{
  "mcpServers": {
    "genome": { "command": "genome-mcp" }
  }
}

Agent 可用的工具:remember(存储事实/偏好,本地运行且不调用大模型)、recall(语义搜索)、forget(删除与查询匹配的记忆)、reset_memories(清除用户的记忆)。记忆保存在 ~/.genome/memories.db 中(可通过 GENOME_MCP_DB 环境变量覆盖)。使用 genome-mcp 或 python -m genome.mcp.server 独立运行。

将其作为 HTTP API 运行

更喜欢 HTTP?GENOME 内置了一个 FastAPI 服务,其接口与库一一对应(add / search / get / update / delete / reset / synthesize),并在 /docs 提供自动生成的 OpenAPI 规范。

pip install "genome-memory[fastapi]"

在本地试用(无需密钥,仅限回环接口——一个标志即可明确表示“无身份验证”的意图):

GENOME_ALLOW_NO_AUTH=1 python -m genome.server        # serves on 127.0.0.1:8080
curl -X POST localhost:8080/v1/memories \
  -H 'Content-Type: application/json' \
  -d '{"text": "Ada met Lin at the robotics summit in Berlin.", "user_id": "u1"}'

curl -X POST localhost:8080/v1/search \
  -H 'Content-Type: application/json' \
  -d '{"query": "Where did Ada meet Lin?", "user_id": "u1", "limit": 5}'

默认安全。 除非像上文那样选择启用,否则服务不会在未经过身份验证的情况下提供服务;没有密钥时,也不会绑定到非回环接口。若要对外开放,请设置 API 密钥(通过 X-API-Key 发送)——绑定到 localhost 以外的地址时必须设置:

GENOME_API_KEY=$(openssl rand -hex 32) GENOME_HOST=0.0.0.0 python -m genome.server
# then add:  -H "X-API-Key: $GENOME_API_KEY"  to every request

对于多租户部署,设置 GENOME_REQUIRE_SCOPE=1,以要求每次调用都提供 user_id/agent_id,并禁用全局重置。Docker:docker-compose up(需要 GENOME_API_KEY 和 POSTGRES_PASSWORD;Postgres 仅发布到回环接口)。完整指南(包括 Postgres 后端和所有环境变量):docs/tutorial_quickstart.md。

TypeScript / JavaScript 客户端

@northtek/genome-memory 通过此服务提供与 Python Memory API 形态一致的接口(ESM,Node 20+ 或浏览器):

npm install @northtek/genome-memory
import { Memory } from "@northtek/genome-memory";

const mem = new Memory({ baseUrl: "http://localhost:8080" });
await mem.add({ text: "Ada met Lin in Berlin.", userId: "u1" });
const hits = await mem.search({ query: "Where did Ada meet Lin?", userId: "u1" });

完整的客户端文档:sdks/typescript/README.md。

真实的测试结果

所有系统使用相同的响应器、评审器和嵌入模型;只有记忆层不同。

测量项目结果结论
窗口内的回答准确率(LoCoMo)GENOME 0.851 vs Mem0 0.855(p > 0.23)持平
难度更高的基准测试中的回答准确率(LongMemEval,n=90 和 n=205)趋势上领先,但不显著(p = 0.14-0.19)持平
历史记录超出上下文窗口时的准确率上下文减少 80 倍时,+0.409(p = 8e-10)胜出
存储一条消息的成本0 次大模型调用 vs 1 次以上;便宜 837-8,433 倍胜出
写入路径约 10 ms,物理隔离,0 次网络调用胜出
时间点查询(“T 时刻的情况如何”)信念状态 0.870 vs Mem0 0.676(合成数据)胜出,但有注意事项
使用重排序时的检索命中率hit@10 提升(最高达 0.943);本地且免费胜出
我们测试过但没有帮助的方案(这样你就不必再试)

我们会公开无效结果——这能证明胜出的结果是真实的:

  • **综合 / 整合:**在相同 token 预算下,对准确率没有影响(p = 0.86)。
  • **混合检索(BM25 + dense)和图检索:**在 LoCoMo 上,混合检索表现不如纯 dense;此处未验证图检索。
  • **重排序对准确率的提升取决于嵌入模型:**它能稳定提升检索命中率,但对最终回答准确率的影响取决于嵌入模型——应将其视为提升检索质量的工具,而非保证提升准确率的方案。

双时态记忆:“时间 T 时什么为真”

GENOME 可以追踪事实如何随时间变化,并回答特定时间点的问题——基于覆盖的记忆在结构上无法做到这一点(它只保留最新值):

from genome.memory.belief import ingest_belief_turn, answer_belief_context

mem = Memory(storage="genome.db", llm_call=my_llm_fn)

# facts land at their DOMAIN time (parsed from the text), not wall-clock ingest time
ingest_belief_turn(mem, "In March 2024, Jordan moved to Seattle.", session_time=t0, user_id="u")
ingest_belief_turn(mem, "Jordan just moved to Austin.", session_time=t2, user_id="u")

answer_belief_context(mem, "Where does Jordan live now?", user_id="u")            # -> Austin
answer_belief_context(mem, "Where did Jordan live in early 2024?", user_id="u")   # -> Seattle
answer_belief_context(mem, "List every city Jordan has lived in.", user_id="u")   # -> Seattle; Austin

在 TempBelief 基准测试中,它回答特定时间点查询的得分为 0.870,而 Mem0 为 0.676;知识图谱经审计后的精确率为 0.97,召回率为 0.96。注意: TempBelief 使用带有明确日期的合成文本;在自然语音上的差距会缩小。这项能力确实存在,但证据范围有限。

可选功能

按需启用;默认路径在摄取时无需使用大模型,并且在本地运行。

mem = Memory(
    storage="genome.db",
    llm_call=my_llm_fn,             # LLM-based fact extraction on add()
    resolve_conflicts=True,         # ADD/UPDATE/DELETE vs existing memories
    auto_extract_entities=True,     # entity graph for graph retrieval
    auto_consolidate_threshold=200, # summarize-or-prune when a scope grows past N
)
mem.search("...", user_id="u1", mode="hybrid")   # modes: "dense" (default), "hybrid", "graph"

重排序(本地、免费、无需 API):

from genome.memory.rerank import CrossEncoderReranker
mem = Memory(storage="genome.db", reranker=CrossEncoderReranker())   # lazy-loaded
mem.search("Where did the user go on vacation?", user_id="u1", limit=5)  # reranked

复现基准测试

LoCoMo 和 LongMemEval 数据集不随项目提供(它们各自有自己的许可证——LoCoMo 使用 CC BY-NC 4.0)。请参阅 benchmarks/data/README.md 下载。前两行无需数据集或 API 密钥:

python benchmarks/local_writepath.py        # local write path: ~10ms/msg, 0 network
python benchmarks/tco_project.py            # deployment cost projection
python benchmarks/verdict.py                # in-window accuracy + McNemar
python benchmarks/haystack_report.py        # overflow / context-window crossover
python benchmarks/ingest_cost.py --n 80     # measured ingestion cost vs Mem0
python benchmarks/lme_qa.py --n 90          # LongMemEval head-to-head vs Mem0
python benchmarks/tempbelief_run.py --convs 6   # bi-temporal point-in-time vs baselines

支持与商业版

报告错误和提问:请访问 issues 和 discussions。社区支持尽力而为——详情请参阅 SUPPORT.md。

GENOME Enterprise 是一款独立的商业产品,面向受监管行业和本地部署的客户;这些客户必须向审计人员说明 AI 系统在何时知道了什么:防篡改的哈希链审计记录、特定时间点重建、合规报告、带有擦除证明的保留策略、RBAC 和 SSO。可自托管,按部署授权——我们刻意不提供托管版本,因为它的价值就在于数据永不离开您的环境。该版本为本项目提供资金支持。正在评估它,或希望为开源核心获取商业支持? [email protected]

许可证

Apache License 2.0——请参阅 LICENSE 和 NOTICE。

GENOME 免费且开源:您可以阅读、修改、自行托管,并将其嵌入自己的应用程序——包括商业用途——但须遵守 Apache 2.0 的条款。我们无意采用“开放核心诱饵换招”策略:核心将继续采用 Apache-2.0 许可证。

Apache-2.0 授予的权利适用于代码,不适用于名称——请参阅 TRADEMARKS.md,其中首先说明了无需征求许可即可进行的操作。 如有疑问:[email protected]。

Copyright 2026 Northtek (FrostByte Digital LLC)。 mcp-name: io.github.NORTHTEKDevs/genome

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。