NGT Memory:基于关联图与用户画像的LLM持久化记忆模块
NGT Memory为大型语言模型实现无需外部存储的持久化记忆。该模块跨会话存储用户事实,检索相关上下文,并将其注入提示中。三种检索机制确保准确性:嵌入向量的余弦相似度、赫布关联图以及分层整合。
余弦相似度比较查询嵌入与存储事实。关联图连接共同激活的概念:例如,提及饮食的查询与餐厅相关时,会提取相应事实。整合机制将频繁使用的事实提升至长期记忆,替换很少请求的内容。
在CPU上检索时间为2–3毫秒。主要延迟来自OpenAI API:嵌入约700毫秒,生成约800–1500毫秒。
安装与API
模块通过Docker运行:
git clone https://github.com/ngt-memory/ngt-memory
cd ngt-memory
cp .env.example .env # OPENAI_API_KEY
docker-compose up -d
客户端代码:
import httpx
client = httpx.Client(base_url="http://localhost:9190")
# 存储事实
client.post("/chat", json={
"message": "我是素食主义者,住在莫斯科。",
"session_id": "user_42"
})
# 通过会话检索
r = client.post("/chat", json={
"message": "我该吃什么?",
"session_id": "user_42"
})
print(r.json()["response"]) # 莫斯科的素食餐厅
print(r.json()["memories_count"]) # 2
端点:/chat、/store、/retrieve、/session/reset、/health。
结构化用户画像
系统从消息中提取槽位:年龄、城市、饮食、过敏信息。数据以优先级注入系统提示:
[用户画像 — 结构化事实,最高优先级]
- 年龄: 30
- 城市: "莫斯科"
- 饮食: "素食"
[结束用户画像]
[记忆上下文 — 已验证的用户事实]
1. [0.91] 我是素食主义者,住在莫斯科。
[结束记忆上下文]
片段拼接: “我” + “30” + “岁” → “我30岁” → 年龄=30(置信度0.6)。
冲突解决: 防止年龄减少,除非出现“我搞错了”等短语。修正模式 — 60秒。
质量过滤与架构
过滤器剔除无效内容:
- 纯数字、特殊字符、单个词语
- 少于6个字母
- 助手对用户无效输入的回应
架构:
- POST /chat
- OpenAI text-embedding-3-small(约700毫秒)
- 画像提取(正则表达式)
- NGT Memory检索(余弦+关联图,2–3毫秒)
- OpenAI gpt-4.1-nano(约800–1500毫秒)
- 过滤 → 存储
技术栈:FastAPI、AsyncOpenAI、Pydantic。存储于单进程RAM中。
实验结果
实验44: 带记忆的事实准确性为2.44/3(比无记忆的1.22/3提升100%)。
实验48: A/B测试,94%记忆获胜(17/18),平均得分0.889 vs 0.056。
实验49: 在边缘案例(跨语言、拼接、冲突)上达到51/54(94%)。
性能(5000条事实):
| 操作 | 吞吐量 | p50 |
|-----------|------------|-----|
| store() | 3450/秒 | 0.29毫秒 |
| retrieve()| 150/秒 | 6.3毫秒 |
端到端:记忆2.5毫秒,嵌入764毫秒。
扩展挑战
- 多工作进程:每个工作进程有独立的SessionStore。解决方案:
--workers 1或使用Redis。 - 软提示:模型忽略事实。强化:"将每个事实视为绝对真理。"
- 正则表达式错误:
我对...过敏→姓名=过敏。黑名单25+词语。
关键要点
- 结合余弦相似度、关联图与整合,在边缘测试中达到94%准确率。
- 结构化画像与提示优先级使准确性翻倍。
- 质量过滤器防止无效内容导致搜索性能下降。
- 记忆延迟2–3毫秒,非瓶颈。
- 开源,BSL 1.1许可,支持Docker。
— Editorial Team
暂无评论。