嵌套工作流#
扩展工作流的另一种方法是嵌套额外的工作流。可以在现有流程中创建明确的插槽,以便您可以在其中提供一个完整的额外工作流。例如,假设我们有一个使用 LLM 来反思该查询质量的查询。作者可能希望您修改反思步骤,并为您留下一个插槽来执行此操作。
这是我们的基础工作流
from llama_index.core.workflow import (
StartEvent,
StopEvent,
Workflow,
step,
Event,
Context,
)
from llama_index.utils.workflow import draw_all_possible_flows
class Step2Event(Event):
query: str
class MainWorkflow(Workflow):
@step
async def start(
self, ctx: Context, ev: StartEvent, reflection_workflow: Workflow
) -> Step2Event:
print("Need to run reflection")
res = await reflection_workflow.run(query=ev.query)
return Step2Event(query=res)
@step
async def step_two(self, ctx: Context, ev: Step2Event) -> StopEvent:
print("Query is ", ev.query)
# do something with the query here
return StopEvent(result=ev.query)
该工作流本身无法运行;它需要一个有效的反思步骤工作流。让我们创建一个
class ReflectionFlow(Workflow):
@step
async def sub_start(self, ctx: Context, ev: StartEvent) -> StopEvent:
print("Doing custom reflection")
return StopEvent(result="Improved query")
现在,我们可以通过使用 `add_workflows` 方法提供这个自定义反思嵌套流程来运行主工作流,我们将一个 `ReflectionFlow` 类的实例传递给该方法
w = MainWorkflow(timeout=10, verbose=False)
w.add_workflows(reflection_workflow=ReflectionFlow())
result = await w.run(query="Initial query")
print(result)
请注意,因为嵌套流程是一个完全不同的工作流,而不是一个步骤,所以 `draw_all_possible_flows` 只会绘制 `MainWorkflow` 的流程图。
默认工作流#
如果您正在创建一个包含多个嵌套工作流插槽的工作流,您可能希望为每个插槽提供默认工作流。您可以通过将插槽的默认值设置为工作流类的一个实例来实现这一点。这里有一个例子。
首先,让我们创建一个要使用的默认子工作流
class DefaultSubflow(Workflow):
@step()
async def sub_start(self, ctx: Context, ev: StartEvent) -> StopEvent:
print("Doing basic reflection")
return StopEvent(result="Improved query")
现在我们可以修改 `MainWorkflow` 以包含一个默认子工作流
class MainWorkflow(Workflow):
@step()
async def start(
self,
ctx: Context,
ev: StartEvent,
reflection_workflow: Workflow = DefaultSubflow(),
) -> Step2Event:
print("Need to run reflection")
res = await reflection_workflow.run(query=ev.query)
return Step2Event(query=res)
现在,如果您运行工作流时未提供自定义反思工作流,它将使用默认工作流。这对于为不想定制所有内容的用户提供良好的“开箱即用”体验非常有用。
最后,让我们看一下工作流中的可观测性和调试。