什么是workflow?
工作流是一种基于事件驱动、按步骤控制应用程序执行流程的方式。
在工作流中,您的应用程序被分为若干个“步骤”,每个步骤由特定事件触发,并且每个步骤又可能触发其他事件。
通过组合这些步骤和事件,您可以构建任意复杂的流程,这些流程封装了应用的逻辑,使得应用更加易于维护和理解。
工作流中的每个步骤可以是简单的一行代码,也可以是一个复杂的智能体。它们可以有多种输入和输出,这些输入和输出通过事件传递。
在这个可视化示例中,我们展示了一个相对复杂的工作流,它的目标是处理一个查询。工作流首先选择性地改进查询,然后尝试用三种不同的RAG(Retrieval-Augmented Generation)策略来回答查询。最后,LLM(大型语言模型)会从三种策略的结果中选择一个最佳答案并返回。
我们可以将此流程分解如下:
-
StartEvent:工作流从一个开始事件触发。
-
judge_query:此步骤评估查询的质量。如果查询质量不高,会生成一个BadQueryEvent。
-
BadQueryEvent:这个事件触发一个名为improve_query的步骤,该步骤会尝试改进查询,并生成一个JudgeEvent。
-
JudgeEvent:该事件再次触发judge_query,形成一个反馈循环,直到查询质量足够高为止。这种反馈循环被称为“反思”(Reflection),是工作流中实现智能决策的关键部分。
-
查询质量合格后:生成三个并行事件:NaiveRAGEvent、HighTopKEvent和RerankEvent,分别触发三个步骤,每个步骤运行不同的RAG策略。
-
ResponseEvent:每个RAG策略会生成一个ResponseEvent,并触发judge_response步骤,该步骤会等待所有三个响应。
-
judge_response:此步骤会评估并选出最佳响应,并通过StopEvent将最佳答案返回给用户。
LlamaIndex 如何进行可视化?
安装的内置可视化工具来实现:
pip install llama-index-utils-workflow
导入可视化工具, 并进行使用
from llama_index.utils.workflow import draw_all_possible_flows
# 可视化工作流
draw_all_possible_flows(MyWorkflow, filename="workflow.html")
完整实现
import asyncio
from llama_index.utils.workflow import draw_all_possible_flows
from llama_index.core.workflow import (
StartEvent,
StopEvent,
Workflow,
step,
)
class MyWorkflow(Workflow):
@step
async def my_step(self, ev: StartEvent) -> StopEvent:
# 在这里做些事情
return StopEvent(result="Hello, world!")
# 可视化工作流
draw_all_possible_flows(MyWorkflow, filename="workflow.html")
async def main():
w = MyWorkflow(timeout=10, verbose=False)
result = await w.run()
print(result)
if __name__ == "__main__":
asyncio.run(main())
当前目录下会生成html