GraphMem 是一种 token-efficient memory 算法,通过图结构组织长期记忆,根据查询自适应选择召回范围和上下文预算,为 LLM 提供精简、可追溯的记忆上下文。
GraphMem 提供 Python SDK、HTTP API 和持久化 Memory 服务,支持记忆写入、检索、Prompt 构建与回答生成。可以嵌入 Python 应用,也可以作为独立服务接入;生成的 messages 可直接交给产品现有的 LLM。
| 能力 | 说明 |
|---|---|
| 记忆写入 | 保存对话原文,抽取事实、关系与时间信息,建立图结构和向量索引 |
| 自适应召回 | 根据查询调整召回容量与 token 预算,结合图关系和向量检索定位相关证据 |
| 上下文构建 | 将图关系、关键原文和时间信息整理为 LLM 可用的 Prompt,并返回证据来源 |
| 持久化服务 | 支持租户隔离、幂等写入、失败恢复和在线备份 |
配置选项与接口约束见 集成说明。
支持 Python 3.11+、Linux。服务调用外部兼容接口,本身无需 GPU。
python -m pip install '.[service]'
# 无模型的持久化 / API 联调:省略语义抽取与向量召回
graphmem serve --offline --data-dir ./data/graphmem --port 8090持久化默认开启,数据保存在 --data-dir,重启时使用同一路径即可继续读取。--offline 仅用于联调;下面是完整方案的启动方式:
- 准备 chat-completions 与 embeddings 服务,编辑 config/memory-service.json 中的模型名、地址和数据目录。
- 准备与
llm_model匹配的本地tokenizer.json,用于预算计数。 - 启动:
export GRAPHMEM_TOKENIZER_PATH=/models/qwen/tokenizer.json
# 模型服务需要认证时,设置配置中 *_api_key_env 指定的环境变量
graphmem check --config config/memory-service.json
graphmem serve --config config/memory-service.json --port 8090check 校验配置和 tokenizer,不发模型请求。默认只监听 127.0.0.1;跨主机部署需设置 GRAPHMEM_API_KEY,并使用 --host 0.0.0.0。Docker 持久卷示例见 deploy/memory。
X-Tenant-ID 由产品后端确定。下例使用本地无认证服务;配置了服务密钥时,每个业务请求还需 Authorization: Bearer <GRAPHMEM_API_KEY>。
# 写入并同步建立索引;重试必须保留 request_id 和原始 payload
curl -sS http://127.0.0.1:8090/v1/memories/alice/messages \
-H 'Content-Type: application/json' -H 'X-Tenant-ID: product-a' \
-d '{"request_id":"event-001","session_id":"chat-001","messages":[
{"role":"user","speaker":"Alice","timestamp":"2026-10-13",
"content":"I adopted a dog named Luna."}]}'
# 返回原文证据与自适应召回 trace
curl -sS http://127.0.0.1:8090/v1/memories/alice/retrieve \
-H 'Content-Type: application/json' -H 'X-Tenant-ID: product-a' \
-d '{"query":"What is the name of Alice\u0027s dog?"}'
# 返回 messages、证据 ID、Prompt 哈希,可直接交给产品自身的 LLM
curl -sS http://127.0.0.1:8090/v1/memories/alice/prepare \
-H 'Content-Type: application/json' -H 'X-Tenant-ID: product-a' \
-d '{"query":"What is the name of Alice\u0027s dog?"}'| API | 用途 |
|---|---|
GET /healthz |
服务模式、配置标识、待重建数量 |
GET /v1/memories/{id} |
记忆状态、消息数量 |
POST /v1/memories/{id}/messages |
幂等追加;成功返回 status: ready |
POST /v1/memories/{id}/retrieve |
仅返回检索证据 |
POST /v1/memories/{id}/prepare |
生成带记忆上下文的 Prompt,不调用回答模型 |
POST /v1/memories/{id}/answer |
生成答案;须配置 generate_answers: true |
POST /v1/memories/{id}/rebuild |
用 {} 请求重建持久化原文的图和向量 |
from graphmem import MemoryService, ServiceConfig
config = ServiceConfig.from_file("config/memory-service.json")
# 本地联调可改为 ServiceConfig.offline("./data/graphmem")
with MemoryService(config) as memory:
memory.add("alice", [{"role": "user", "speaker": "Alice",
"content": "I adopted a dog named Luna."}],
tenant_id="product-a", session_id="chat-001", request_id="sdk-event-001")
request = memory.prepare("alice", "What is the name of Alice's dog?",
tenant_id="product-a")
messages = list(request.messages) # 产品 LLM 的 messages 参数
print(request.evidence_turn_ids, request.prompt_payload_hash)可直接运行的无模型示例:examples/persistent_memory.py。
- 一个数据目录由一个服务进程独占;同步写入和查询串行执行,写入后即可读取最新记忆。SDK 与 HTTP 服务不能同时打开同一目录。大批量写入建议每次提交一个会话片段。
- 原文及幂等记录先提交,随后建图 / 索引。模型失败时返回
503,原文仍在磁盘,记忆为pending;恢复模型后重试同一请求或调用rebuild。待重建记忆的查询返回409,完成重建后即可查询。 - Docker 必须保留
/var/lib/graphmem持久卷。memory.sqlite是权威数据;compiled/、dense/、query_embeddings.sqlite是可重建缓存。 - 在线备份:
graphmem backup --data-dir ./data/graphmem --output ./memory-backup.sqlite。恢复时停止服务,将备份放入新的空目录并命名为memory.sqlite,使用相同模型 / 构建配置启动。不要只复制运行中的 SQLite 主文件而遗漏 WAL。 - 服务密钥是后端间认证;产品网关须从登录身份派生租户 ID,并负责用户权限与 TLS。API 不应直接开放给终端用户。
src/graphmem/service/ SDK、HTTP API 与 CLI
src/graphmem/build/ 建图与原子信息抽取
src/graphmem/retrieval/ 自适应召回与证据组织
src/graphmem/answer/ Prompt 构建与回答生成
config/memory-service.json 服务配置
test/ 核心与服务回归测试
scripts/ 本地模型启动、LoCoMo 复现与服务验证
python -m pip install '.[dev,service]'
python -m pytest -q
python examples/persistent_memory.py --data-dir ./data/example-memory在单独安装了 vLLM 的 Python 环境中,把两个模型放到同一张空闲 GPU:
python scripts/serve_local_models.py start --gpu 0 \
--chat-path /models/Qwen3-30B-A3B-Instruct-2507-FP8 \
--embedding-path /models/Qwen3-Embedding-0.6B
python scripts/serve_local_models.py status
# 完成后释放该脚本管理的模型:
# python scripts/serve_local_models.py stop模型就绪后,按上面的完整服务配置启动 Memory 即可持久化使用。LoCoMo 的运行命令见 复现说明,评测口径、成绩及 token 开支见 评测结果。
目前主要验证英文对话,其他语言需结合产品场景评测。
本项目采用 MIT License。Copyright (c) 2026 Chen Han, Gao Sen, Pang Zixi, He Bingsheng, NUS Computing。
第三方依赖、模型权重和评测数据遵循各自的许可证。