动手实践:基于 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+ 和 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 目录下)。
-
实体类型定制:默认情况下,Graphiti 提取人名、地名。在个人助理场景下,你可以修改 Prompt,让它专门提取用户的“偏好”、“家庭关系”或“过敏史”。
-
权重演化算法:你可以修改源码中关于“衰减因子”的部分。对于经常被提及的关系(比如“最好的朋友”),增加其权重,使其在检索时更易被唤醒。
场景演示:它能记住什么?
-
第一天:
-
用户:“我最近在学网球,教练是王老师。”
-
Graphiti 行为: 创建
用户 --正在学习--> 网球,网球 --教练是--> 王老师。
-
-
一周后:
-
用户:“我想给我的网球教练买个小礼物,有什么建议吗?”
-
助理(基于 Graphiti): “考虑到王老师带你练网球非常专业,你可以送他吸汗带或运动护腕。”
-
这种跨越时间的逻辑关联,是纯向量检索难以稳定实现的,而 Graphiti 通过图谱节点轻松达成。
结语
Graphiti 不仅仅是一个库,它代表了 LLM 应用从“无状态聊天”向“有状态智能体”演进的关键一步。通过将其源码整合进你的个人助理项目,你将能够赋予 AI 一个永不磨灭且不断进化的“大脑”。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)