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

Eino-Workflow 实战详解

Eino-Workflow 实战详解

概述

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

一、Eino 框架中 Workflow 的概念

1.1 什么是 Workflow

Workflow(工作流)是 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()标记工作流终点

二、如何初始化 Workflow

2.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 创建 ChatModel

chatModel,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){return&playerInfoResponse{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{Contentstring`json:"content,omitempty"`}lites:=make([]lite,0,len(msgs))for_,m:=rangemsgs{ifm==nil{continue}lites=append(lites,lite{Content:m.Content})}b,_:=json.MarshalIndent(lites,""," ")text:="工具返回的用户信息(汇总):\n"+string(b)returnschema.UserMessage(text),nil}),nil}lambdaToolToText:=compose.TransformableLambda[[]*schema.Message,*schema.Message](toolToTextOps)

三、如何编排 Workflow

3.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 ◀─────────────────────────────────────────────────┘

四、如何编译 Workflow

4.1 编译方法

funccompileWorkflow()error{ctx:=context.Background()r,err:=workflow.Compile(ctx)iferr!=nil{returnfmt.Errorf("编译 Workflow 失败: %w",err)}runnable=r 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!=nil&&output.ResponseMeta.Usage!=nil{resp.PromptTokens=output.ResponseMeta.Usage.PromptTokens resp.OutputTokens=output.ResponseMeta.Usage.CompletionTokens resp.TotalTokens=output.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.yml

model:base_url:"https://api.minimaxi.com/v1"api_key:"your-api-key"model_name:"MiniMax-M2.7"app:host:"0.0.0.0"port:8080

七、运行项目

启动服务

cdlab02/workflow go run workflow_chat.go-logworkflow.log

API 调用

curl-XPOST http://localhost:8080/workflow\-H"Content-Type: application/json"\-d'{"user_query": "我叫morning,邮箱是lumworn@gmail.com,帮我制定训练计划"}'

访问 Swagger UI

http://localhost:8080/swagger/index.html

八、总结

本文通过workflow_chat.go实战项目,详细讲解了:

  1. Workflow 概念:Eino 框架中用于构建分支 AI 流程的核心组件,支持链式编排
  2. 初始化 Workflow:创建实例、定义模板、创建工具和 Lambda 节点
  3. 编排 Workflow:通过链式调用AddNode().AddInput()方法串联各节点
  4. 编译 Workflow:调用Compile方法将 Workflow 编译为可执行对象

Workflow 相比 Chain 提供了更灵活的分支编排能力,同时比 Graph 的语法更简洁,适用于多阶段、多分支的 AI 应用场景。

http://www.jsqmd.com/news/622381/

相关文章:

  • AI证书在面试中的价值分析
  • 投资者情绪指数(ISI与CICSI)二十年趋势解析:从数据到市场洞察
  • ICPC竞赛中的字符串优化技巧:以香港站K题LR String为例,详解预处理与加速查询
  • 【AI创意应用】AI创意, 个人实践的内容和结果汇总
  • all-MiniLM-L6-v2新手入门:从零到一搭建语义相似度计算环境
  • DCT-Net卡通化实战案例:从自拍到漫画头像的完整生成流程
  • 写作柚助力高效论文写作之路
  • SOONet模型Node.js后端服务开发:环境配置与API接口封装
  • Flash内容访问难题如何解决?CefFlashBrowser提供完整兼容方案
  • 01Day 语言介绍+软件安装+项目创建+输出语句+注释
  • 深度解析 Chromium WebUI 的生命周期与 IsJavascriptAllowed 崩溃之谜
  • 如何用c# 做 mcp/ChatGPT app磁
  • Linux持久化配置GRE接口
  • 终极Tree of Thoughts实战指南:10个复杂问题解决案例详解
  • 3分钟搞定:让你的Switch手柄在电脑上畅玩所有游戏 [特殊字符]
  • 深度解析冷板式液冷技术在AI数据中心中的关键应用与规范
  • 蓝桥杯 504单词分析java
  • 东京大学团队:AI写论文时代已来,但“幻觉“问题却让人忧心忡忡
  • Ollama部署granite-4.0-h-350m:轻量模型本地运行完整教程
  • 告别复杂配置!Xinference-v1.17.1一键部署开源大模型指南
  • 5分钟上手PlantUML编辑器:告别拖拽式绘图,用代码高效设计UML图表
  • VBA-JSON实战解密:5步突破Excel与JSON数据转换瓶颈
  • Java连接Kafka示例
  • 2026年停车场照明哪家性价比高?多维度分析与选择参考 - 品牌排行榜
  • Qwen3-Embedding-4B惊艳案例:用128维向量实现高效语义搜索
  • 2026停车场照明品牌发展观察:智能节能技术引领行业升级 - 品牌排行榜
  • Poppler for Windows:让PDF处理变得简单高效的开源工具
  • Ant Media Server性能优化:10个提升流媒体质量的关键技巧
  • 重0到1基于langchain框架搭建一个智能体(chapter 1)
  • 雪女-斗罗大陆-造相Z-Turbo在元宇宙中的应用:为用户虚拟化身生成个性化动漫形象