当前位置: 首页 > article >正文

Eino-Workflow 实战详解

Eino-Workflow 实战详解概述本文详细讲解 Eino 框架中 Workflow 的概念、初始化、编排和编译过程。Workflow 是 Eino 框架中用于构建分支 AI 流程的核心组件提供了比 Chain 更灵活的编排能力代码链接。一、Eino 框架中 Workflow 的概念1.1 什么是 WorkflowWorkflow工作流是 Eino 框架中用于编排 AI 流程的重要组件。与 Chain 的线性执行不同Workflow 支持设置多个输入源和分支结构可以构建更复杂的 AI 应用流程。1.2 Workflow vs Chain vs Graph特性ChainWorkflowGraph结构严格线性分支结构DAG输入源单一起点多个入口多个入口节点连接顺序执行链式分支任意连接执行模式顺序顺序/并行拓扑排序适用场景简单流水线多阶段流程复杂AI应用灵活性低中高1.3 Workflow 的核心特点workflow:compose.NewWorkflow[map[string]any,*schema.Message]()泛型参数[map[string]any, *schema.Message]定义输入输出类型链式调用通过AddXXXNode().AddInput()实现链式编排多入口设置可设置多个AddInput来源明确的终点通过.End()标记工作流终点二、如何初始化 Workflow2.1 创建 Workflow 实例funcinitWorkflow(cfg*Config)error{ctx:context.Background()wf:compose.NewWorkflow[map[string]any,*schema.Message]()// ...}2.2 定义提示词模板systemTpl:你是一名篮球教练与比赛分析师。你需要结合用户的基本信息与训练习惯 使用 player_info API 补全用户画像然后给出位置建议、核心技能树、一周训练计划、以及一套简单战术建议。chatTpl:prompt.FromMessages(schema.FString,schema.SystemMessage(systemTpl),schema.MessagesPlaceholder(histories,true),schema.UserMessage({user_query}),)2.3 创建 ChatModelchatModel,err:openai.NewChatModel(ctx,openai.ChatModelConfig{APIKey:cfg.Model.APIKey,Model:cfg.Model.ModelName,BaseURL:cfg.Model.BaseURL,})2.4 创建工具节点playerInfoTool:utils.NewTool(schema.ToolInfo{Name:player_info,Desc:根据用户的姓名和邮箱查询用户的篮球相关信息,ParamsOneOf:schema.NewParamsOneOfByParams(map[string]*schema.ParameterInfo{name:{Type:string,Desc:用户的姓名},email:{Type:string,Desc:用户的邮箱},}),},func(ctx context.Context,input*playerInfoRequest)(*playerInfoResponse,error){returnplayerInfoResponse{Name:input.Name,Email:input.Email,Role:锋线,HeightCM:182,WeightKG:78,PlayStyle:偏投射无球空切偶尔持球突破,WeeklyHours:4,},nil},)toolsNode,err:compose.NewToolNode(ctx,compose.ToolsNodeConfig{Tools:[]tool.BaseTool{playerInfoTool},})2.5 创建 Lambda 节点Lambda 节点用于数据转换处理节点的输入输出// 把 toolsNode 输出的 []*schema.Message - 提炼成一个普通 user messagetoolToTextOps:func(ctx context.Context,input*schema.StreamReader[[]*schema.Message],)(*schema.StreamReader[*schema.Message],error){returnschema.StreamReaderWithConvert(input,func(msgs[]*schema.Message)(*schema.Message,error){iflen(msgs)0{returnnil,errors.New(no message)}typelitestruct{Contentstringjson:content,omitempty}lites:make([]lite,0,len(msgs))for_,m:rangemsgs{ifmnil{continue}litesappend(lites,lite{Content:m.Content})}b,_:json.MarshalIndent(lites,, )text:工具返回的用户信息汇总\nstring(b)returnschema.UserMessage(text),nil}),nil}lambdaToolToText:compose.TransformableLambda[[]*schema.Message,*schema.Message](toolToTextOps)三、如何编排 Workflow3.1 节点类型Workflow 支持的节点类型与 Graph 类似节点类型方法说明ChatTemplateNodeAddChatTemplateNode提示词模板节点ChatModelNodeAddChatModelNode大模型节点ToolsNodeAddToolsNode工具节点LambdaNodeAddLambdaNode自定义转换节点3.2 链式编排Workflow 的核心特点是链式调用每个节点方法返回 Workflow 自身支持连续调用wf.AddChatTemplateNode(prompt,chatTpl).AddInput(compose.START)wf.AddChatModelNode(chat,chatModel).AddInput(prompt)wf.AddToolsNode(tools,toolsNode).AddInput(chat)wf.AddLambdaNode(tool_to_text,lambdaToolToText).AddInput(tools)wf.AddLambdaNode(prompt_transform,lambdaPrompt).AddInput(tool_to_text)wf.AddChatModelNode(chat_recommend,chatModel).AddInput(prompt_transform)wf.End().AddInput(chat_recommend)3.3 关键方法说明AddChatTemplateNode(name, template)添加提示词模板节点AddChatModelNode(name, model)添加大模型节点AddToolsNode(name, tools)添加工具节点AddLambdaNode(name, lambda)添加 Lambda 转换节点AddInput(source)设置节点的输入源可以是compose.START、其他节点名称或多个节点End()标记工作流终点3.4 Workflow 编排流程图START ──────────────────────────────────────────────────────── │ │ ▼ │ ┌─────────────────┐ │ │ promptNode │ (ChatTemplate: 篮球教练系统提示词) │ └────────┬────────┘ │ │ │ ▼ │ ┌─────────────────┐ │ │ chatNode │ (ChatModel: 第一次模型调用决定是否调用工具) │ └────────┬────────┘ │ │ │ ▼ │ ┌─────────────────┐ │ │ toolsNode │ (ToolsNode: player_info 工具) │ └────────┬────────┘ │ │ │ ▼ │ ┌─────────────────┐ │ │ tool_to_text │ (Lambda: 工具结果转为用户消息) │ └────────┬────────┘ │ │ │ ▼ │ ┌─────────────────┐ │ │ prompt_transform│ (Lambda: 构造第二次模型输入) │ └────────┬────────┘ │ │ │ ▼ │ ┌──────────────────────┐ │ │ chat_recommend │ (ChatModel: 第二次模型调用生成最终推荐) │ └────────┬─────────────┘ │ │ │ ▼ │ END ◀─────────────────────────────────────────────────┘四、如何编译 Workflow4.1 编译方法funccompileWorkflow()error{ctx:context.Background()r,err:workflow.Compile(ctx)iferr!nil{returnfmt.Errorf(编译 Workflow 失败: %w,err)}runnabler log.Printf(Workflow 编译成功)returnnil}4.2 执行 Workflow编译后的 Workflow 是一个Runnable对象output,err:runnable.Invoke(ctx,map[string]any{histories:[]*schema.Message{},user_query:req.UserQuery,})4.3 响应处理resp:WorkflowResponse{Content:output.Content,ReasoningContent:output.ReasoningContent,}ifoutput.ResponseMeta!niloutput.ResponseMeta.Usage!nil{resp.PromptTokensoutput.ResponseMeta.Usage.PromptTokens resp.OutputTokensoutput.ResponseMeta.Usage.CompletionTokens resp.TotalTokensoutput.ResponseMeta.Usage.TotalTokens}五、Workflow 与 Graph 的区别5.1 编排方式不同Workflow 链式编排wf.AddChatTemplateNode(prompt,chatTpl).AddInput(compose.START)wf.AddChatModelNode(chat,chatModel).AddInput(prompt)Graph 声明式编排g.AddChatTemplateNode(prompt,chatTpl)g.AddChatModelNode(chat,chatModel)g.AddEdge(prompt,chat)// 显式添加边5.2 结构特点Workflow更适合线性或简单分支结构代码更简洁Graph更适合复杂网状结构需要显式定义节点间的边5.3 选择建议场景推荐使用简单流水线Chain多阶段分支流程Workflow复杂 DAG 结构Graph六、完整项目结构lab02/ ├── config.yml # 配置文件 ├── workflow/ │ ├── workflow_chat.go # 主程序 │ ├── workflow_chat # 编译产物 │ └── docs/ # Swagger文档 │ ├── docs.go │ ├── swagger.json │ └── swagger.yaml配置文件 config.ymlmodel:base_url:https://api.minimaxi.com/v1api_key:your-api-keymodel_name:MiniMax-M2.7app:host:0.0.0.0port:8080七、运行项目启动服务cdlab02/workflow go run workflow_chat.go-logworkflow.logAPI 调用curl-XPOST http://localhost:8080/workflow\-HContent-Type: application/json\-d{user_query: 我叫morning邮箱是lumworngmail.com帮我制定训练计划}访问 Swagger UIhttp://localhost:8080/swagger/index.html八、总结本文通过workflow_chat.go实战项目详细讲解了Workflow 概念Eino 框架中用于构建分支 AI 流程的核心组件支持链式编排初始化 Workflow创建实例、定义模板、创建工具和 Lambda 节点编排 Workflow通过链式调用AddNode().AddInput()方法串联各节点编译 Workflow调用Compile方法将 Workflow 编译为可执行对象Workflow 相比 Chain 提供了更灵活的分支编排能力同时比 Graph 的语法更简洁适用于多阶段、多分支的 AI 应用场景。

相关文章:

Eino-Workflow 实战详解

Eino-Workflow 实战详解 概述 本文详细讲解 Eino 框架中 Workflow 的概念、初始化、编排和编译过程。Workflow 是 Eino 框架中用于构建分支 AI 流程的核心组件,提供了比 Chain 更灵活的编排能力,代码链接。 一、Eino 框架中 Workflow 的概念 1.1 什么…...

Autovisor:智慧树课程自动化学习终极指南

Autovisor:智慧树课程自动化学习终极指南 【免费下载链接】Autovisor 2025智慧树刷课脚本 基于Python Playwright的自动化程序 [有免安装版] 项目地址: https://gitcode.com/gh_mirrors/au/Autovisor Autovisor是一款基于Python Playwright框架开发的智能自动…...

HTML5中Mediastream实现摄像头画面实时捕获

HTML5通过MediaStream API可直接调用摄像头:先用navigator.mediaDevices.getUserMedia({video:true})获取流并赋给video.srcObject,再用canvas逐帧绘制处理;需处理权限异常、复用流、设置约束参数,并注意HTTPS和移动端autoplay/mu…...

深入理解 V8 引擎:C++ 与 JavaScript 的跨界传送门

在进行 Chromium 浏览器内核开发的日常中,我们经常需要追踪一段 JavaScript 代码是如何被浏览器执行的,或者一个扩展 API(如 chrome.tabs.query 或 chrome.account.login)是如何从 JS 穿透到 C 底层的。 当我们顺着 Blink 的 HTM…...

如何轻松重置IDE试用期:终极JetBrains插件配置指南

如何轻松重置IDE试用期:终极JetBrains插件配置指南 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 你是否曾经在使用JetBrains系列IDE时,突然发现30天的试用期已经结束?那种感觉…...

PowerPaint-V1 Gradio实现.NET图像处理应用:跨平台开发实战

PowerPaint-V1 Gradio实现.NET图像处理应用:跨平台开发实战 如果你正在寻找一种方法,将前沿的AI图像修复能力集成到你自己的.NET应用中,那么你来对地方了。想象一下,你的电商应用能一键移除商品图片中的瑕疵水印,或者…...

NotaGen AI音乐生成:5分钟快速部署,零基础创作古典音乐

NotaGen AI音乐生成:5分钟快速部署,零基础创作古典音乐 1. 从零开始部署NotaGen 1.1 环境准备 NotaGen已经预置在Docker镜像中,无需额外安装依赖。您只需要: 确保系统已安装Docker(推荐版本20.10)拥有至…...

计算机毕业设计:Python全国气象数据采集与预报平台 Django框架 线性回归 数据分析 大数据 机器学习 大模型 气象数据(建议收藏)✅

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立软件开发工作室,专注于计算机相关专业项目实战6年之久,累计开发项目作品上万套。凭借丰富的经验与专业实力,已帮助成千上万的学生顺利毕业,…...

foc进阶篇3——对比PLL测速,为M法加低通正名

foc进阶篇3——对比PLL测速,为M法加低通正名相信大部分人在刚开始接触编码器时,对电机的转速获取基本都是使用M法测速加低通滤波的方式。但随着工作学习的不断深入,会逐渐听到有人说PLL测速更好,诸如什么“pll是观测器”、“pll的…...

保姆级教学:实时手机检测-通用镜像部署与使用全流程

保姆级教学:实时手机检测-通用镜像部署与使用全流程 1. 模型简介与核心优势 1.1 模型技术背景 实时手机检测-通用模型是基于DAMOYOLO-S框架开发的高性能目标检测模型。DAMO-YOLO是一个专门为工业落地设计的目标检测框架,在保持高速推理的同时&#xf…...

从零到一:CosyVoice2语音克隆应用部署与使用全攻略

从零到一:CosyVoice2语音克隆应用部署与使用全攻略 1. 项目概述与核心价值 CosyVoice2-0.5B是阿里开源的一款零样本语音合成系统,通过预置镜像"强大的声音克隆声音合成语音克隆应用 构建by科哥",开发者可以快速搭建专业级语音克隆…...

Flash浏览器终极指南:一键解决Flash内容播放难题,免费重温经典游戏

Flash浏览器终极指南:一键解决Flash内容播放难题,免费重温经典游戏 【免费下载链接】CefFlashBrowser Flash浏览器 / Flash Browser 项目地址: https://gitcode.com/gh_mirrors/ce/CefFlashBrowser 还在为无法播放网页Flash内容而烦恼吗&#xff…...

Xinference-v1.17.1 GitHub协作开发:团队AI项目实战指南

Xinference-v1.17.1 GitHub协作开发:团队AI项目实战指南 1. 引言 团队开发AI项目时,版本控制和协作是个让人头疼的问题。不同成员的环境配置不同,代码修改冲突频繁,模型版本管理混乱——这些都是我们实际开发中经常遇到的痛点。…...

SDMatte Web服务稳定性测试:高并发请求下7860端口响应与错误率分析

SDMatte Web服务稳定性测试:高并发请求下7860端口响应与错误率分析 1. 测试背景与目标 SDMatte作为一款面向高质量图像抠图的AI模型,在实际生产环境中需要处理大量并发请求。本次测试旨在评估其Web服务在高并发场景下的稳定性表现,重点关注…...

搬运工还是规划者?传统仓管若不转型AI供应链规划师,注定被无人仓储淹没

在机器轰鸣的现代化仓储中心,自动引导车沿着既定路线安静穿梭,机械臂在货架间精准抓取,温湿度传感器实时监控每一个库区,大数据面板清晰呈现库存动态、物流轨迹与供需预测——这不是科幻场景,而是当下无人仓储的真实写…...

从Matlab到HunyuanVideo-Foley:学术研究中的音频信号处理与生成

从Matlab到HunyuanVideo-Foley:学术研究中的音频信号处理与生成 1. 引言:音频研究的传统与革新 在音频信号处理领域,Matlab长期以来都是学术研究的标配工具。从频谱分析到滤波器设计,从特征提取到时频变换,Matlab提供…...

写作柚助力高效论文写作之路

临近期末,很多大四学生都开始写论文了,可问题是,大学四年,学校并没有教我们怎么写论文,现在突然让写论文,写开题报告,修改论文,查重降重,写答辩PPT等等。在这毕业季&…...

ICPC竞赛中的字符串优化技巧:以香港站K题LR String为例,详解预处理与加速查询

ICPC竞赛中的字符串优化技巧:以香港站K题LR String为例,详解预处理与加速查询 在算法竞赛的战场上,字符串处理往往是决定胜负的关键分水岭。当其他选手还在为TLE(Time Limit Exceeded)焦头烂额时,掌握预处…...

Phi-4-mini-reasoning实战:分析并优化开源项目中的C++代码结构

Phi-4-mini-reasoning实战:分析并优化开源项目中的C代码结构 1. 开篇:当AI遇见C代码优化 最近在GitHub上发现一个挺有意思的中小型C项目——SimpleWebServer,它实现了一个基础的HTTP服务器功能。正好手头有Phi-4-mini-reasoning这个工具&am…...

别再死记硬背了!用Python代码复现Photoshop 27种混合模式(附完整源码)

用Python代码实现Photoshop混合模式的终极指南 在数字图像处理领域,Photoshop的混合模式就像魔术师的调色板,能够创造出令人惊叹的视觉效果。但你是否想过这些看似神秘的混合效果背后,其实是一系列精确的数学公式在起作用?本文将带…...

3个关键技巧:如何用Blender 3MF插件重塑你的3D打印工作流?

3个关键技巧:如何用Blender 3MF插件重塑你的3D打印工作流? 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 你是否曾经遇到过这样的困境&#xff1…...

2022.12四级听力真题解析:高效备考策略与实战技巧

1. 四级听力真题的价值与备考意义 2022年12月的四级听力真题是备考的黄金资料,它不仅能让你熟悉考试的真实难度和题型,还能帮助你发现自己的薄弱环节。很多同学在备考时喜欢刷各种模拟题,却忽略了真题的重要性。我见过太多考生在考场上才发现…...

C编码小技巧(代码注释,日志开启/关闭,#pragma once)

文章目录 1、代码注释2、功能模块 日志开启和关闭3、防止.h重复定义 1、代码注释 代码注释 除了//,/**/,还有 条件编译 : #if 0#endif2、功能模块 日志开启和关闭 #if 0 #define APP_ERR(format,...) do { \printf("[keys_task] erro…...

雪女-斗罗大陆-造相Z-Turbo在元宇宙中的应用:为用户虚拟化身生成个性化动漫形象

雪女-斗罗大陆-造相Z-Turbo在元宇宙中的应用:为用户虚拟化身生成个性化动漫形象 想象一下,你正准备进入一个热闹的虚拟世界,参加一场线上聚会。别人都顶着一个系统默认的、千篇一律的方块人形象,而你,却拥有一个完全根…...

Java连接Kafka示例

1、引入依赖<dependency><groupId>org.apache.kafka</groupId><artifactId>kafka_2.12</artifactId><version>2.1.0</version><scope>provided</scope></dependency><!-- https://mvnrepository.com/artifact/…...

Linux持久化配置GRE接口

Centos7持久化配置GRE接口GRE协议简介前置条件1.开发ipv4转发1.1启用TCP窗口缩放1.2启用自动MTU1.3禁用ipv6--可选1.4使内核配置生效2.加载内核模块3.放通防火墙方案1:ip命令临时配置GRE隧道VM1临时配置GRE接口配置邻居启动GRE隧道VM2临时配置GRE接口配置邻居启动GRE隧道关闭和…...

Qt打印报表避坑指南:如何用QPrinter设置A4纸横向/纵向并实现精准分页?

Qt报表打印实战&#xff1a;精准控制A4纸方向与分页的7个关键技巧 在开发企业级应用时&#xff0c;报表打印功能往往是刚需&#xff0c;但也是最容易出问题的环节之一。最近接手一个财务系统项目时&#xff0c;就遇到了这样的场景&#xff1a;客户要求将月度对账单导出为PDF&am…...

鸿蒙 Media Kit(媒体服务):音视频播放、录制

本文同步发表于微信公众号&#xff0c;微信搜索 程语新视界 即可关注&#xff0c;每个工作日都有文章更新 Media Kit&#xff08;媒体服务&#xff09;是鸿蒙系统中用于开发音视频播放或录制功能的核心模块。无论是开发音乐播放器、视频播放器&#xff0c;还是实现音视频录制、…...

AzurLaneAutoScript:从人工操作到智能决策的游戏自动化革命

AzurLaneAutoScript&#xff1a;从人工操作到智能决策的游戏自动化革命 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研&#xff0c;全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript 深夜…...

Bili2text:一键将B站视频转为文字稿的终极免费工具

Bili2text&#xff1a;一键将B站视频转为文字稿的终极免费工具 【免费下载链接】bili2text Bilibili视频转文字&#xff0c;一步到位&#xff0c;输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 在信息爆炸的时代&#xff0c;Bilibili&#x…...