各位好久不见,我是久愿Y,自从上次换工作,已经很久没有更新文章了,现在技术圈一天一个样子,新技术层出不穷,希望能通过写文章的方式,让自己能吸纳更多知识,也欢迎一起交流。
知识图谱本质上要解决的,不是“数据不够多”,而是“数据之间明明有关系,但传统文本检索和普通表结构很难把这种关系表达清楚、追踪清楚、利用清楚”。
知识图谱真正擅长的是:
比如教育场景:
这种问题,向量检索能找到"像"的内容,但很难天然给出:
例如用户记忆:
这些东西如果全塞进长文本里,后续更新、去重、合并、追溯会很痛苦。
图谱更适合把它拆成:
Agent 场景下,很多记忆不是一次性文档,而是长期沉淀:
传统 RAG 更像“把一段文本找回来”;图谱更像“把一张关系网络中的相关节点和边找回来”。两者都能用,但解决的问题重心不一样。
知识图谱不是某一种固定存储格式,而是一种组织“实体—关系—属性”的方式。 怎么存只取决于对实际关系的描述。
知识图谱最常见的抽象是三元组:
(实体1, 关系, 实体2)
例如:
(绝对值, DEPENDS_ON, 正负数)
(学生A, STUDIED, 绝对值)
(学生A, MADE_MISTAKE_IN, 绝对值)
但真实系统不会只停在三元组这一步。还会有很多其他属性:
{
"source": "studentA",
"relation": "STUDIED",
"target": "绝对值",
"properties": {
"mastery": 0.4,
"timestamp": "2026-05-17T14:00:00Z"
}
}
也就是说,实际存储一般是:
| id | type | name | content | metadata |
|---|---|---|---|---|
| 1 | knowledge_point | 绝对值 | 数轴上... | {"grade":7} |
| 2 | knowledge_point | 正负数 | ... | {} |
| 3 | user | student-001 | null | {"grade":7} |
| id | source_id | relation_type | target_id | properties |
|---|---|---|---|---|
| 1 | 1 | DEPENDS_ON | 2 | {} |
| 2 | 3 | STUDIED | 1 | {"mastery":0.4} |
如果想支持事件流、版本、来源追踪,通常还会加:
优先 ES / 向量库 / RAG。
订单流水、支付流水、日志写入。这些更适合 OLTP 数据库,不值得硬上图谱。
实体定义都说不清楚,图谱很容易建成一锅粥。
来源可以是:
通过规则或 LLM 提取:
例如,用户对话的qeury输入:
用户:我初一,最近在学有理数,但绝对值老做错。
抽取:
解决:
写入方式可能是:
check后保留:
最终存储内容
场景:学生小张(初一)在 Agent 辅导中问了一个问题:"老师,| -3 | 等于多少?为什么不是 -3?"
Step 1 → 输入到来
输入来源:用户对话
{
"role": "user",
"content": "老师,| -3 | 等于多少?为什么不是 -3?",
"session_id": "session_20260517_001"
}
Step 2 → 抽取候选事实
Agent 调用 LLM 抽取:
Step 3 → 标准化 / 去重
系统检查图谱中是否已有"绝对值"节点:
math-7-ch1-03Step 4 → 写入图谱
新增关系节点:
(source: student_001, relation: STUDIED, target: math-7-ch1-03)
→ 属性: { method: "agent_explain", duration: 120, timestamp: "2026-05-17T15:30:00Z" }(source: student_001, relation: HAS_MASTERED, target: math-7-ch1-03)
→ 属性: { level: 25, confidence: 0.6 }
Step 5 → 写入元数据
{
"source_session_ids": ["session_20260517_001"],
"timestamp": "2026-05-17T15:30:00Z",
"confidence": 0.6,
"last_seen_time": "2026-05-17T15:30:00Z"
}
写入完成后,图谱状态变化:
召回一般不是只有一种方式,而是多路召回。
用户提到"绝对值",直接命中该知识点节点。
命中"绝对值"后,沿边扩展:
对节点摘要 / chunk 做 embedding,找到语义上相关的记忆。
按以下关系做做 rerank。:
完整召回通常是:
Query → 实体识别 → 图谱命中 → 关系扩展 → 语义补充 → 排序 → 注入上下文
场景:第二天,小张又问了一个题:"| a | + | b | = 10,a 和 b 都是整数,有多少种组合?"
路 1:直接实体命中
学生提到了"绝对值",系统命中 math-7-ch1-03。
路 2:关系扩展召回
从绝对值节点出发,沿边扩展:
math-7-ch1-03 (绝对值)
→ DEPENDS_ON → math-7-ch1-01 (正负数) [掌握度: 20%]
→ DEPENDS_ON → math-7-ch1-02 (有理数) [掌握度: 35%]
→ BELONGS_TO → ch01 (第一章有理数)
→ COVERS → Q001, Q003, Q005 (相关题目)
路 3:语义召回
对"绝对值 整数 组合"做向量检索,命中:
路 4:时间 / 权重过滤
按掌握度排序(越低越优先):
最终注入 System Prompt 的上下文:
## 学生知识状态
- 小张,初一学生
- 绝对值: 掌握度 25%(薄弱)
- 正负数: 掌握度 20%(更薄弱,是绝对值的前置依赖)
- 有理数: 掌握度 35%## 相关错题记录
- 昨天在绝对值概念上提问(已解释,尚未练习)## 前置依赖链
绝对值 → 正负数 → (根节点)
Agent 收到这个上下文后,会意识到:
把一堆细碎对话压缩成 session summary。
从多条实例里抽出稳定事实。
把很多具体案例抽象成经验卡片。
旧记忆和新记忆冲突时,Dreaming 流程可以重新评估:
冲突修正的三种策略:
比如:
场景:小张连续 3 天使用 Agent 辅导,产生了大量细碎的学习记录。系统需要在凌晨离线整理。
Step 1:收集原始数据
// 过去 3 天的原始记录
Day 1: 学习了绝对值 (mastery=25)
Day 2: 做了 3 道绝对值题,2 对 1 错
Day 3: 做了 5 道绝对值题,3 对 2 错;问了正负数问题
Step 2:会话摘要
Session Summary:
- 学习主题: 有理数章节(绝对值 + 正负数)
- 核心问题: 绝对值掌握不稳定,正负数是前置薄弱点
- 错误模式: 符号混淆(-(-3) 答成 -3)
- 学习风格: 需要举例后抽象,不喜欢纯理论
Step 3:事实蒸馏
从多条实例中蒸馏出稳定事实:
// 从 3 次交互中蒸馏
旧: (小张, PREFERS, 先举例后抽象) ×1
新: (小张, PREFERS, 先举例后抽象) ×3
→ 蒸馏: (小张, PREFERS, 先举例后抽象) confidence=0.9// 从错题中蒸馏错误模式
Day2 错题: 符号混淆
Day3 错题: 符号混淆
→ 蒸馏: (小张, HAS_ERROR_PATTERN, 符号混淆) occurrence=2
Step 4:更新长期记忆图谱
// 更新掌握度(综合 3 天表现)
(小张, HAS_MASTERED, math-7-ch1-03)
→ level: 25 → 35 (有进步但还不稳定)
→ confidence: 0.5 (波动大)// 新增错误模式节点
(小张, HAS_ERROR_PATTERN, 符号混淆)
→ occurrence: 2
→ last_occurred: Day3
→ is_resolved: false// 新增学习偏好节点
(小张, PREFERS, 先举例后抽象)
→ confidence: 0.9
→ source_sessions: [session_001, session_002, session_003]
Step 5:清理
Dreaming 前后对比:
| 维度 | Dreaming 前 | Dreaming 后 |
|---|---|---|
| 原始记录 | 3 天 × 多轮 = 大量碎片 | 已聚合 |
| 掌握度 | 多次独立记录 | 一条综合记录 (level=35) |
| 错误模式 | 散落在错题记录里 | 合并为 ERROR_PATTERN 节点 |
| 偏好 | 未显式记录 | 显式记录,confidence=0.9 |
| 图谱复杂度 | 高(大量冗余节点) | 低(干净、结构化) |
原因通常是:
结果就是:
原则:图谱不是越大越好,而是越干净越好。
如果靠 LLM 自动抽实体和关系,会遇到:
工程上必须加:
新增一条记忆不难,难的是:
所以图谱系统真正难点通常不在"写入",而在:
如果:
性能一样会烂。
所以现实里经常是混合架构:图数据库 + MySQL + ES + Milvus
图数据库:管关系结构和多跳遍历
MySQL:管事务、元数据、置信度、来源链
ES:管全文搜索和关键词召回
Milvus:管语义向量召回
文档切块 → embedding → 向量检索 → 找回相似文本 → 塞给 LLM
它本质上擅长:
抽实体和关系 → 构建关系网络 → 基于实体命中和图遍历召回 → 再补充文本上下文
| 维度 | 传统 RAG | 图谱 / Graph RAG |
|---|---|---|
| 基本对象 | 文本 chunk | 实体 + 关系 + chunk |
| 召回依据 | 语义相似度 | 关系结构 + 语义 |
| 擅长 | 文档问答、知识库检索 | 依赖分析、关系推理、长期记忆 |
| 可解释性 | 一般 | 更强,能解释召回链路 |
| 更新方式 | 重新切块 / 重建索引 | 可增量更新节点和边 |
| 多跳推理 | 弱 | 强 |
| 复杂度 | 低 | 高 |
| 典型场景 | 文档问答 / 知识库检索 / FAQ | 用户长期记忆 / 依赖分析 / 跨会话关系推理 |
以下是主流图谱 / Agent Memory 方案的横向对比:
| 方案 | 关系推理 | 时序感知 | 是否轻量 | 适合 Agent Memory | 备注 |
|---|---|---|---|---|---|
| Neo4j | 强(Cypher 多跳查询) | 需自行实现(属性存时间戳) | 中(独立部署) | 需自建模+LLM集成 | 生态最成熟,社区最好,适合标准知识图谱 |
| JanusGraph | 强(分布式图遍历) | 需自行实现 | 重(依赖 Cassandra/HBase) | 不适合(面向超大图分析) | 适合超大规模图,运维成本高 |
| TigerGraph | 强(高性能图分析) | 需自行实现 | 重(企业级部署) | 不太适合(门槛高) | 企业级场景,成本和上手门槛高 |
| NebulaGraph | 强(原生分布式图) | 需自行实现 | 中(分布式部署) | 需自建模 | 国产开源,性能优秀,社区增长快 |
| Mem0 | 中(内置图谱结构) | 是(内置记忆时效) | 轻(SaaS/API) | 非常适合 | 面向 AI Memory,支持对话抽记忆,上手快 |
| GraphRAG(微软) | 强(社区摘要+实体图谱) | 弱(偏静态文档) | 中偏重 | 适合知识库问答 | 从大规模文档构建图谱,偏知识库而非个体记忆 |
| LlamaIndex GraphRAG | 中(与LlamaIndex生态结合) | 弱 | 轻 | 适合快速实验 | 适合已用LlamaIndex的团队做图谱检索实验 |
| Zep/Graphiti | 强(原生时序图谱) | 强(内置时序边) | 中(需自部署) | 非常适合 | 专为 Agent Memory 设计,内置会话级时序感知 |
| LightRAG | 中(轻量图谱+向量双检索) | 弱 | 轻(单机可用) | 适合快速落地 | 轻量级 GraphRAG,内置关系提取+向量召回,适合原型 |
| KAG | 强(知识增强+图推理) | 中 | 中 | 适合知识密集型场景 | 知识增强图谱,支持多源知识融合和逻辑推理 |
小数 — 初中数学智能辅导助手
基于 Next.js + LLM + Mem0 长期记忆 的初中数学辅导 Agent,具备知识点依赖追踪、错题关联提醒和学习记忆持久化能力。
项目截图

github.com/AdolescentJ…
欢迎交流~
如果再粗暴一点:
这才是它真正的价值。