Skip to content

工作流子类化#

工作流的另一个强大特性是其可扩展性。您可以将他人编写的工作流或LlamaIndex内置的工作流进行扩展,以满足您的特定需求。我们将探讨两种实现方式。

第一种是子类化:工作流本质上是普通的Python类,这意味着您可以通过创建子类来添加新功能。例如,假设您有一个代理工作流,它执行某些处理后发送电子邮件。您可以通过子类化该工作流,额外添加发送短信的步骤。

以下是我们的基础工作流:

from llama_index.core.workflow import (
    StartEvent,
    StopEvent,
    Workflow,
    step,
    Event,
    Context,
)


class Step2Event(Event):
    query: str


class Step3Event(Event):
    query: str


class MainWorkflow(Workflow):
    @step
    async def start(self, ev: StartEvent) -> Step2Event:
        print("Starting up")
        return Step2Event(query=ev.query)

    @step
    async def step_two(self, ev: Step2Event) -> Step3Event:
        print("Sending an email")
        return Step3Event(query=ev.query)

    @step
    async def step_three(self, ev: Step3Event) -> StopEvent:
        print("Finishing up")
        return StopEvent(result=ev.query)

运行此工作流:

w = MainWorkflow(timeout=10, verbose=False)
result = await w.run(query="Initial query")
print(result)

输出结果为:

Starting up
Sending an email
Finishing up
Initial query

现在让我们通过子类化扩展该工作流,添加短信发送功能:

class Step2BEvent(Event):
    query: str


class CustomWorkflow(MainWorkflow):
    @step
    async def step_two(self, ev: Step2Event) -> Step2BEvent:
        print("Sending an email")
        return Step2BEvent(query=ev.query)

    @step
    async def step_two_b(self, ev: Step2BEvent) -> Step3Event:
        print("Also sending a text message")
        return Step3Event(query=ev.query)

修改后的输出将变为:

Starting up
Sending an email
Also sending a text message
Finishing up
Initial query

我们可以可视化这个子类化的工作流,它将显示所有步骤,如下所示:

draw_all_possible_flows(CustomWorkflow, "custom_workflow.html")

自定义工作流

接下来,我们将探讨另一种扩展工作流的方法:资源