超越 RAG:使用知识图谱构建具备“Deep Memory”的 AI 伴侣

发布: (2026年2月9日 GMT+8 08:07)
11 分钟阅读
原文: Dev.to

Source: Dev.to

请提供您希望翻译的具体文本内容,我将为您翻译成简体中文并保留原始的格式、Markdown 语法以及技术术语。谢谢!

为什么标准 RAG 不够

大多数 AI 记忆系统今天依赖 向量 RAG

  1. 将文本切块。
  2. 将每个块转换为向量。
  3. 稍后检索最 相似 的块。

这在从 PDF 中查找特定政策时效果很好,但在建模人际关系和历史时就显得力不从心。

向量捕获的是 相似性,而不是 结构

如果我的妻子说:“我今天感觉压力很大”,向量搜索可能会弹出三个月前包含“overwhelm”一词的日记条目。
知识图谱 则可以表示 故事

"Project A" → CAUSED → "Stress" → RESULTED_IN → "Overwhelm"

我需要 AI 理解 因果关系,而不仅仅是关键词的重叠。

架构决策:全上下文注入

我使用的是 Google 的 Gemini 模型,它们拥有巨大的上下文窗口。与其检索少量小块,我可以将 整个编译好的个人档案 注入提示中。

流程

  1. 将原始聊天记录转换为结构化图谱。
  2. 将图谱展平为简明的 “用户手册”(实体和关系的纯文本描述)。
  3. 在每次交互前将该手册喂给模型。

使用 Graphiti(开源图谱索引框架)进行索引后,编译输出从约 35 k 令牌压缩到约 14 k 令牌——远低于原始主提示的大小。

介绍 Synapse:架构

项目分为两个逻辑层:

技术栈角色
Body(前端)React 19 + Convex实时 UI 与聊天处理
Brain(后端)Python + FastAPI大量数据处理,图管理
Memory EngineGraphiti + Neo4j知识图谱存储与检索
ModelsGemini 3 Flash(图构建)
Gemini 2.5 Flash(聊天)
性价比高,高吞吐量推理

高层视图

high‑level view

Source:

工作原理:“深度记忆”流水线

系统分为三个不同的阶段。

阶段 A – 对话(聊天)

  • 用户与 Gemini 2.5 Flash 交谈——快速、流畅的回复。
  • 在用户发送第一条信息之前,系统提示 已经被 注入 了整个知识图谱的文本摘要。
  • 模型立即知道用户是谁、他们在担心什么、以及他们的朋友是谁。

阶段 B – 摄取(“睡眠”周期)

当对话结束(3 小时无活动或手动点击 “Consolidate”)时,聊天记录会被发送到 Python Cortex,由 Gemini 3 Flash 进行处理。

为什么选 Gemini 3?
从混乱的人类对话中提取实体非常困难。Gemini 3 能够理解细微的陈述并正确更新图谱。

示例:

“我停止服用药物 X,改为服用 Y。”

Gemini 3 会产生以下逻辑更新:

  1. 找到节点 Medication X
  2. 添加关系 STOPPED
  3. 创建节点 Medication Y
  4. 添加关系 STARTED

实体提取示例

阶段 C – 注入(觉醒)

当用户返回时,下一次会话会以 新的编译图谱摘要 开始。系统并不是直接输出原始三元组,而是将节点和边转换为模型可以瞬间读取的自然语言叙述。

def _format_compilation(definitions: list[str], relationships: list[str]) -> str:
    """
    Turn a list of node definitions and relationship statements into a
    readable, sectioned prompt for the LLM.
    """
    sections = []

    if definitions:
        sections.append(
            "#### 1. CONCEPTUAL ENTITIES\n" +
            "\n".join(f"- {d}" for d in definitions)
        )

    if relationships:
        sections.append(
            "#### 2. RELATIONSHIPS\n" +
            "\n".join(f"- {r}" for r in relationships)
        )

    # Add any additional formatting or ordering logic here.
    return "\n\n".join(sections)

编译后的提示(约 14 k tokens)会被预置到聊天的最前面,为模型提供用户生活的 深层、结构化记忆

要点

  • 知识图谱 捕捉向量遗漏的结构和因果关系。
  • 大上下文模型(Gemini)让你注入整本“用户手册”,而不是少量检索到的片段。
  • 三阶段流水线——Chat → Sleep → Hydration——模拟人类如何巩固记忆。

Synapse AI Chat 将 35 k 令牌的手册转化为 14 k 令牌、基于图的“连续大脑”,感觉个性化、上下文感知且运行成本低。

如果您对代码感兴趣或想自行尝试,欢迎打开 issue 或在下方留言!

Source:

“杀手级功能”:记忆探索器

AI 记忆通常是一个 “黑箱”。 用户不信任他们看不见的东西。

我想让我的妻子能够审计自己的大脑,于是我使用 react‑force‑graph 构建了一个可视化工具。她可以看到代表她生活的气泡:工作健康家庭

Memory Explorer screenshot

如果她看到某个连接是错误的(例如,AI 认为她喜欢一种她实际上讨厌的食物),她可以编辑输入并使用新信息重新处理图表,例如 “我现在真的讨厌蘑菇。”

系统随后会处理该新输入,更新图表,创建新的节点/关系,或使现有的失效。这种 人机交互(human‑in‑the‑loop)方法能够建立巨大的信任。

工程挑战

构建这套系统不仅仅是提示工程的问题,还面临真实的系统挑战。

1. 处理延迟(作业队列)

图谱摄取速度较慢——Graphiti 和 Gemini 处理一段长对话并更新 Neo4j 需要 60 – 200 秒。我不能让 UI 卡住三分钟。

解决方案: 使用 Convex 作为作业队列。当会话结束时,UI 立即返回。Convex 在后台处理作业,并将 UI 状态更新为 “Processing…”,完成后再显示 “Memory Updated”

2. 处理不稳定性(重试逻辑)

Gemini API 功能强大,但在进行大量图谱处理任务时偶尔会抛出 503 Service Unavailable 错误。

解决方案: 实现一个带指数退避的 事件驱动重试 系统。

// retry delays (ms)
export const RETRY_DELAYS_MS = [
  0,            // Attempt 1: Immediate
  2 * 60_000,   // Attempt 2: +2 min (let the API cool down)
  10 * 60_000,  // Attempt 3: +10 min
  30 * 60_000,  // Attempt 4: +30 min
];

export const processJob = internalAction({
  args: { jobId: v.id("cortex_jobs") },
  handler: async (ctx, args) => {
    const job = await ctx.runQuery(internal.cortexJobs.get, { id: args.jobId });

    try {
      // 1️⃣ Heavy lifting (Call Gemini 3 Flash)
      // This is where 503 errors usually happen
      await ingestGraphData(ctx, job.payload);

      // 2️⃣ Mark complete if successful
      await ctx.runMutation(internal.cortexJobs.complete, { jobId: args.jobId });

    } catch (error) {
      const nextAttempt = job.attempts + 1;

      if (nextAttempt >= job.maxAttempts) {
        // Stop after too many tries
        await ctx.runMutation(internal.cortexJobs.fail, {
          jobId: args.jobId,
          error: String(error),
        });
      } else {
        // 3️⃣ Schedule the retry using Convex's scheduler
        const delay = RETRY_DELAYS_MS[nextAttempt] ?? 30 * 60_000;

        await ctx.scheduler.runAfter(
          delay,
          internal.processor.processJob,
          { jobId: args.jobId }
        );
      }
    }
  },
});

3. 流畅的用户体验

Convex 的实时同步是救命稻草。我无需编写复杂的 WebSocket 代码。当 Python 后端在数据库中更新记忆作业的状态时,React UI 能即时刷新。

令牌流式传输在 Convex 作为中间层时表现更佳,因为后端始终保持与 Convex 的连接。如果用户浏览器关闭或连接中断,令牌生成仍会继续,将答案传递给 Convex,并在可能时再流式发送给用户。

注意事项: 每一次更新都会计入函数使用量,因此流式更新被限制为 100 ms 的间隔,以在响应速度和数据库写入效率之间取得平衡。

结果

差距天壤之别。

BeforeAfter
我的妻子因为“上下文设置”成本而害怕开启新线程。她觉得自己不断重复,而且必须手动用新数据更新主提示。她只需要说话。系统会维护约 10 000 tokenDeep Memory(从数月聊天压缩而来),并自动注入。
各个线程相互隔离;上下文无法传递。所有线程共享同一个 Cortex。如果她在“工作”线程中提到健康问题(例如,“我因为久坐背部疼痛”),下次登录时,“健康”线程也会知道。

Conclusion

这个项目让我认识到,我们正从 横向 AI 平台(例如 ChatGPT,了解一点所有事物)转向 纵向 AI 堆栈,它们能够 全面了解你

ChatGPT 和 Gemini 已经在添加用户画像和对话摘要,以构建这种记忆。他们追求的目标相同:提供真正个性化的体验。

关键要点:

  • 向量 非常适合搜索。
  • 知识图谱 对于理解至关重要。

我仍然乐于为真实问题构建解决方案。借助当今强大的工具,我们可以 快速可信赖 地打造出色的软件。

项目已上线,访问 https://synapse-chat.juandastic.dev/ 即可观看实际效果。

如果想深入了解实现细节,代码已开源:

期待听到你的感想和想法。欢迎在 X 继续交流,或通过 LinkedIn 与我联系。

0 浏览
Back to Blog

相关文章

阅读更多 »