用户指南:管道

本页提供有关如何创建管道的相关信息。

注意

管道异步运行,请参见下面的示例。

创建组件

组件是执行简单任务的异步工作单元,例如对文档进行分块或将结果保存到 Neo4j。此软件包包含一些默认组件,但开发者可以通过以下步骤创建自己的组件:

  1. 创建 Pydantic 的子类 neo4j_graphrag.experimental.pipeline.DataModel,以表示组件返回的数据。

  2. 创建 neo4j_graphrag.experimental.pipeline.Component 的子类。

  3. 在这个新类中创建一个运行方法,并使用刚创建的 DataModel 指定所需的输入和输出模型。

  4. 实现运行方法:它是一个 async 方法,允许在该方法中并行化任务和等待任务。

下面给出了一个示例,其中创建了一个 ComponentAdd 来将两个数字加在一起并返回结果。

from neo4j_graphrag.experimental.pipeline import Component, DataModel

class IntResultModel(DataModel):
    result: int

class ComponentAdd(Component):
    async def run(self, number1: int, number2: int = 1) -> IntResultModel:
        return IntResultModel(result = number1 + number2)

在 API 文档中了解更多关于 组件 的信息。

在管道中连接组件

创建组件的最终目的是将它们组装成一个复杂的管道以用于特定目的,例如从文本数据构建知识图谱。

以下是创建简单管道并传播从一个组件到另一个组件的结果的方法(详细解释如下):

import asyncio
from neo4j_graphrag.experimental.pipeline import Pipeline

pipe = Pipeline()
pipe.add_component(ComponentAdd(), "a")
pipe.add_component(ComponentAdd(), "b")

pipe.connect("a", "b", input_config={"number2": "a.result"})
asyncio.run(pipe.run({"a": {"number1": 10, "number2": 1}, "b": {"number1": 4}}))
# result: 10+1+4 = 15
  1. 首先,创建管道,并将两个名为“a”和“b”的组件添加到其中。

  2. 接下来,将这两个组件连接起来,以便“b”在“a”之后运行,并且组件“b”的“number2”参数是组件“a”的结果。

  3. 最后,使用 10 和 1 作为“a”的输入参数运行管道。组件“b”将接收 11(10 + 1,即“a”的结果)作为“number1”,并接收 4 作为“number2”(如 pipeline.run 参数中指定)。

下图说明了数据流:

10 ---\
        Component "a" -> 11
1 ----/                   \
                           \
                             Component "b" -> 15
4 -------------------------/

警告

循环图

管道中不允许循环。

警告

忽略的用户输入

如果在 pipeline.run 方法中和 connect 方法中的 input_config 中都提供了输入,则将忽略用户输入。例如,考虑以下管道,它改编自之前的管道。

pipe.connect("a", "b", input_config={"number2": "a.result"})
asyncio.run(pipe.run({"a": {"number1": 10, "number2": 1}, "b": {"number1": 4, "number2": 42}}))

结果仍然是**15**,因为用户输入 “number2”: 42 被忽略了。

可视化管道

可以使用 draw 方法可视化管道。

import asyncio
from neo4j_graphrag.experimental.pipeline import Pipeline

pipe = Pipeline()
# ... define components and connections

pipe.draw("pipeline.png")

以下是一个示例管道渲染。

Pipeline visualisation with hidden outputs if unused

默认情况下,未映射到任何组件的输出字段将被隐藏。可以通过将 hide_unused_outputs 设置为 False 来将它们添加到画布中。

pipe.draw("pipeline.png", hide_unused_outputs=False)

以下是一个最终结果示例。

Pipeline visualisation