系统架构
系统架构
相关源文件
本章引用的主要源码文件:
README.mdexamples/quickstart/README.mdgraphiti_core/driver/driver.pygraphiti_core/driver/falkordb_driver.pygraphiti_core/driver/neo4j_driver.pygraphiti_core/graphiti.pygraphiti_core/helpers.py
本文档涵盖了 graphiti-core 的高层架构:核心的 Graphiti 编排器类、GraphitiClients 服务容器、可插拔的 AI 提供者和数据库驱动系统,以及从剧集入库到图谱存储和检索的完整数据流。
有关各个子系统的详细 API 文档,请参见:Graphiti Core 客户端、数据模型与模式、搜索与检索系统、多提供者插件架构、数据库抽象层。关于逐步骤的剧集处理管线,请参见数据处理管线。
架构总览
Graphiti 采用三层架构,用户面向的操作通过 Graphiti 编排器类(graphiti_core/graphiti.py:137-151)流转,该类协调知识提取管线、搜索操作和社区检测。所有 AI 服务调用和数据库操作都通过可插拔的提供者接口路由,使得图谱后端、大语言模型(LLM)提供者和嵌入向量服务可以独立替换。
三层架构
来源:graphiti_core/graphiti.py:137-246、graphiti_core/graphiti_types.py:42-42、graphiti_core/utils/maintenance/node_operations.py:101-105、graphiti_core/utils/maintenance/edge_operations.py:91-96、graphiti_core/utils/maintenance/community_operations.py:86-90
Graphiti 编排器
Graphiti(graphiti_core/graphiti.py:137)是顶层类。构造时接受直接连接凭证(用于默认的 Neo4jDriver),或通过 graph_driver 参数传入预配置的 GraphDriver 实例(graphiti_core/graphiti.py:147)。如果未提供服务客户端,所有服务客户端默认使用 OpenAI 支持的实现(graphiti_core/graphiti.py:166-174)。
构造参数
| 参数 | 类型 | 默认值 | 用途 |
|---|---|---|---|
uri | str | None | — | 图数据库 URI(当 graph_driver 为 None 时使用) |
user | str | None | — | 数据库用户名 |
password | str | None | — | 数据库密码 |
llm_client | LLMClient | None | OpenAIClient() | 用于实体/边提取和去重的大语言模型(LLM) |
embedder | EmbedderClient | None | OpenAIEmbedder() | 向量嵌入服务 |
cross_encoder | CrossEncoderClient | None | OpenAIRerankerClient() | 用于搜索结果评分的重排序器 |
store_raw_episode_content | bool | True | 是否在图谱中持久化原始剧集文本 |
graph_driver | GraphDriver | None | Neo4jDriver(...) | 直接注入预配置的驱动 |
max_coroutines | int | None | 环境变量 SEMAPHORE_LIMIT | 异步操作的并发上限 |
tracer | Tracer | None | 无操作 | OpenTelemetry 追踪器实例 |
trace_span_prefix | str | 'graphiti' | 应用于所有追踪跨度名称的前缀 |
来源:graphiti_core/graphiti.py:138-186、graphiti_core/helpers.py:38-38
关键公共方法
| 方法 | 返回类型 | 描述 |
|---|---|---|
add_episode(...) | AddEpisodeResults | 入库一个剧集;提取、解析并持久化实体和关系 |
add_episode_bulk(...) | AddBulkEpisodeResults | 批量入库 RawEpisode 对象列表,共享去重逻辑 |
search(...) | SearchResults | 混合搜索,返回边、节点、剧集和社区 |
retrieve_episodes(...) | list[EpisodicNode] | 获取相对于参考时间的最近 n 个剧集 |
build_indices_and_constraints() | None | 创建数据库索引和约束(在设置期间运行一次) |
close() | None | 优雅关闭底层图数据库驱动连接 |
来源:graphiti_core/graphiti.py:114-130、graphiti_core/graphiti.py:311-342、graphiti_core/graphiti.py:393-426、graphiti_core/graphiti.py:735-786、graphiti_core/graphiti.py:788-806
GraphitiClients 容器
GraphitiClients(graphiti_core/graphiti_types.py:42)是一个数据类,将服务客户端打包成一个对象,传递给所有内部管线函数。这消除了调用栈中冗余的参数传递。
# 在 Graphiti.__init__ 中创建
self.clients = GraphitiClients(
driver=self.driver, # GraphDriver 实例
llm_client=self.llm_client, # LLMClient 实例
embedder=self.embedder, # EmbedderClient 实例
cross_encoder=self.cross_encoder, # CrossEncoderClient 实例
tracer=self.tracer, # Tracer 实例
)
使用 GraphitiClients 的函数:
extract_nodes(clients, ...)-graphiti_core/utils/maintenance/node_operations.py:103resolve_extracted_nodes(clients, ...)-graphiti_core/utils/maintenance/node_operations.py:104extract_edges(clients, ...)-graphiti_core/utils/maintenance/edge_operations.py:93resolve_extracted_edges(clients, ...)-graphiti_core/utils/maintenance/edge_operations.py:95search(clients, ...)-graphiti_core/search/search.py:62
来源:graphiti_core/graphiti.py:232-238、graphiti_core/graphiti_types.py:42-42
可插拔提供者系统
所有服务接口都定义为抽象基类。具体实现会在 Graphiti 构造时注入,使得提供者可以独立替换。
提供者接口映射
| 角色 | 抽象基类 | 默认实现 | 文件路径 |
|---|---|---|---|
| 大语言模型(LLM)推理 | LLMClient | OpenAIClient | graphiti_core/llm_client/openai_client.py |
| 向量嵌入 | EmbedderClient | OpenAIEmbedder | graphiti_core/embedder/openai.py |
| 搜索重排序 | CrossEncoderClient | OpenAIRerankerClient | graphiti_core/cross_encoder/openai_reranker_client.py |
| 图数据库 | GraphDriver | Neo4jDriver | graphiti_core/driver/neo4j_driver.py:60 |
来源:graphiti_core/graphiti.py:203-238、graphiti_core/driver/driver.py:59-64、graphiti_core/driver/driver.py:90-96
数据库抽象层
图数据库层采用三层架构。
GraphDriver 架构
操作接口
每个具体驱动在 __init__ 中实例化操作类,并通过 @property 访问器暴露它们。例如,Neo4jDriver 实例化 Neo4jEntityNodeOperations 和其他类(graphiti_core/driver/neo4j_driver.py:79-89),并通过 entity_node_ops 等属性暴露它们(graphiti_core/driver/neo4j_driver.py:108-110)。
| 类别 | 抽象基类 |
|---|---|
| 节点操作 | EntityNodeOperations、EpisodeNodeOperations、CommunityNodeOperations、SagaNodeOperations |
| 边操作 | EntityEdgeOperations、EpisodicEdgeOperations、CommunityEdgeOperations、HasEpisodeEdgeOperations、NextEpisodeEdgeOperations |
| 搜索与维护 | SearchOperations、GraphMaintenanceOperations |
来源:graphiti_core/driver/driver.py:59-212、graphiti_core/driver/neo4j_driver.py:60-150、graphiti_core/driver/falkordb_driver.py:110-160
剧集入库数据流
add_episode 方法(graphiti_core/graphiti.py:788)编排了一个多阶段管线。
剧集处理管线及函数调用
来源:graphiti_core/graphiti.py:788-1000、graphiti_core/utils/maintenance/node_operations.py:101-105、graphiti_core/utils/maintenance/edge_operations.py:91-96、graphiti_core/utils/bulk_utils.py:76-84
搜索架构
Graphiti.search_() 方法委托给 graphiti_core/search/search.py 中的 search(),该方法并发执行搜索策略并融合结果。
混合搜索管线
来源:graphiti_core/search/search.py:62-62、graphiti_core/search/search_config.py:63-63、graphiti_core/search/search_filters.py:69-69
并发模型
所有并发操作由 semaphore_gather(graphiti_core/helpers.py:123-133)协调。该函数将 asyncio.gather 与 asyncio.Semaphore 结合使用,信号量上限由 SEMAPHORE_LIMIT(graphiti_core/helpers.py:38)或构造参数 max_coroutines(graphiti_core/graphiti.py:180-182)决定。
来源:graphiti_core/helpers.py:123-133、graphiti_core/helpers.py:38-38、graphiti_core/graphiti.py:180-182