玩转AI工作流:一步步搭建灵活的自动化流程
我们之前搭建了许多不同类型的智能体,其中最受欢迎的就是在智能体中搭建各种工作流——这也是我最喜欢探索和玩的领域。那么,究竟什么是工作流?如何在后端实现一个工作流呢?今天我们就先简单了解下。
什么是工作流?
工作流是一种事件驱动、基于步骤的方法,用于控制和管理应用程序的执行流程。在这种方法中,应用程序被拆分为多个互相独立但又相互关联的部分,每个部分都被称为“步骤”。这些步骤通常由特定的事件触发,而每个步骤在执行时也可能会触发其他事件,从而激活更多后续的步骤。
通过精心设计和组合这些步骤与事件,你可以创建出复杂的流程,进而封装业务逻辑。
简单入门
首先,在开始之前,你需要确保你的电脑上已经安装了Python环境。我这里使用的是Python 3.10版本,但你可以根据自己的需要选择任何其他版本,前提是它符合项目的需求。接下来,我们将从创建一个新的Python项目开始,带你一步步入门。为了确保项目的依赖不与你电脑中其他Python项目的环境冲突,我们将使用虚拟环境。
今天的教程将聚焦于Python项目的基础入门部分,我们会一步步进行讲解。在后续的章节中,我们会深入探讨更复杂的技术和方法,话不多说,我们正式开始吧!
项目创建
虚拟环境搭建
- 在你的项目目录中打开终端(命令提示符),然后使用以下命令创建虚拟环境: python -m venv venv
- 在 Windows 上,使用以下命令激活虚拟环境: .\venv\Scripts\activate
- 保存依赖库列表: pip freeze > requirements.txt
- 退出虚拟环境: deactivate

VSCode配置
我使用的IDE是VSCode,当然你也可以根据个人喜好选择其他开发工具。虽然我们已经启动了Python虚拟环境,但需要注意的是,默认情况下,当你点击运行时,代码依旧是通过原始的Python路径来执行,而非虚拟环境中的Python解释器。因此,我们需要进行一些简单的配置来确保代码在正确的环境下运行。
- 按下
Ctrl + Shift + P(Windows/Linux) 或Cmd + Shift + P(Mac) 打开命令面板。 - 输入并选择
Python: Select Interpreter。 - 在弹出的列表中,选择你虚拟环境中的 Python 解释器。

在弹出的窗口中,选择我们的项目路径中的venv目录即可。然后每次再点击运行就OK了。

Hello World
首先,为了确保后续操作顺利进行,需要提前安装以下两个依赖包。请使用以下命令进行安装:
pip install llama-index-core
pip install llama-index-utils-workflow
然后,直接粘贴以下代码,我们就可以顺利运行这个简单的程序。这个工作流的主要功能是打印“Hello, World!”消息,是一个非常基础的工作流示例:
from llama_index.core.workflow import (
StartEvent,
StopEvent,
Workflow,
step,
)
class MyWorkflow(Workflow):
@step
async def my_step(self, ev: StartEvent) -> StopEvent:
# do something here
return StopEvent(result="Hello, world!")
async def main():
w = MyWorkflow(timeout=10, verbose=False)
result = await w.run()
print(result)
if __name__ == "__main__":
import asyncio
asyncio.run(main())
在这段代码中,整体逻辑其实相当简单易懂。主要通过定义带有 step 注解的方法,并通过执行这些方法来实现工作流的流程控制。不过,代码中有两个关键的节点事件需要特别注意,它们分别是 StartEvent 和 StopEvent。工作流的执行通常从 StartEvent 开始,并且必须以 StopEvent 结束,确保工作流的完整性和正确性。
需要特别注意的是,如果工作流在执行过程中存在其他事件或步骤没有被正确触发或执行,系统会抛出错误。下面看下。
多个事件
我们依然可以进行简单的测试,毕竟这是流数据处理的基本操作。在此,我们定义了两个自定义事件,如下所示:
from llama_index.core.workflow import (
StartEvent,
StopEvent,
Workflow,
step,
Event,
)
class FirstEvent(Event):
first_output: str
class SecondEvent(Event):
second_output: str
然后我们在工作流中引用下:
class MyWorkflow(Workflow):
@step
async def step_one(self, ev: StartEvent) -> FirstEvent:
print(ev.first_input)
return FirstEvent(first_output="First step complete.")
@step
async def step_two(self, ev: FirstEvent) -> SecondEvent:
print(ev.first_output)
return SecondEvent(second_output="Second step complete.")
@step
async def step_three(self, ev: SecondEvent) -> StopEvent:
print(ev.second_output)
return StopEvent(result="Workflow complete.")
async def main():
w = MyWorkflow(timeout=10, verbose=False)
result = await w.run(first_input="Start the workflow.")
print(result)
这样,我们就可以逐步执行各个事件。如果在执行过程中某一个步骤未能顺利完成,例如我们直接修改了第二个事件并且导致返回结束,那么第三个步骤将无法执行,这样就会引发错误。
@step
async def step_two(self, ev: FirstEvent) -> StopEvent:
print(ev.first_output)
return StopEvent(result="Second step complete.")
@step
async def step_three(self, ev: SecondEvent) -> StopEvent:
print(ev.second_output)
return StopEvent(result="Workflow complete.")
在构建智能体工作流的过程中,如果没有进行连线操作,系统通常会自动检测并提示错误。这种情况下,错误提示会提醒用户必须完成连线,以确保工作流的正常运行和功能的完整性。报错信息如下:

可视化分析
工作流可视化功能在这里显得相对简单,它主要用于查看整个调用链路的结构和流程,而不像其他平台那样具备强大的交互操作性。我们一起看下:
from llama_index.utils.workflow import draw_all_possible_flows
#省略重复代码
if __name__ == "__main__":
import asyncio
asyncio.run(main())
draw_all_possible_flows(MyWorkflow, filename="multi_step_workflow.html")
执行完成后,将会生成一个可正常打开的HTML文件。下面请看下图所示的内容:

整个工作流程非常清晰明了。在每一次执行当前事件时,首先会打印出所调用的方法名称,接着会显示正在处理的事件名称,最后以“done”字样结束该过程。
总结
通过今天的简单介绍,我们初步了解了工作流的基本概念及实现方法。工作流作为一种事件驱动的执行机制,为我们提供了更灵活的方式来管理和控制应用程序的流程。我们通过创建和配置虚拟环境,逐步实现了基础的工作流示例,体验了如何使用Python构建多步骤的业务逻辑。
在后续的学习中,我们还将探索更复杂的工作流构建方法。希望通过这一系列的实践,能够激发大家在智能体领域的创新思维,共同探讨更高效的解决方案。
我是努力的小雨,一名 Java 服务端码农,潜心研究着 AI 技术的奥秘。我热爱技术交流与分享,对开源社区充满热情。同时也是一位腾讯云创作之星、阿里云专家博主、华为云云享专家、掘金优秀作者。
我将不吝分享我在技术道路上的个人探索与经验,希望能为你的学习与成长带来一些启发与帮助。
欢迎关注努力的小雨!
玩转AI工作流:一步步搭建灵活的自动化流程的更多相关文章
- flow.ci + Github + Slack 一步步搭建 Python 自动化持续集成
理想的程序员必须懒惰,永远追随自动化法则.Automating shapes smarter future. 在一个 Python 项目的开发过程中可能会做的事情:编译.手动或自动化测试.部署环境配置 ...
- 手把手教你如何玩转Activiti工作流
手把手教你如何玩转Activiti工作流 置顶 2018年01月30日 19:51:36 Cs_hnu_scw 阅读数:24023 版权声明:本文为博主原创文章,未经博主允许不得转载. https ...
- 一步步搭建物联网系统——无处不在的CSS
无处不在的CSS 或许你觉得CSS一点儿也不重要,而事实上,如果说HTML是建筑的框架,CSS就是房子的装修.那么Javascript呢,我听到的最有趣的说法是小三--还是先让我们回到代码上来吧. C ...
- 一步步搭建自己的博客 .NET版(2、评论功能)
前言 这次开发的博客主要功能或特点: 第一:可以兼容各终端,特别是手机端. 第二:到时会用到大量html5,炫啊. 第三:导入博客园的精华文章,并做分类.(不要封我) 第四:做 ...
- 一步步搭建react-native环境(苹果OS X)
因重新升级了系统,一步步搭建react-native环境. 1.安装Homebrew 打开终端命令->ruby -e "$(curl -fsSL https://raw.githubu ...
- 一步步搭建docker私有仓库并从私有仓库中下载镜像
一步步搭建docker私有仓库 #下载镜像 docker pull registry#查看镜像 docker images #运行私有仓库,指定端口和数据卷 docker run -d -p : -v ...
- 快快使用ModelArts,零基础小白也能玩转AI!
摘要: 走过路过不要错过,看Copy攻城狮如何借力华为云ModelArts玩转AI. "自2018年10月发布以来,ModelArts累计服务了众多行业十几万开发者,通过基础平台的完备性和面 ...
- 新入手服务器不会玩?抢占式实例服务器教程,从零搭建tomcat超简流程
新入手服务器不会玩?抢占式实例服务器教程,从零搭建tomcat超简流程 相信很多新人入手Linux服务器后,一脸无奈,这黑框框究竟能干啥?忽觉巨亏血亏不是? 这里面门道可不是你想象中的那么点,简则服务 ...
- HMS Core Discovery第16期回顾|与虎墩一起,玩转AI新“声”态
HMS Core 在AI领域最新的技术能力有哪些?本期Discovery直播以<与虎墩一起,玩转AI新"声"态>为主题,邀请了HMS Core 机器学习服务产品经理.机 ...
- 3 分钟轻松搭建 Ruby 项目自动化持续集成
任何事情超过 90 秒就应该自动化,这是程序员的终极打开方式.Automating shapes smarter future. 这是一篇关于 Ruby 项目持续集成的快速指导教程,教大家如何使用 f ...
随机推荐
- 最常用集合 - arraylist详解
ArrayList介绍 ArrayList实现了List接口,是顺序容器,即元素存放的数据与放进去的顺序相同,允许放入null元素,底层通过数组实现.除该类未实现同步外,其余跟Vector大致相同.每 ...
- .Net 5.0 WebAPI 发布至 CentOS 7 系统
〇.前言 本文主要介绍了在 CentOS 7 上部署 WebAPI 项目的过程. 先安装 .net 5.0 的环境,再创建一个示例项目并发布至 CentOS 上,同时列明了一些注意的点:最后将 dot ...
- LoRA大模型微调的利器
LoRA模型是小型的Stable Diffusion模型,它们对checkpoint模型进行微小的调整.它们的体积通常是检查点模型的10到100分之一.因为体积小,效果好,所以lora模型的使用程度比 ...
- LeetCode题集-2 - 两数相加
这个题目是什么意思呢?简单来说就是把两个链表平铺开,头节点对齐,然后从头开始相同的节点相加,满10则进位,进位值与下个节点继续相加,当一个链表没有节点时候则可以把没有节点当做0继续与有节点的链表继续相 ...
- 使用 Microsoft.Extensions.ServiceDiscovery 进行服务发现并调用
简介 在现代微服务架构中,服务发现(Service Discovery)是一项关键功能.它允许微服务动态地找到彼此,而无需依赖硬编码的地址.以前如果你搜 .NET Service Discovery, ...
- keras各种问题
还是不熟悉造成的,keras的各种包使用起来真是有点小麻烦.导入方式不同就容易引起错误,也不提示你导入的库不存在,但是就是调用的时候报错. 比如近期写文章想画模型图,plot_model模块导入出问题 ...
- sql查询死锁
--每秒死锁数量 SELECT * FROM sys.dm_os_performance_counters WHERE counter_name LIKE 'Number of Deadlocksc% ...
- Open Graph protocol
大纲介绍 Open Graph protocol 是 facebook 2010 年推出的一套规范, 用途是通过一些简单的 meta tag 来描述网站的内容. 这样在 sharing 网址的时候就可 ...
- 2019牛客暑期多校训练营(第四场)J-free(分层图最短路)
>传送门< 题意:给你n个城市,m条道路,经过每一条要花费这条路的代价,现给你k个机会,使得最多k条路的代价为0,问从起点s到终点t花费的最少代价 思路:分层图最短路经典裸题 方法一 Co ...
- 没时间做获取天气的实验 三分钟! 给您看清如何通过HTTP GET请求 获取天气预报
1. 注册心知天气账号,获取私钥 下面这篇文章是图示讲解的,好东西,何不转载为快? http://www.taichi-maker.com/homepage/iot-development/iot-p ...