微信扫码
与创始人交个朋友
我要投稿
工作流(Workflow)是事件驱动、基于步骤的应用执行流程控制方式。它由多个步骤(steps)组成,每个步骤负责处理特定类型的事件并发出新的事件。这种设计使得工作流能够灵活地处理各种应用场景,从简单的单一步骤流程到复杂的、包含多个分支和循环的多步骤流程。
在LlamaIndex中,工作流通过子类化Workflow
类并定义具体的步骤来实现。每个步骤使用@step
装饰器装饰,该装饰器用于推断每个步骤的输入和输出类型,从而确保工作流的有效性和正确性。
简单的工作流如下:
# single_step_workflow.py
from llama_index.core.workflow import (
StartEvent,
StopEvent,
Workflow,
step,
)
from llama_index.llms.openai import OpenAI
# Define the workflow class for generating a haiku
class SingleStepWorkflow(Workflow):
llm = OpenAI()
async def generate_haiku(self, ev: StartEvent) -> StopEvent:
try:
theme = self.context.get("theme", "nature") # Default to "nature"
prompt = f"Write a traditional haiku about {theme}."
haiku = await self.llm.acomplete(prompt)
return StopEvent(result=str(haiku))
except Exception as e:
return StopEvent(result=f"Error occurred: {str(e)}")
async def main():
# Run the workflow
w = SingleStepWorkflow(timeout=60, verbose=False)
result = await w.run(context={"theme": "nature"})
print(f"Result: {str(result)}")
if __name__ == "__main__":
import asyncio
asyncio.run(main())
事件(Event)是工作流中的关键概念,它充当步骤之间的数据载体。在LlamaIndex中,事件是用户定义的Pydantic对象,可以自定义属性和方法。每个步骤可以接收一种或多种事件作为输入,并输出一种或多种新的事件。
StartEvent
和StopEvent
是LlamaIndex工作流中预定义的两个特殊事件。StartEvent
作为工作流的入口点,表示初始工作流输入的位置;而StopEvent
则标志着工作流的结束,并可以携带工作流的最终结果。
步骤(Step)是工作流中的单个任务,每个步骤定义了一个异步函数,用于处理特定的事件并发出新的事件。步骤之间的连接通过事件来实现,当某个步骤输出一个事件时,订阅了该事件的步骤就会被触发执行。
# sequential_step_workflow.pyfrom llama_index.core.workflow import ( StartEvent, StopEvent, Workflow, step, Event,)from llama_index.llms.openai import OpenAI# Define custom event classesclass HaikuEvent(Event): # Subclass Event def __init__(self, haiku: str): self.haiku = haiku# Define the workflow classclass SequentialStepWorkFlow(Workflow): llm = OpenAI() @step async def generate_haiku(self, ev: StartEvent) -> HaikuEvent: theme = self.context.get("theme", "nature") prompt = f"Write a traditional haiku about {theme}." haiku = await self.llm.acomplete(prompt) return HaikuEvent(haiku=str(haiku)) @step async def generate_limerick(self, ev: HaikuEvent) -> StopEvent: haiku = ev.haiku prompt = f"Write a limerick inspired by this haiku: {haiku}" limerick = await self.llm.acomplete(prompt) return StopEvent(result=str(limerick))async def main(): # Run the workflow w = SequentialStepWorkFlow(timeout=60, verbose=False) result = await w.run(context={"theme": "nature"}) print(f"Result:\n{str(result)}")
# concurrent_step_workflow.pyfrom llama_index.core.workflow import ( StartEvent, StopEvent, Workflow, step, Event,)from llama_index.llms.openai import OpenAI# Define custom event classesclass HaikuEvent(Event): def __init__(self, haiku: str): self.haiku = haikuclass LimerickEvent(Event): def __init__(self, limerick: str): self.limerick = limerickclass ConcurrentStepWorkflow(Workflow): llm = OpenAI() @step async def generate_haiku(self, ev: StartEvent) -> HaikuEvent: theme = self.context.get("theme", "nature") prompt = f"Write a traditional haiku about {theme}." haiku = await self.llm.acomplete(prompt) return HaikuEvent(haiku=str(haiku)) @step async def generate_limerick(self, ev: StartEvent) -> LimerickEvent: theme = self.context.get("theme", "nature") prompt = f"Write a limerick about {theme}." limerick = await self.llm.acomplete(prompt) return LimerickEvent(limerick=str(limerick)) @step async def combine_results(self, ev: HaikuEvent | LimerickEvent) -> StopEvent: # Store data in the workflow context for merging if isinstance(ev, HaikuEvent): self.haiku = ev.haiku elif isinstance(ev, LimerickEvent): self.limerick = ev.limerick # Check if both results are available if hasattr(self, 'haiku') and hasattr(self, 'limerick'): combined_result = f"Haiku:\n{self.haiku}\n\nLimerick:\n{self.limerick}" return StopEvent(result=combined_result) # Wait for both steps to complete return Noneasync def main(): # Run the workflow w = ConcurrentStepWorkflow(timeout=60, verbose=False) result = await w.run(context={"theme": "nature"}) print(f"Result:\n{str(result)}")if __name__ == "__main__": import asyncio # Run the main workflow asyncio.run(main())
LlamaIndex工作流具有多种优势,使其成为构建复杂查询管道和数据管道的理想选择。
每个步骤在LlamaIndex工作流中都是独立的、可重用的和可独立测试的。这种模块化设计使得开发者可以轻松地构建和组装复杂的工作流,而无需担心组件之间的依赖关系。同时,模块化的设计也便于维护和更新工作流,因为可以单独修改和测试每个步骤。
LlamaIndex工作流提供了高度的定制化能力。开发者可以根据特定的需求定制工作流的步骤和事件,以满足不同场景下的要求。例如,在构建RAG(检索增强生成)工作流时,可以根据具体的业务逻辑和算法需求定制步骤和事件的处理方式。
LlamaIndex工作流具有良好的可扩展性。随着需求的增长和变化,开发者可以轻松地添加新的步骤和事件,以扩展工作流的功能。此外,由于工作流中的步骤是独立的,因此可以方便地将新的算法或组件集成到工作流中,而无需对整个工作流进行重构。
LlamaIndex工作流提供了可视化和调试功能,使得开发者可以直观地了解工作流的执行流程和状态。通过生成工作流的流程图,开发者可以清晰地看到各个步骤之间的连接关系和依赖关系。同时,LlamaIndex工作流还支持逐步执行和手动触发事件等功能,便于开发者进行调试和测试。
LlamaIndex 工作流为处理复杂数据任务提供了一种高效、灵活且易于管理的方式。通过其模块化、可定制和可扩展的特性,以及顺序和并发执行模式的支持,能够适应多种业务场景的需求。无论是在内容创作、数据处理还是智能交互等领域,LlamaIndex 工作流都展现出了强大的能力,帮助开发者和企业更好地利用大型语言模型,提升工作效率和创新能力,在不断变化的数字化环境中取得竞争优势。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-01-11
LlamaIndex :企业级知识助理,万物可知
2024-12-26
深入了解 LlamaIndex 工作流程:事件驱动的 LLM 架构
2024-12-17
llamaindex实战-ChatEngine-Context(上下文)模式
2024-12-01
LlamaIndex,让AI唤醒你的数据
2024-11-29
llamaindex实战-Agent-自定义工具函数
2024-11-22
llamaindex实战-Agent-让Agent调用多个工具函数(本地部署)
2024-11-19
llamaindex实战-Workflow:工作流入门(本地部署断网运行)
2024-11-15
llamaindex实战-Agent-在Agent中使用RAG查询(本地部署)
2024-07-09
2024-04-20
2024-06-05
2024-04-25
2024-04-28
2024-05-09
2024-07-20
2024-06-19
2024-04-26
2024-06-22