LlamaIndex 工作流

news2025/1/23 7:25:20

LlamaIndex 内部提供了一个简单的工作流引擎,为什么要有工作流引擎?做过 OA 的同学都了解工作流引擎,工作流的优势在于模块化开发,把业务节点进行抽象,流程于业务逻辑分离,方便进行业务节点组装,也是很多低代码平台的底层工作原理。大语言模型的应用特别适合工作流, 模型可以理解一个万能的 API,传统的 API 都有固定的入参、出参、功能,而模型会根据提示词做推理,具体做什么,返回什么,需要用户来自定义。例如,可以想象一个典型的场景,检测系统日志,如果发现异常发送邮件到指定的邮件组。本文将介绍如何在 LlamaIndex 创建工作流:

创建一个简单的工作流

首先安装工作流依赖

pip install llama-index-utils-workflow

LlamaIndex 是一个基于事件的工作流引擎,工作流通过事件来驱动,工作流节点在 LlamaIndex 中是 Step,节点对应类中的一个方法,方法上加上@step 注解,node 的输入和输出都是 event。工作流有两个特别 Event,StartEvent 和 StopEvent,StartEvent 是开始节点,workflow.run 启动 workflow 之后进入的第一个节点就是 StartEvent,workflow.run 可以传入初始化参数。

from llama_index.core.workflow import (
    StartEvent,
    StopEvent,
    Workflow,
    step,
    Event
)
import asyncio
from llama_index.utils.workflow import draw_all_possible_flows

class F1Event(Event):
    first_output: str

class MyWorkflow(Workflow):
    @step
    async def my_step(self, ev: StartEvent) -> StopEvent:
        # do something here
        return StopEvent(result=ev.topic)
    
    
draw_all_possible_flows(MyWorkflow, filename="basic_workflow.html")

async def main():
    w = MyWorkflow(timeout=10, verbose=False)
    result = await w.run(topic="Hello")
    print(result)


if __name__ == "__main__":
    import asyncio

    asyncio.run(main())

draw_all_possible_flows 可以将 Workflow 可视化
在这里插入图片描述

保存状态

通过上下文 (Conext) 在节点之间保存数据,例如初始化传入数据, 在其他节点获取数据。

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

class FirstEvent(Event):
    first_output: str


class SecondEvent(Event):
    second_output: str

class MyWorkflow(Workflow):
    @step
    async def step_one(self, ctx: Context, ev: StartEvent) -> FirstEvent:
        print(ev.first_input)
        
        await ctx.set("data", ev.data)
        
        return FirstEvent(first_output="First step complete.")

    @step
    async def step_two(self, ctx:Context, ev: FirstEvent) -> SecondEvent:
        print(ev.first_output)
        return SecondEvent(second_output="Second step complete.")

    @step
    async def step_three(self, ctx:Context, ev: SecondEvent) -> StopEvent:
        print(ev.second_output)
        print(await ctx.get("data"))
        return StopEvent(result="Workflow complete.")



async def main():
    w = MyWorkflow(timeout=10, verbose=False)
    result = await w.run(first_input="Hello", data={"name": "tom"})
    print(result)


if __name__ == "__main__":
    import asyncio

    asyncio.run(main())

嵌套工作流

工作流节点中,可以嵌套其他工作流,首先在 workflow 中添加工作流,在需要启动工作流的节点上,将子工作流作为参数传入。

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

class ReflectionFlow(Workflow):
    @step
    async def sub_start(self, ctx: Context, ev: StartEvent) -> StopEvent:
        print("Doing custom reflection")
        return StopEvent(result="Improved query")

class FirstEvent(Event):
    first_output: str


class SecondEvent(Event):
    second_output: str

class MyWorkflow(Workflow):
    @step
    async def step_one(self, ctx: Context, ev: StartEvent) -> FirstEvent:
        print(ev.first_input)
        
        await ctx.set("data", ev.data)
        
        return FirstEvent(first_output="First step complete.")

    @step
    async def step_two(self, ctx:Context, ev: FirstEvent, reflection_workflow: Workflow) -> SecondEvent:
        print(ev.first_output)
        res = await reflection_workflow.run(query="nested")
        print(f"nested workflow {res}")
        return SecondEvent(second_output="Second step complete.")

    @step
    async def step_three(self, ctx:Context, ev: SecondEvent) -> StopEvent:
        print(ev.second_output)
        print(await ctx.get("data"))
        return StopEvent(result="Workflow complete.")



async def main():
    w = MyWorkflow(timeout=10, verbose=False)
    w.add_workflows(reflection_workflow=ReflectionFlow())

    result = await w.run(first_input="Hello", data={"name": "tom"})
    print(result)


if __name__ == "__main__":
    import asyncio

    asyncio.run(main())

总结

在 LlamaIndex 中,为了能够更好的将组建进行组装,提供工作流机制,事件工作流可以很好的解耦工作流的逻辑。事件工作流要尽量简单,如果节点过多就是导致事件过于复杂,事件管理也是比较松散的,过多的依赖会导致后期维护困难。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2092046.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

还在为低效工作烦恼?Kimi使用指南,让你的效率飞跃提升

在这个信息爆炸的时代,效率成为了我们追求的重要目标。今天,我要为大家介绍一个能够显著提升工作效率的智能助手——Kimi。Kimi不仅能够理解复杂的指令,还能处理多种文件格式,甚至还能进行网页内容解析。这篇文章将带你一文看懂Ki…

如何打开终端?

终端也叫黑窗口,命令行,可以用代码命令的方式控制计算机,如何打开呢? 输入WinR 在左下角输入cmd 点击确定 出现这个界面证明打开

住宅物业满意度计算方式中满意率和满意度指数的区别

满意率和满意度指数是用于计算住宅物业满意度的两种不同方式,它们的区别如下: 1、满意率:满意率是通过计算满意的居民人数与总参与调查的居民人数之间的比例来衡量满意度。它以百分比形式表示,可以直观地了解居民对物业管理的整体…

关于lua调用DLL的c/c++动态库(相关搜索:数据库)

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…

8个Python编程进阶常用技巧!

介绍 Python 炫酷功能(例如,变量解包,偏函数,枚举可迭代对象等)的文章层出不穷。但是还有很多 Python 的编程小技巧鲜被提及。因此,本文会试着介绍一些其它文章没有提到的小技巧,这些小技巧也是…

《黑神话:悟空》:30%抽成真相

《黑神话:悟空》自建服务器出售?揭秘游戏界的30%抽成真相! 近年来,随着游戏行业的迅猛发展,游戏开发商与发行平台之间的利益分配问题逐渐成为业界关注的焦点。其中,《黑神话:悟空》作为一款备受…

接口和多态详解,还不快点学?

一、接口和多态基础知识 1. 抽象类 1.1 子类调用父类 现在有IDEA集成开发环境,可以给大家实时提醒哪个地方编译错误,但假如要大家用.txt文件编写程序呢。胡广问:现在这段代码错在了哪? class Base {public Base(String s) {Sy…

接口测试 —— 如何设计高效的测试用例!

摘要: 随着互联网应用的日益复杂化,接口测试已成为保证软件质量不可或缺的一部分。本文将探讨如何有效地设计接口测试用例,并提供实用的建议和示例。 一、引言 接口测试(API测试)是确保系统各部分之间交互正确性的关键…

57基于SpringBoot+Vue+uniapp的洗衣店订单管理系统的详细设计和实现(源码+lw+部署文档+讲解等)

文章目录 前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus 系统测试系统测试目的系统功能测试系统测试结论 为什么选择我代码参考数据库参考源码获取源码获取 前言 🌞博主介绍 :✌全网粉丝15W,CSDN特邀作者、21…

进程间通信----管道篇

目录 一丶 无名管道 1. 特点 2. 读写特性 3. 函数接口 二丶有名管道 1.特点: 2.函数接口 3. 读写特性 一丶 无名管道 1. 特点 1. 只能用于具有亲缘关系的进程之间的通信 2. 半双工的通信模式,具有固定的读端和写端 3. 管道可以…

Qt:玩转QPainter后转之太极图

前言 简单了解了QPainter之后还是要做两个小例子练一练,不实际去做,只看看函数是没啥太大提升的,这里就简单画一个太极图。 正文 我们都知道太极分为阴阳鱼两部分,阴鱼(黑色)有个白色鱼眼,阳鱼(白色)有个黑色鱼眼&am…

2024最详细Maven配置教程

1、Maven 1.1、Maven简介 Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。 Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性&…

EmbeddedGUI简介

简介 文档地址&#xff1a;欢迎来到EmbeddedGUI的文档 本项目主要面对RAM资源有限&#xff08;<8KB&#xff09;&#xff0c;ROM资源有限&#xff08;<64KB&#xff0c;主要看所需字体和贴图资源&#xff09;&#xff0c;CPU资源还充裕&#xff08;<100MHz&#xff…

PDF Guru Anki - 支持 PDF 处理和 Anki 制卡的多功能工具箱

DF Guru Anki&#xff0c;这是一款能够大幅提升学习和办公效率的工具。 不仅能够帮助我们快速处理 PDF 文件&#xff0c;还能够高效管理各种学习资料&#xff0c;轻松制作 Anki 卡片。 PDF Guru Anki 支持 PDF 合并、拆分、旋转、加密等基本操作&#xff0c;还能够处理水印、书…

企业资产管理是什么?如何做好?权威指南

企业资产管理&#xff08;Enterprise Asset Management, 简称EAM&#xff09;已成为企业提升运营效率、降低维护成本、增强市场竞争力的重要手段。 本文将从企业资产管理的定义、重要性、实施方法及优化策略等方面&#xff0c;提供一份权威的指南&#xff0c;帮助企业更好地理解…

视频结构化从入门到精通——行为分析类应用

行为分析类应用 1. 认识行为分析 监控/判断视频画面中目标的运动过程、携带属性等。从数据中自动识别、跟踪和理解人类或物体行为。 1. 车的行为分析应用 车辆行为分析主要用于监控和管理车辆的动态行为&#xff0c;广泛应用于智能交通、城市管理和安全监控。关键应用包括&…

信息安全--(四)网络安全体系与安全模型(二)

其他安全模型 ■纵深防御模型&#xff1a;①安全保护②安全监测③实时响应④恢复 ■分层防护模型&#xff1a;参考OSI模型&#xff0c;对保护对象进行层次化保护。 ■等级保护模型&#xff1a;将信息系统划分成不同安全保护等级&#xff0c;采取相 应的保护措施。 ■网络生…

使用numpy快速实现统计分析的常用代码实现

文末赠免费精品编程资料~~ NumPy 是 Python 编程语言中用于数值计算的核心库之一&#xff0c;在统计分析方面&#xff0c;它也提供了各种各样的函数来实现统计分析。 NumPy统计分析功能概览 基本统计量&#xff1a;计算平均值、中位数、众数、标准差、方差等。 排序和搜索&a…

8款对比分析:哪款协同办公软件最适合您的团队?

文章介绍了以下几个工具&#xff1a;1. Worktile&#xff1b;2. PingCode&#xff1b;3. 钉钉&#xff1b;4. 有道云协作&#xff1b;5. 云之家&#xff1b;6. 飞书&#xff1b;7. 语雀&#xff1b;8. Airtable。 在当今快节奏的工作环境中&#xff0c;找到一款能够无缝同步文件…

全网最全软件测试面试题(含答案解析+文档)

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、软件测试基础面试题 1、阐述软件生命周期都有哪些阶段? 常见的软件生命周期模型有哪些? 软件生命周期是指一个计算机软件从功能确定设计&#xff0c;到…