在构建大语言模型(LLM)驱动的个人助理时,最头疼的问题莫过于“记忆力”。传统的 RAG(检索增强生成)虽然能检索相关文档,但在处理复杂的跨度时间长、关系错综复杂的个人信息时,往往显得力不从心。

由 Zep 团队开源的 Graphiti 为这一问题提供了一个优雅的解决方案:动态知识图谱(Dynamic Knowledge Graphs)。今天,我们将深入探讨 Graphiti 的核心原理,并动手实践如何基于其源码定制一个具备真正“长短期记忆”的个人助理。


为什么选择 Graphiti?

传统的向量数据库(Vector DB)像是一张“平面”的索引,而人类的记忆是“立体”且“演化”的。Graphiti 的核心优势在于:

  1. 时态感知(Temporal Awareness):它能理解信息随时间的变化(例如:“我以前住在北京,现在搬到了上海”)。

  2. 关系驱动:不仅记住“实体”,更记住“实体间的联系”。

  3. 自动演化:随着新对话的录入,图谱会自动更新、合并并删除过时的信息。


系统架构设计

我们要定制的个人助理架构如下:

  • 短期记忆(Short-term Memory):最近的对话上下文,存储在内存或快速缓存中。

  • 长期记忆(Long-term Memory):基于 Graphiti 构建的动态知识图谱,存储在 Neo4j 中。

  • 提取层:利用 LLM 从对话中提取实体(Entity)和关系(Relation)。

  • 检索层:结合语义搜索和图搜索,为 LLM 提供最相关的上下文。


动手实践:代码实现

1. 环境准备

首先,确保你安装了 Python 3.10+ 和 Neo4j(Graphiti 的主要图数据库后端)。

Bash

pip install graphiti-core

同时,你需要配置 OpenAI 或其他 LLM 的 API 密钥,因为 Graphiti 需要 LLM 来解析文本。

2. 初始化 Graphiti 客户端

Graphiti 的核心逻辑在于 Graphiti 类。我们首先建立连接:

Python

from graphiti import Graphiti

# 连接到 Neo4j
NEO4J_URI = "bolt://localhost:7687"
NEO4J_AUTH = ("neo4j", "your_password")

graphiti = Graphiti(
    neo4j_uri=NEO4J_URI,
    neo4j_auth=NEO4J_AUTH,
    openai_api_key="your_openai_api_key"
)
3. 定制化:构建记忆注入函数

为了让助理拥有“过目不忘”的能力,我们需要将每次对话内容异步存入图谱。

Python

import uuid

async def add_memory(user_id: str, text: str):
    # 为每条记忆创建一个唯一的 Episodic(情境)节点
    episode_id = str(uuid.uuid4())
    
    # Graphiti 会自动提取实体和关系,并将其织入长期的知识图谱
    await graphiti.add_episode(
        name=f"Conversation_{episode_id}",
        content=text,
        reference_id=user_id
    )
    print("记忆已存入长期图谱。")
4. 检索与记忆唤醒

当用户提问时,助理不仅要看当前的对话,还要从 Graphiti 中寻找相关的历史背景。

Python

async def chat_with_assistant(user_id: str, user_query: str):
    # 1. 从 Graphiti 检索相关上下文(基于语义和拓扑结构)
    search_results = await graphiti.search(user_query, reference_id=user_id)
    
    context = ""
    for result in search_results:
        context += f"相关事实: {result.content}\n"
    
    # 2. 构造 Prompt 给 LLM
    prompt = f"""
    你是用户的个人助理。
    以下是关于用户的已知长期记忆:
    {context}
    
    当前用户问题:{user_query}
    请结合已知信息回答。
    """
    
    # 调用 LLM 生成回答 (伪代码)
    # response = llm.generate(prompt)
    # return response

源码级定制:如何优化记忆提取?

如果你想更深度地定制助理,可以修改 Graphiti 的 Extraction Logic(位于源码的 graphiti/llm 目录下)。

  1. 实体类型定制:默认情况下,Graphiti 提取人名、地名。在个人助理场景下,你可以修改 Prompt,让它专门提取用户的“偏好”、“家庭关系”或“过敏史”。

  2. 权重演化算法:你可以修改源码中关于“衰减因子”的部分。对于经常被提及的关系(比如“最好的朋友”),增加其权重,使其在检索时更易被唤醒。


场景演示:它能记住什么?

  • 第一天:

    • 用户:“我最近在学网球,教练是王老师。”

    • Graphiti 行为: 创建 用户 --正在学习--> 网球网球 --教练是--> 王老师

  • 一周后:

    • 用户:“我想给我的网球教练买个小礼物,有什么建议吗?”

    • 助理(基于 Graphiti): “考虑到王老师带你练网球非常专业,你可以送他吸汗带或运动护腕。”

这种跨越时间的逻辑关联,是纯向量检索难以稳定实现的,而 Graphiti 通过图谱节点轻松达成。


结语

Graphiti 不仅仅是一个库,它代表了 LLM 应用从“无状态聊天”向“有状态智能体”演进的关键一步。通过将其源码整合进你的个人助理项目,你将能够赋予 AI 一个永不磨灭且不断进化的“大脑”。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐