https://www.lllyyb.com/archives/5EdxzB84

今天我们接着上次的来看insert逻辑。

看insert代码之前,我们要写看看state_manager​属性。

state_manager.png

state_manager 属性类似于上次说的 BaseGraphRAG 类,也是初始化的一个泛型类BaseStateManagerService​。

  • GTNode: 表示图中的节点类型,GTEdge: 表示图中的边类型,GTHash: 表示用于哈希的类型,GTChunk: 表示图中的块类型,GTId: 表示图中元素的唯一标识符类型,GTEmbedding: 表示图中向量相关的类型。

  • graph_storage: 这是一个 BaseGraphStorage 实例,用于存储图的数据,接受 GTNode、GTEdge 和 GTId 作为类型参数。

  • entity_storage: 这是一个 BaseVectorStorage 实例,用于存储实体数据,接受 GTId 和 GTEmbedding 作为类型参数。

  • chunk_storage: 这是一个 BaseIndexedKeyValueStorage 实例,用于存储块数据,接受 GTHash 和 GTChunk 作为类型参数。

  • embedding_service: 这是一个 BaseEmbeddingService 实例,用于处理向量化相关的操作。

  • node_upsert_policy: 这是一个 BaseNodeUpsertPolicy 实例,用于定义节点的插入或更新策略。

  • edge_upsert_policy: 这是一个 BaseEdgeUpsertPolicy 实例,用于定义边的插入或更新策略。

GraphRAG类实例的state_manager是fast_graphrag._services._state_manager.DefaultStateManagerService

default_state_manager.png

async_insert.png

insert_start

插入文档到GraphRAG的时候,首先是先调用state_manager的 insert_start​ 方法。调用各种存储实例的_insert_start方法。将每个实例的状态设置为“进行中”,为后续的数据插入操作做好准备。

insert_start.png

以graph_storage​为例,存在igraph_data.pklz​文件的话就读取历史数据。

_insert_start.png

extract

这里默认是用的正则来分片的

self._split_re = re.compile(f"({'|'.join(re.escape(s) for s in self.config.separators or [])})")

我们可以自己实现一些分片逻辑,或者用langchain的一些分片 https://python.langchain.com/docs/how_to/#text-splitters

只要返回的分片结果保持一致就好。

Tchunk.png

过滤

过滤chunked_documents里重复的数据,主要是根据chunk的内容hash生成的id来去重。

filter_new_chunk.png

mask_new.png

提取实体和关系

调用模型来提取需要新增的chunk里的实体和对应的关系。提示词:fast_graphrag/_prompt.py:8如下

提示词.png

upsert

这段代码比较复杂,主要功能是将节点、边和文档数据插入到图存储中,并在此过程中进行一些处理和计算。

定义了一个内部异步函数 getgraphs,用于从每个子图中提取节点和边。

_get_graphs.png

提取到的节点和边被传递给 node_upsert_policy 和 edge_upsert_policy 方法进行上插入操作。

使用 embedding_service 对上插入的节点进行编码,生成嵌入向量,并将其存储在 entity_storage 中。

通过调用 get_knn 方法获取相似实体的索引,并根据相似度阈值进行去重处理。

定义了一个内部异步函数 insertidentiy_edges,用于插入身份边,确保源索引和目标索引之间没有邻接关系。

_insert_identiy_edges.png

到这里我们已经完成了文档insert进入fast-graphrag的流程,下次我们看看query部分~ 也欢迎大家在评论区留言,分享你对模型应用的一些经验和看法~

Snipaste_2024-12-07_11-05-00.png