Graphiti:构建AI智能体的实时知识图谱完全指南_graphiti 知识图谱
摘要
本文深入探讨Graphiti框架的核心概念、架构设计和实践应用。Graphiti是一个专门为AI智能体设计的实时知识图谱构建框架,它能够持续整合用户交互、结构化数据和非结构化数据,构建可查询的时序知识图谱。通过详细的代码示例、架构图和最佳实践,帮助开发者掌握Graphiti的使用方法,构建智能、动态的AI应用系统。
目录
- 知识图谱与Graphiti概述
- Graphiti核心特性
- 系统架构设计
- 快速开始指南
- 高级功能应用
- 最佳实践与优化
- 常见问题解答
- 总结与展望
1. 知识图谱与Graphiti概述
1.1 什么是知识图谱
知识图谱是一种以图结构表示知识的方式,由实体(节点)和关系(边)组成。例如:\"小明喜欢Python编程\"这个事实可以表示为:
- 实体1:小明
- 关系:喜欢
- 实体2:Python编程
#mermaid-svg-CiYNDNiPd2yKTJUK {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-CiYNDNiPd2yKTJUK .error-icon{fill:#552222;}#mermaid-svg-CiYNDNiPd2yKTJUK .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-CiYNDNiPd2yKTJUK .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-CiYNDNiPd2yKTJUK .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-CiYNDNiPd2yKTJUK .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-CiYNDNiPd2yKTJUK .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-CiYNDNiPd2yKTJUK .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-CiYNDNiPd2yKTJUK .marker{fill:#333333;stroke:#333333;}#mermaid-svg-CiYNDNiPd2yKTJUK .marker.cross{stroke:#333333;}#mermaid-svg-CiYNDNiPd2yKTJUK svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-CiYNDNiPd2yKTJUK .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-CiYNDNiPd2yKTJUK .cluster-label text{fill:#333;}#mermaid-svg-CiYNDNiPd2yKTJUK .cluster-label span{color:#333;}#mermaid-svg-CiYNDNiPd2yKTJUK .label text,#mermaid-svg-CiYNDNiPd2yKTJUK span{fill:#333;color:#333;}#mermaid-svg-CiYNDNiPd2yKTJUK .node rect,#mermaid-svg-CiYNDNiPd2yKTJUK .node circle,#mermaid-svg-CiYNDNiPd2yKTJUK .node ellipse,#mermaid-svg-CiYNDNiPd2yKTJUK .node polygon,#mermaid-svg-CiYNDNiPd2yKTJUK .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-CiYNDNiPd2yKTJUK .node .label{text-align:center;}#mermaid-svg-CiYNDNiPd2yKTJUK .node.clickable{cursor:pointer;}#mermaid-svg-CiYNDNiPd2yKTJUK .arrowheadPath{fill:#333333;}#mermaid-svg-CiYNDNiPd2yKTJUK .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-CiYNDNiPd2yKTJUK .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-CiYNDNiPd2yKTJUK .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-CiYNDNiPd2yKTJUK .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-CiYNDNiPd2yKTJUK .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-CiYNDNiPd2yKTJUK .cluster text{fill:#333;}#mermaid-svg-CiYNDNiPd2yKTJUK .cluster span{color:#333;}#mermaid-svg-CiYNDNiPd2yKTJUK div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-CiYNDNiPd2yKTJUK :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 喜欢 小明 Python编程
1.2 Graphiti的独特优势
#mermaid-svg-NFv1iYIXtTJew9sh {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-NFv1iYIXtTJew9sh .error-icon{fill:#552222;}#mermaid-svg-NFv1iYIXtTJew9sh .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-NFv1iYIXtTJew9sh .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-NFv1iYIXtTJew9sh .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-NFv1iYIXtTJew9sh .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-NFv1iYIXtTJew9sh .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-NFv1iYIXtTJew9sh .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-NFv1iYIXtTJew9sh .marker{fill:#333333;stroke:#333333;}#mermaid-svg-NFv1iYIXtTJew9sh .marker.cross{stroke:#333333;}#mermaid-svg-NFv1iYIXtTJew9sh svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-NFv1iYIXtTJew9sh .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-NFv1iYIXtTJew9sh .cluster-label text{fill:#333;}#mermaid-svg-NFv1iYIXtTJew9sh .cluster-label span{color:#333;}#mermaid-svg-NFv1iYIXtTJew9sh .label text,#mermaid-svg-NFv1iYIXtTJew9sh span{fill:#333;color:#333;}#mermaid-svg-NFv1iYIXtTJew9sh .node rect,#mermaid-svg-NFv1iYIXtTJew9sh .node circle,#mermaid-svg-NFv1iYIXtTJew9sh .node ellipse,#mermaid-svg-NFv1iYIXtTJew9sh .node polygon,#mermaid-svg-NFv1iYIXtTJew9sh .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-NFv1iYIXtTJew9sh .node .label{text-align:center;}#mermaid-svg-NFv1iYIXtTJew9sh .node.clickable{cursor:pointer;}#mermaid-svg-NFv1iYIXtTJew9sh .arrowheadPath{fill:#333333;}#mermaid-svg-NFv1iYIXtTJew9sh .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-NFv1iYIXtTJew9sh .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-NFv1iYIXtTJew9sh .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-NFv1iYIXtTJew9sh .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-NFv1iYIXtTJew9sh .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-NFv1iYIXtTJew9sh .cluster text{fill:#333;}#mermaid-svg-NFv1iYIXtTJew9sh .cluster span{color:#333;}#mermaid-svg-NFv1iYIXtTJew9sh div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-NFv1iYIXtTJew9sh :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} Graphiti 实时更新 时序感知 混合检索 自定义实体 增量数据集成 历史查询 语义+关键词+图谱 灵活建模
1.3 与传统RAG的对比
2. Graphiti核心特性
2.1 实时增量更新
from graphiti_core import Graphiti# 初始化Graphiti实例graphiti = Graphiti( \"bolt://localhost:7687\", # Neo4j连接地址 \"neo4j\", # 用户名 \"password\", # 密码)# 添加新的交互数据async def add_interaction(user_id: str, content: str): \"\"\"添加用户交互数据到知识图谱\"\"\" try: await graphiti.add_episode( content=content, metadata={ \"user_id\": user_id, \"timestamp\": datetime.now().isoformat() } ) except Exception as e: logger.error(f\"添加交互数据失败: {str(e)}\") raise
2.2 双时序数据模型
#mermaid-svg-E1SfaE5rGeIzhO7d {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-E1SfaE5rGeIzhO7d .error-icon{fill:#552222;}#mermaid-svg-E1SfaE5rGeIzhO7d .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-E1SfaE5rGeIzhO7d .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-E1SfaE5rGeIzhO7d .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-E1SfaE5rGeIzhO7d .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-E1SfaE5rGeIzhO7d .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-E1SfaE5rGeIzhO7d .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-E1SfaE5rGeIzhO7d .marker{fill:#333333;stroke:#333333;}#mermaid-svg-E1SfaE5rGeIzhO7d .marker.cross{stroke:#333333;}#mermaid-svg-E1SfaE5rGeIzhO7d svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-E1SfaE5rGeIzhO7d .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-E1SfaE5rGeIzhO7d .cluster-label text{fill:#333;}#mermaid-svg-E1SfaE5rGeIzhO7d .cluster-label span{color:#333;}#mermaid-svg-E1SfaE5rGeIzhO7d .label text,#mermaid-svg-E1SfaE5rGeIzhO7d span{fill:#333;color:#333;}#mermaid-svg-E1SfaE5rGeIzhO7d .node rect,#mermaid-svg-E1SfaE5rGeIzhO7d .node circle,#mermaid-svg-E1SfaE5rGeIzhO7d .node ellipse,#mermaid-svg-E1SfaE5rGeIzhO7d .node polygon,#mermaid-svg-E1SfaE5rGeIzhO7d .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-E1SfaE5rGeIzhO7d .node .label{text-align:center;}#mermaid-svg-E1SfaE5rGeIzhO7d .node.clickable{cursor:pointer;}#mermaid-svg-E1SfaE5rGeIzhO7d .arrowheadPath{fill:#333333;}#mermaid-svg-E1SfaE5rGeIzhO7d .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-E1SfaE5rGeIzhO7d .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-E1SfaE5rGeIzhO7d .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-E1SfaE5rGeIzhO7d .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-E1SfaE5rGeIzhO7d .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-E1SfaE5rGeIzhO7d .cluster text{fill:#333;}#mermaid-svg-E1SfaE5rGeIzhO7d .cluster span{color:#333;}#mermaid-svg-E1SfaE5rGeIzhO7d div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-E1SfaE5rGeIzhO7d :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 事件发生时间 数据记录 数据摄入时间 历史查询 实时查询
2.3 混合检索能力
# 混合检索示例async def search_knowledge(query: str, limit: int = 5): \"\"\"执行混合检索\"\"\" try: results = await graphiti.search( query=query, search_type=\"hybrid\", # 混合检索 limit=limit ) return results except Exception as e: logger.error(f\"检索失败: {str(e)}\") raise
3. 系统架构设计
3.1 整体架构
#mermaid-svg-JLnzW1YswlvYKTuV {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-JLnzW1YswlvYKTuV .error-icon{fill:#552222;}#mermaid-svg-JLnzW1YswlvYKTuV .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-JLnzW1YswlvYKTuV .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-JLnzW1YswlvYKTuV .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-JLnzW1YswlvYKTuV .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-JLnzW1YswlvYKTuV .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-JLnzW1YswlvYKTuV .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-JLnzW1YswlvYKTuV .marker{fill:#333333;stroke:#333333;}#mermaid-svg-JLnzW1YswlvYKTuV .marker.cross{stroke:#333333;}#mermaid-svg-JLnzW1YswlvYKTuV svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-JLnzW1YswlvYKTuV .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-JLnzW1YswlvYKTuV .cluster-label text{fill:#333;}#mermaid-svg-JLnzW1YswlvYKTuV .cluster-label span{color:#333;}#mermaid-svg-JLnzW1YswlvYKTuV .label text,#mermaid-svg-JLnzW1YswlvYKTuV span{fill:#333;color:#333;}#mermaid-svg-JLnzW1YswlvYKTuV .node rect,#mermaid-svg-JLnzW1YswlvYKTuV .node circle,#mermaid-svg-JLnzW1YswlvYKTuV .node ellipse,#mermaid-svg-JLnzW1YswlvYKTuV .node polygon,#mermaid-svg-JLnzW1YswlvYKTuV .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-JLnzW1YswlvYKTuV .node .label{text-align:center;}#mermaid-svg-JLnzW1YswlvYKTuV .node.clickable{cursor:pointer;}#mermaid-svg-JLnzW1YswlvYKTuV .arrowheadPath{fill:#333333;}#mermaid-svg-JLnzW1YswlvYKTuV .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-JLnzW1YswlvYKTuV .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-JLnzW1YswlvYKTuV .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-JLnzW1YswlvYKTuV .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-JLnzW1YswlvYKTuV .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-JLnzW1YswlvYKTuV .cluster text{fill:#333;}#mermaid-svg-JLnzW1YswlvYKTuV .cluster span{color:#333;}#mermaid-svg-JLnzW1YswlvYKTuV div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-JLnzW1YswlvYKTuV :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 应用层 Graphiti核心 Neo4j存储 LLM服务 向量检索 图数据库 OpenAI/Gemini Embedding服务
3.2 数据流
#mermaid-svg-X47cDayzw8fgBB3M {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-X47cDayzw8fgBB3M .error-icon{fill:#552222;}#mermaid-svg-X47cDayzw8fgBB3M .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-X47cDayzw8fgBB3M .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-X47cDayzw8fgBB3M .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-X47cDayzw8fgBB3M .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-X47cDayzw8fgBB3M .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-X47cDayzw8fgBB3M .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-X47cDayzw8fgBB3M .marker{fill:#333333;stroke:#333333;}#mermaid-svg-X47cDayzw8fgBB3M .marker.cross{stroke:#333333;}#mermaid-svg-X47cDayzw8fgBB3M svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-X47cDayzw8fgBB3M .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-X47cDayzw8fgBB3M text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-X47cDayzw8fgBB3M .actor-line{stroke:grey;}#mermaid-svg-X47cDayzw8fgBB3M .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-X47cDayzw8fgBB3M .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-X47cDayzw8fgBB3M #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-X47cDayzw8fgBB3M .sequenceNumber{fill:white;}#mermaid-svg-X47cDayzw8fgBB3M #sequencenumber{fill:#333;}#mermaid-svg-X47cDayzw8fgBB3M #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-X47cDayzw8fgBB3M .messageText{fill:#333;stroke:#333;}#mermaid-svg-X47cDayzw8fgBB3M .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-X47cDayzw8fgBB3M .labelText,#mermaid-svg-X47cDayzw8fgBB3M .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-X47cDayzw8fgBB3M .loopText,#mermaid-svg-X47cDayzw8fgBB3M .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-X47cDayzw8fgBB3M .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-X47cDayzw8fgBB3M .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-X47cDayzw8fgBB3M .noteText,#mermaid-svg-X47cDayzw8fgBB3M .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-X47cDayzw8fgBB3M .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-X47cDayzw8fgBB3M .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-X47cDayzw8fgBB3M .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-X47cDayzw8fgBB3M .actorPopupMenu{position:absolute;}#mermaid-svg-X47cDayzw8fgBB3M .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-X47cDayzw8fgBB3M .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-X47cDayzw8fgBB3M .actor-man circle,#mermaid-svg-X47cDayzw8fgBB3M line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-X47cDayzw8fgBB3M :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 应用 Graphiti核心 Neo4j数据库 LLM服务 添加新数据 实体识别 返回实体 存储实体和关系 确认存储 返回结果 应用 Graphiti核心 Neo4j数据库 LLM服务
4. 快速开始指南
4.1 环境准备
# 安装Graphitipip install graphiti-core# 安装可选依赖pip install graphiti-core[anthropic] # Anthropic支持pip install graphiti-core[google-genai] # Google Gemini支持
4.2 基础配置
from graphiti_core import Graphitifrom graphiti_core.llm_client import OpenAIClientfrom graphiti_core.embedder.openai import OpenAIEmbedder# 配置OpenAIgraphiti = Graphiti( \"bolt://localhost:7687\", \"neo4j\", \"password\", llm_client=OpenAIClient( api_key=\"your-openai-api-key\" ), embedder=OpenAIEmbedder( api_key=\"your-openai-api-key\" ))
4.3 数据操作示例
# 添加知识async def add_knowledge(): \"\"\"添加知识到图谱\"\"\" try: # 添加文本数据 await graphiti.add_episode( content=\"小明是一名Python开发者,他喜欢使用Django框架\", metadata={\"source\": \"user_input\"} ) # 添加结构化数据 await graphiti.add_episode( content={ \"person\": \"小明\", \"skill\": \"Python\", \"framework\": \"Django\" }, metadata={\"type\": \"structured\"} ) except Exception as e: logger.error(f\"添加知识失败: {str(e)}\") raise
5. 高级功能应用
5.1 自定义实体定义
from pydantic import BaseModelclass Person(BaseModel): \"\"\"人物实体定义\"\"\" name: str age: int skills: list[str]class Project(BaseModel): \"\"\"项目实体定义\"\"\" name: str description: str technologies: list[str]# 使用自定义实体async def add_custom_entities(): \"\"\"添加自定义实体\"\"\" person = Person( name=\"小明\", age=25, skills=[\"Python\", \"Django\", \"React\"] ) project = Project( name=\"智能客服系统\", description=\"基于知识图谱的智能客服系统\", technologies=[\"Python\", \"Neo4j\", \"React\"] ) await graphiti.add_episode( content={ \"person\": person.dict(), \"project\": project.dict() } )
5.2 高级查询功能
# 复杂查询示例async def complex_query(): \"\"\"执行复杂查询\"\"\" try: # 语义搜索 semantic_results = await graphiti.search( query=\"Python开发者使用的框架\", search_type=\"semantic\" ) # 图遍历查询 graph_results = await graphiti.traverse( start_node=\"小明\", relationship_type=\"USES\", depth=2 ) return { \"semantic\": semantic_results, \"graph\": graph_results } except Exception as e: logger.error(f\"查询失败: {str(e)}\") raise
6. 最佳实践与优化
6.1 性能优化
#mermaid-svg-ddRflGNTcTBHynUR {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ddRflGNTcTBHynUR .error-icon{fill:#552222;}#mermaid-svg-ddRflGNTcTBHynUR .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ddRflGNTcTBHynUR .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-ddRflGNTcTBHynUR .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ddRflGNTcTBHynUR .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ddRflGNTcTBHynUR .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ddRflGNTcTBHynUR .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ddRflGNTcTBHynUR .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ddRflGNTcTBHynUR .marker.cross{stroke:#333333;}#mermaid-svg-ddRflGNTcTBHynUR svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ddRflGNTcTBHynUR .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ddRflGNTcTBHynUR .cluster-label text{fill:#333;}#mermaid-svg-ddRflGNTcTBHynUR .cluster-label span{color:#333;}#mermaid-svg-ddRflGNTcTBHynUR .label text,#mermaid-svg-ddRflGNTcTBHynUR span{fill:#333;color:#333;}#mermaid-svg-ddRflGNTcTBHynUR .node rect,#mermaid-svg-ddRflGNTcTBHynUR .node circle,#mermaid-svg-ddRflGNTcTBHynUR .node ellipse,#mermaid-svg-ddRflGNTcTBHynUR .node polygon,#mermaid-svg-ddRflGNTcTBHynUR .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ddRflGNTcTBHynUR .node .label{text-align:center;}#mermaid-svg-ddRflGNTcTBHynUR .node.clickable{cursor:pointer;}#mermaid-svg-ddRflGNTcTBHynUR .arrowheadPath{fill:#333333;}#mermaid-svg-ddRflGNTcTBHynUR .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ddRflGNTcTBHynUR .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ddRflGNTcTBHynUR .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-ddRflGNTcTBHynUR .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-ddRflGNTcTBHynUR .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ddRflGNTcTBHynUR .cluster text{fill:#333;}#mermaid-svg-ddRflGNTcTBHynUR .cluster span{color:#333;}#mermaid-svg-ddRflGNTcTBHynUR div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ddRflGNTcTBHynUR :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 性能优化 索引优化 查询优化 缓存策略 创建合适索引 优化查询语句 实现缓存层
6.2 错误处理
class GraphitiError(Exception): \"\"\"Graphiti基础异常类\"\"\" passclass ConnectionError(GraphitiError): \"\"\"连接错误\"\"\" passclass QueryError(GraphitiError): \"\"\"查询错误\"\"\" pass# 错误处理示例async def safe_operation(): \"\"\"安全操作示例\"\"\" try: result = await graphiti.operation() return result except ConnectionError as e: logger.error(f\"连接错误: {str(e)}\") # 重试逻辑 except QueryError as e: logger.error(f\"查询错误: {str(e)}\") # 错误恢复逻辑 except Exception as e: logger.error(f\"未知错误: {str(e)}\") raise
7. 常见问题解答
7.1 部署相关
-
Q: 如何选择合适的Neo4j版本?
- A: 建议使用Neo4j 5.26或更高版本,可以通过Neo4j Desktop快速安装。
-
Q: 如何配置LLM服务?
- A: 支持OpenAI、Anthropic、Google Gemini等多种LLM服务,需要配置相应的API密钥。
7.2 使用相关
-
Q: 如何处理大规模数据?
- A: 利用Graphiti的增量更新特性,结合Neo4j的并行处理能力。
-
Q: 如何优化查询性能?
- A: 合理设计索引,优化查询语句,使用缓存机制。
8. 总结与展望
8.1 关键特性总结
- 实时增量更新
- 双时序数据模型
- 混合检索能力
- 自定义实体支持
- 高性能查询
8.2 未来展望
#mermaid-svg-jZFFHI13v5gKxMUi {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-jZFFHI13v5gKxMUi .error-icon{fill:#552222;}#mermaid-svg-jZFFHI13v5gKxMUi .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-jZFFHI13v5gKxMUi .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-jZFFHI13v5gKxMUi .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-jZFFHI13v5gKxMUi .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-jZFFHI13v5gKxMUi .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-jZFFHI13v5gKxMUi .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-jZFFHI13v5gKxMUi .marker{fill:#333333;stroke:#333333;}#mermaid-svg-jZFFHI13v5gKxMUi .marker.cross{stroke:#333333;}#mermaid-svg-jZFFHI13v5gKxMUi svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-jZFFHI13v5gKxMUi .mermaid-main-font{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-family:var(--mermaid-font-family);}#mermaid-svg-jZFFHI13v5gKxMUi .exclude-range{fill:#eeeeee;}#mermaid-svg-jZFFHI13v5gKxMUi .section{stroke:none;opacity:0.2;}#mermaid-svg-jZFFHI13v5gKxMUi .section0{fill:rgba(102, 102, 255, 0.49);}#mermaid-svg-jZFFHI13v5gKxMUi .section2{fill:#fff400;}#mermaid-svg-jZFFHI13v5gKxMUi .section1,#mermaid-svg-jZFFHI13v5gKxMUi .section3{fill:white;opacity:0.2;}#mermaid-svg-jZFFHI13v5gKxMUi .sectionTitle0{fill:#333;}#mermaid-svg-jZFFHI13v5gKxMUi .sectionTitle1{fill:#333;}#mermaid-svg-jZFFHI13v5gKxMUi .sectionTitle2{fill:#333;}#mermaid-svg-jZFFHI13v5gKxMUi .sectionTitle3{fill:#333;}#mermaid-svg-jZFFHI13v5gKxMUi .sectionTitle{text-anchor:start;font-family:\'trebuchet ms\',verdana,arial,sans-serif;font-family:var(--mermaid-font-family);}#mermaid-svg-jZFFHI13v5gKxMUi .grid .tick{stroke:lightgrey;opacity:0.8;shape-rendering:crispEdges;}#mermaid-svg-jZFFHI13v5gKxMUi .grid .tick text{font-family:\"trebuchet ms\",verdana,arial,sans-serif;fill:#333;}#mermaid-svg-jZFFHI13v5gKxMUi .grid path{stroke-width:0;}#mermaid-svg-jZFFHI13v5gKxMUi .today{fill:none;stroke:red;stroke-width:2px;}#mermaid-svg-jZFFHI13v5gKxMUi .task{stroke-width:2;}#mermaid-svg-jZFFHI13v5gKxMUi .taskText{text-anchor:middle;font-family:\'trebuchet ms\',verdana,arial,sans-serif;font-family:var(--mermaid-font-family);}#mermaid-svg-jZFFHI13v5gKxMUi .taskTextOutsideRight{fill:black;text-anchor:start;font-family:\'trebuchet ms\',verdana,arial,sans-serif;font-family:var(--mermaid-font-family);}#mermaid-svg-jZFFHI13v5gKxMUi .taskTextOutsideLeft{fill:black;text-anchor:end;}#mermaid-svg-jZFFHI13v5gKxMUi .task.clickable{cursor:pointer;}#mermaid-svg-jZFFHI13v5gKxMUi .taskText.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-jZFFHI13v5gKxMUi .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-jZFFHI13v5gKxMUi .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-jZFFHI13v5gKxMUi .taskText0,#mermaid-svg-jZFFHI13v5gKxMUi .taskText1,#mermaid-svg-jZFFHI13v5gKxMUi .taskText2,#mermaid-svg-jZFFHI13v5gKxMUi .taskText3{fill:white;}#mermaid-svg-jZFFHI13v5gKxMUi .task0,#mermaid-svg-jZFFHI13v5gKxMUi .task1,#mermaid-svg-jZFFHI13v5gKxMUi .task2,#mermaid-svg-jZFFHI13v5gKxMUi .task3{fill:#8a90dd;stroke:#534fbc;}#mermaid-svg-jZFFHI13v5gKxMUi .taskTextOutside0,#mermaid-svg-jZFFHI13v5gKxMUi .taskTextOutside2{fill:black;}#mermaid-svg-jZFFHI13v5gKxMUi .taskTextOutside1,#mermaid-svg-jZFFHI13v5gKxMUi .taskTextOutside3{fill:black;}#mermaid-svg-jZFFHI13v5gKxMUi .active0,#mermaid-svg-jZFFHI13v5gKxMUi .active1,#mermaid-svg-jZFFHI13v5gKxMUi .active2,#mermaid-svg-jZFFHI13v5gKxMUi .active3{fill:#bfc7ff;stroke:#534fbc;}#mermaid-svg-jZFFHI13v5gKxMUi .activeText0,#mermaid-svg-jZFFHI13v5gKxMUi .activeText1,#mermaid-svg-jZFFHI13v5gKxMUi .activeText2,#mermaid-svg-jZFFHI13v5gKxMUi .activeText3{fill:black!important;}#mermaid-svg-jZFFHI13v5gKxMUi .done0,#mermaid-svg-jZFFHI13v5gKxMUi .done1,#mermaid-svg-jZFFHI13v5gKxMUi .done2,#mermaid-svg-jZFFHI13v5gKxMUi .done3{stroke:grey;fill:lightgrey;stroke-width:2;}#mermaid-svg-jZFFHI13v5gKxMUi .doneText0,#mermaid-svg-jZFFHI13v5gKxMUi .doneText1,#mermaid-svg-jZFFHI13v5gKxMUi .doneText2,#mermaid-svg-jZFFHI13v5gKxMUi .doneText3{fill:black!important;}#mermaid-svg-jZFFHI13v5gKxMUi .crit0,#mermaid-svg-jZFFHI13v5gKxMUi .crit1,#mermaid-svg-jZFFHI13v5gKxMUi .crit2,#mermaid-svg-jZFFHI13v5gKxMUi .crit3{stroke:#ff8888;fill:red;stroke-width:2;}#mermaid-svg-jZFFHI13v5gKxMUi .activeCrit0,#mermaid-svg-jZFFHI13v5gKxMUi .activeCrit1,#mermaid-svg-jZFFHI13v5gKxMUi .activeCrit2,#mermaid-svg-jZFFHI13v5gKxMUi .activeCrit3{stroke:#ff8888;fill:#bfc7ff;stroke-width:2;}#mermaid-svg-jZFFHI13v5gKxMUi .doneCrit0,#mermaid-svg-jZFFHI13v5gKxMUi .doneCrit1,#mermaid-svg-jZFFHI13v5gKxMUi .doneCrit2,#mermaid-svg-jZFFHI13v5gKxMUi .doneCrit3{stroke:#ff8888;fill:lightgrey;stroke-width:2;cursor:pointer;shape-rendering:crispEdges;}#mermaid-svg-jZFFHI13v5gKxMUi .milestone{transform:rotate(45deg) scale(0.8,0.8);}#mermaid-svg-jZFFHI13v5gKxMUi .milestoneText{font-style:italic;}#mermaid-svg-jZFFHI13v5gKxMUi .doneCritText0,#mermaid-svg-jZFFHI13v5gKxMUi .doneCritText1,#mermaid-svg-jZFFHI13v5gKxMUi .doneCritText2,#mermaid-svg-jZFFHI13v5gKxMUi .doneCritText3{fill:black!important;}#mermaid-svg-jZFFHI13v5gKxMUi .activeCritText0,#mermaid-svg-jZFFHI13v5gKxMUi .activeCritText1,#mermaid-svg-jZFFHI13v5gKxMUi .activeCritText2,#mermaid-svg-jZFFHI13v5gKxMUi .activeCritText3{fill:black!important;}#mermaid-svg-jZFFHI13v5gKxMUi .titleText{text-anchor:middle;font-size:18px;fill:#333;font-family:\'trebuchet ms\',verdana,arial,sans-serif;font-family:var(--mermaid-font-family);}#mermaid-svg-jZFFHI13v5gKxMUi :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 2024-01-07 2024-01-14 2024-01-21 2024-01-28 2024-02-04 2024-02-11 2024-02-18 2024-02-25 2024-03-03 2024-03-10 2024-03-17 2024-03-24 2024-03-31 自定义图谱模式 检索能力增强 MCP服务器支持 测试覆盖率提升 核心功能 扩展功能 Graphiti发展路线图
参考资料
- Graphiti官方文档
- Neo4j文档
- OpenAI API文档
- 知识图谱最佳实践