动手实践:基于 Graphiti 源码定制一个具备长短期记忆的个人助理
在构建大语言模型LLM驱动的个人助理时最头疼的问题莫过于“记忆力”。传统的 RAG检索增强生成虽然能检索相关文档但在处理复杂的跨度时间长、关系错综复杂的个人信息时往往显得力不从心。由 Zep 团队开源的Graphiti为这一问题提供了一个优雅的解决方案动态知识图谱Dynamic Knowledge Graphs。今天我们将深入探讨 Graphiti 的核心原理并动手实践如何基于其源码定制一个具备真正“长短期记忆”的个人助理。为什么选择 Graphiti传统的向量数据库Vector DB像是一张“平面”的索引而人类的记忆是“立体”且“演化”的。Graphiti 的核心优势在于时态感知Temporal Awareness它能理解信息随时间的变化例如“我以前住在北京现在搬到了上海”。关系驱动不仅记住“实体”更记住“实体间的联系”。自动演化随着新对话的录入图谱会自动更新、合并并删除过时的信息。系统架构设计我们要定制的个人助理架构如下短期记忆Short-term Memory最近的对话上下文存储在内存或快速缓存中。长期记忆Long-term Memory基于 Graphiti 构建的动态知识图谱存储在 Neo4j 中。提取层利用 LLM 从对话中提取实体Entity和关系Relation。检索层结合语义搜索和图搜索为 LLM 提供最相关的上下文。动手实践代码实现1. 环境准备首先确保你安装了 Python 3.10 和 Neo4jGraphiti 的主要图数据库后端。Bashpip install graphiti-core同时你需要配置 OpenAI 或其他 LLM 的 API 密钥因为 Graphiti 需要 LLM 来解析文本。2. 初始化 Graphiti 客户端Graphiti 的核心逻辑在于Graphiti类。我们首先建立连接Pythonfrom graphiti import Graphiti # 连接到 Neo4j NEO4J_URI bolt://localhost:7687 NEO4J_AUTH (neo4j, your_password) graphiti Graphiti( neo4j_uriNEO4J_URI, neo4j_authNEO4J_AUTH, openai_api_keyyour_openai_api_key )3. 定制化构建记忆注入函数为了让助理拥有“过目不忘”的能力我们需要将每次对话内容异步存入图谱。Pythonimport uuid async def add_memory(user_id: str, text: str): # 为每条记忆创建一个唯一的 Episodic情境节点 episode_id str(uuid.uuid4()) # Graphiti 会自动提取实体和关系并将其织入长期的知识图谱 await graphiti.add_episode( namefConversation_{episode_id}, contenttext, reference_iduser_id ) print(记忆已存入长期图谱。)4. 检索与记忆唤醒当用户提问时助理不仅要看当前的对话还要从 Graphiti 中寻找相关的历史背景。Pythonasync def chat_with_assistant(user_id: str, user_query: str): # 1. 从 Graphiti 检索相关上下文基于语义和拓扑结构 search_results await graphiti.search(user_query, reference_iduser_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目录下。实体类型定制默认情况下Graphiti 提取人名、地名。在个人助理场景下你可以修改 Prompt让它专门提取用户的“偏好”、“家庭关系”或“过敏史”。权重演化算法你可以修改源码中关于“衰减因子”的部分。对于经常被提及的关系比如“最好的朋友”增加其权重使其在检索时更易被唤醒。场景演示它能记住什么第一天用户“我最近在学网球教练是王老师。”Graphiti 行为创建用户 --正在学习-- 网球网球 --教练是-- 王老师。一周后用户“我想给我的网球教练买个小礼物有什么建议吗”助理基于 Graphiti“考虑到王老师带你练网球非常专业你可以送他吸汗带或运动护腕。”这种跨越时间的逻辑关联是纯向量检索难以稳定实现的而 Graphiti 通过图谱节点轻松达成。结语Graphiti 不仅仅是一个库它代表了 LLM 应用从“无状态聊天”向“有状态智能体”演进的关键一步。通过将其源码整合进你的个人助理项目你将能够赋予 AI 一个永不磨灭且不断进化的“大脑”。