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

AI大模型框架eino框架快速上手

graph图编排

无大模型的图编排

package agentimport ("context""fmt""github.com/cloudwego/eino/compose"
)func Graph_agent() {ctx := context.Background()//未添加模型的graph流程 注册图 同时定义输入输出的类型 这里都为string类型g := compose.NewGraph[string, string]()lambda0 := compose.InvokableLambda(func(ctx context.Context, input string) (output string, err error) {if input == "测试1" {return "输入1", nil} else if input == "测试2" {return "输入2", nil} else if input == "测试3" {return "输入3", nil}return "", nil})lambda1 := compose.InvokableLambda(func(ctx context.Context, input string) (output string, err error) {return "这里是节点1的输出", nil})lambda2 := compose.InvokableLambda(func(ctx context.Context, input string) (output string, err error) {return "这里是节点2的输出", nil})lambda3 := compose.InvokableLambda(func(ctx context.Context, input string) (output string, err error) {return "这里是节点3的输出", nil})// 加入节点err := g.AddLambdaNode("lambda0", lambda0)if err != nil {panic(err)}err = g.AddLambdaNode("lambda1", lambda1)if err != nil {panic(err)}err = g.AddLambdaNode("lambda2", lambda2)if err != nil {panic(err)}err = g.AddLambdaNode("lambda3", lambda3)if err != nil {panic(err)}// 分支连接 增加边 用来标记节点与节点怎样连接的err = g.AddEdge(compose.START, "lambda0")if err != nil {panic(err)}// 加入分支err = g.AddBranch("lambda0", compose.NewGraphBranch(func(ctx context.Context, in string) (endNode string, err error) {if in == "输入1" {return "lambda1", nil} else if in == "输入2" {return "lambda2", nil} else if in == "输入3" {return "lambda3", nil}// 否则,返回 compose.END,表示流程结束return compose.END, nil}, map[string]bool{"lambda1": true, "lambda2": true, "lambda3": true, compose.END: true}))if err != nil {panic(err)}//增加边 lambda1这个节点直接连接end节点err = g.AddEdge("lambda1", compose.END)if err != nil {panic(err)}err = g.AddEdge("lambda2", compose.END)if err != nil {panic(err)}err = g.AddEdge("lambda3", compose.END)if err != nil {panic(err)}// 编译r, err := g.Compile(ctx)if err != nil {panic(err)}// 执行answer, err := r.Invoke(ctx, "测试1")if err != nil {panic(err)}fmt.Println(answer)
}

在这里插入图片描述
来具体看下eino框架的各个api

  • compose.NewGraph 新建图

注意这个图只定义了各个节点之间的流向,没有定义大模型,这个是eion框架设计的重要思想

  • compose.InvokableLambda
    把一个普通的 Go 函数适配成“可调用的图节点”。它接收形如 func(ctx context.Context, input T) (output U, err error) 的函数,返回一个实现了可调用接口的节点对象,供 AddLambdaNode 加入到 Graph 中并在运行时由编排调用
  • g.AddLambdaNode
    增加图节点
  • g.AddEdge
    增加图节点的边
    即把当前的节点流向哪个节点
  • g.AddBranch
    增加图节点分支,即节点有多个分支输出的时候,可以使用AddBranch
  • g.Compile
    图编排编译,定义好的“静态图”生成一个可执行的运行器
  • r.Invoke
    eino框架图编排实际运行函数

测试当前输出

在这里插入图片描述
这里是由于节点0定义了流向下一个节点的规则:输入1指向节点1,输入2指向节点2,输入3指向节点3

这里测试给定的输入为 answer, err := r.Invoke(ctx, “测试1”)
因此节点流向了1,因此输出如上

增加包含大模型节点的图编排

package agentimport ("context""fmt""github.com/cloudwego/eino-ext/components/model/ollama""github.com/cloudwego/eino/compose""github.com/cloudwego/eino/schema"
)func NewGraphWithModel() {ctx := context.Background()//新建图g := compose.NewGraph[map[string]string, *schema.Message]()lambda := compose.InvokableLambda(func(ctx context.Context, input map[string]string) (output map[string]string, err error) {if input["role"] == "gongke" {return map[string]string{"role": "gongke", "content": input["content"]}, nil}if input["role"] == "wenke" {return map[string]string{"role": "wenke", "content": input["content"]}, nil}return map[string]string{"role": "user", "content": input["content"]}, nil})GongkeLambda := compose.InvokableLambda(func(ctx context.Context, input map[string]string) (output []*schema.Message, err error) {return []*schema.Message{{Role:    schema.System,Content: "你是一个专业的工科专业人士,回答问题很严肃认真,不会说废话",},{Role:    schema.User,Content: input["content"],},}, nil})WenkeLambda := compose.InvokableLambda(func(ctx context.Context, input map[string]string) (output []*schema.Message, err error) {return []*schema.Message{{Role:    schema.System,Content: "你是一位专业的文科人士,回答问题很温柔,拥有大量的文科知识",},{Role:    schema.User,Content: input["content"],},}, nil})model, err := ollama.NewChatModel(ctx, &ollama.ChatModelConfig{BaseURL: "http://localhost:11434", // Ollama 服务地址Model:   "qwen3:0.6b",             // 模型名称})if err != nil {panic(err)}//注册节点err = g.AddLambdaNode("lambda", lambda)if err != nil {panic(err)}err = g.AddLambdaNode("gongke", GongkeLambda)if err != nil {panic(err)}err = g.AddLambdaNode("wenke", WenkeLambda)if err != nil {panic(err)}err = g.AddChatModelNode("model", model)if err != nil {panic(err)}//链接节点 start->lambdaerr = g.AddEdge(compose.START, "lambda")if err != nil {panic(err)}//加入分支分之直接把两个lambda节点和branch链接了 lambda-> gongke   lambda->wenkeg.AddBranch("lambda", compose.NewGraphBranch(func(ctx context.Context, in map[string]string) (endNode string, err error) {if in["role"] == "gongke" {return "gongke", nil}if in["role"] == "wenke" {return "wenke", nil}return "wenke", nil}, map[string]bool{"wenke": true, "gongke": true}))//把两个lambda节点和model节点进行连接 gongke->modelerr = g.AddEdge("gongke", "model")if err != nil {panic(err)}// wenke->modelerr = g.AddEdge("wenke", "model")if err != nil {panic(err)}//结束节点 model->ENDerr = g.AddEdge("model", compose.END)if err != nil {panic(err)}//编译r, err := g.Compile(ctx)if err != nil {panic(err)}input := map[string]string{"role":    "wenke","content": "介绍下你自己",}//执行answer, err := r.Invoke(ctx, input)if err != nil {panic(err)}fmt.Println(answer.Content)
}

输出在这里插入图片描述
这里的函数逻辑和无大模型节点差不多,知识多了一段逻辑
g.AddChatModelNode
增加大模型节点
注意下注册大模型客户端
这里采用的本地化ollama部署 大模型使用的qwen3

model, err := ollama.NewChatModel(ctx, &ollama.ChatModelConfig{BaseURL: "http://localhost:11434", // Ollama 服务地址Model:   "qwen3:0.6b",             // 模型名称})

在这里插入图片描述

这里通过区分role角色使得lambda节点流向不同的分支,在分支中拿到不同的提示词,从而输出给到下个大模型节点,从而输出不同的信息,如上输出给出的role=wenke

接下来把role修改下role=gongke
输出
在这里插入图片描述
可以看到用户的输出思考会根据用户给定的系统提示词作出思考输出

参考
b站eino开发框架教程

http://www.dtcms.com/a/427842.html

相关文章:

  • Kettle下载和安装-2025新版
  • 网站开发维护的好处网站图片描述怎么写
  • C2D智能知识助手 - 企业版:构建下一代智能知识管理系统
  • 解决vite代理访问后台接口出现 Error: self-signed certificate
  • 曲阜建设局网站网站可以制作ios
  • 【Kafka】Kafka 4.1.0版本安装、配置和服务启动问题解决过程记录
  • 重庆网站建设招标淘宝网站建设规划书
  • 推广文章的注意事项淘宝关键词排名优化
  • 【开题答辩全过程】以 “亚冬会”志愿者管理系统为例,包含答辩的问题和答案
  • 天将建设集团有限公司网站易语言如何做网站
  • 2012r2做网站域名代理商网站
  • 大学生兼职做网站《网站建设与管理》论文
  • iOS 26 崩溃日志深度解读,获取方式、系统变动、定位策略
  • 一站式网站建设用途微信小程序开发商家
  • ABAP+ALV单元格编辑填充数字自动缩小了
  • 中电联互联互通协议:双向互联互通指不同运营商平台数据共享。
  • 【开题答辩实录分享】以《C#大型超市商品上架调配管理系统的设计与实现》为例进行答辩实录分享
  • 负责网站建设和网络推广的红色网站 后台
  • 潇洒郎: Python pdf 转换为jpg
  • ML4T - 第7章第5节 用线性回归预测股票回报Prediction stock returns with linear regression
  • 工厂的网站在哪里做的怎么看一个网站是哪个公司做的
  • xiaohongshu-mcp:基于 MCP 协议的小红书自动化开源方案,AI 驱动内容运营新范式
  • 网站改版好吗湖州做网站
  • OpenCV 特征检测与描述
  • 【开题答辩实录分享】以《基于微信小程序的糖尿病居家健康管理系统》为例进行答辩实录分享
  • Electron vue项目 打包 exe文件
  • 网站建设标准合同书360信息流广告平台
  • 网站的设计与制作阅读第2版市场调研报告范文
  • 动手学大模型:RLHF
  • Hexo博客搭建系列(三):在Hexo博客中配置Live2D看板娘教程