Eino学习笔记 —— 附录3
Eino学习笔记 —— 附录三:Lambda 写法、调试工具与可视化
本笔记通过ai辅助生成,但对于代码阅读顺序应当没有问题(均使用eino官方的例子进行,个人认为官方的教程感觉有点太难懂了)
理论上个人感觉附录只做了解即可,需要时可进行查询
附录三:Lambda 写法、调试工具与可视化
📂 源码仓库:github.com/cloudwego/eino-examples↗
📖 系列文档:入门笔记 | Agentic 进阶 | 附录一 Flow | 附录二 组件 | 附录三 工具
📁 代码根目录:
components/lambda/、devops/📖 前置知识:Lambda 是 Compose 编排中最灵活的节点类型;调试和可视化是开发和排障的必备工具。
速览:三种工具的关系
开发阶段 生产阶段──────── ────────Lambda 写业务逻辑 ↓Graph/Chain 编排节点 ↓可视化(Mermaid) 调试(Devops)查看拓扑结构 图形界面测试 ↓确认结构无误 确认逻辑无误 ↓ 提交代码 → 生产运行📇 本附录速记卡片
Lambda 四种创建: InvokableLambda(fn) ← 最简 InvokableLambdaWithOption(fn) ← 需自定义参数 AnyLambda(invoke, stream, collect, transform) ← 全模式 ToList[T]() ← 类型转换 T→[]T
调试:devops.Init(ctx) → Chain/Graph.Compile → 图形界面测试可视化:NewMermaidGenerator(dir) → Compile(WithGraphCompileCallbacks(gen))一、Lambda 节点写法大全
📁
components/lambda/lambda.go📖 官方文档:https://www.cloudwego.io/zh/docs/eino/core_modules/components/lambda_guide/↗
1.1 Lambda 是什么
Lambda 是 Compose 编排中的”万能节点”——你可以把任意 Go 函数包装成 Graph/Chain 的一个节点:
Graph 内置节点:ChatModel、ToolsNode、ChatTemplate ← 框架提供Lambda 节点: 你写的任意函数 ← 你自己提供1.2 Lambda 决策树
你需要什么?│├─ 最简单:ctx+input → output│ └─→ compose.InvokableLambda(fn)│├─ 需要自定义参数│ └─→ compose.InvokableLambdaWithOption(fn)│├─ 需要流式处理(Stream/Transform)│ └─→ compose.AnyLambda(invoke, stream, collect, transform)│├─ 只做类型转换 T → []T│ └─→ compose.ToList[T]()│└─ 解析 ChatModel 返回的 JSON └─→ compose.MessageParser(parser)1.3 四种创建方式
方式一:InvokableLambda(最简)
lambda := compose.InvokableLambda( func(ctx context.Context, input string) (output string, err error) { return strings.ToUpper(input), nil },)方式二:InvokableLambdaWithOption(带自定义参数)
type Options struct { Field1 string }type MyOption func(*Options)
lambda := compose.InvokableLambdaWithOption( func(ctx context.Context, input string, opts ...MyOption) (output string, err error) { o := &Options{} for _, opt := range opts { opt(o) } return "", nil },)方式三:AnyLambda(全功能:Invoke/Stream/Collect/Transform)
lambda, _ := compose.AnyLambda( func(ctx context.Context, input string, opts ...MyOption) (output string, err error) { return "", nil }, func(ctx context.Context, input string, opts ...MyOption) (output *schema.StreamReader[string], err error) { return nil, nil }, func(ctx context.Context, input *schema.StreamReader[string], opts ...MyOption) (output string, err error) { return "", nil }, func(ctx context.Context, input *schema.StreamReader[string], opts ...MyOption) (output *schema.StreamReader[string], err error) { return nil, nil },)方式四:ToList(类型转换 Lambda)
// ChatModel 返回 *schema.Message,下游需要 []*schema.Message 时桥接chain.AppendLambda(compose.ToList[*schema.Message]())1.4 Lambda 在 Chain 和 Graph 中的使用
// Chainchain := compose.NewChain[string, string]()chain.AppendLambda( compose.InvokableLambda(func(ctx context.Context, input string) (string, error) { return input + " processed", nil }), compose.WithNodeName("step1"),)
// Graphgraph := compose.NewGraph[string, *MyStruct]()graph.AddLambdaNode("node1", compose.InvokableLambda(func(ctx context.Context, input string) (*MyStruct, error) { return &MyStruct{ID: 1}, nil }), compose.WithStatePreHandler(func(ctx context.Context, input string, state *myState) (string, error) { return input, nil // 节点执行前读写 State }),)1.5 特殊类型 Lambda:MessageParser
将 *schema.Message 的 Content(JSON 字符串)解析成 Go 结构体:
parser := schema.NewMessageJSONParser[*MyStruct](&schema.MessageJSONParseConfig{ ParseFrom: schema.MessageParseFromContent,})parserLambda := compose.MessageParser(parser)
chain := compose.NewChain[*schema.Message, *MyStruct]()chain.AppendLambda(parserLambda)二、Eino Devops 调试工具
📁
devops/debug/
2.1 启动调试服务
import ( "github.com/cloudwego/eino-ext/devops" "os/signal" "syscall")
func main() { err := devops.Init(ctx) // 1. 启动 HTTP 调试界面
chain.RegisterSimpleChain(ctx) // 2. 注册你的 Chain/Graph graph.RegisterSimpleGraph(ctx)
sigs := make(chan os.Signal, 1) // 3. 阻塞等待 signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) <-sigs}💡
devops.Init(ctx)只需调用一次。注册的 Chain/Graph 会出现在调试界面的下拉菜单中。
2.2 Any 类型输入的调试技巧
当 Graph 的输入类型是 map[string]any 时,需要附带类型标注:
{ "name": { "_value": "alice", "_eino_go_type": "string" }, "score": { "_value": "99", "_eino_go_type": "int" }}三、可视化工具:Mermaid 图表生成
📁
devops/visualize/mermaid.go
3.1 基础用法
import "github.com/cloudwego/eino-examples/devops/visualize"
gen := visualize.NewMermaidGenerator("output/dir") // 指定输出目录
runner, _ := g.Compile(context.Background(), compose.WithGraphCompileCallbacks(gen), compose.WithGraphName("MyGraph"),)输出文件:output/dir/MyGraph(Markdown)+ MyGraph.png(自动渲染的拓扑图)。
3.2 可视化规则
| 节点类型 | Mermaid 形状 |
|---|---|
| START / END | ([START]) ([END]) 圆角矩形 |
| 普通节点 | [节点名<br/>(组件类型)] 方框 |
| Lambda 节点 | (节点名<br/>(Lambda)) 圆角方框 |
| 嵌套子图 | subgraph ... end 子图框 |
| Branch 分支 | {"branch"} 菱形 |
3.3 图片生成策略
- 优先 mmdc(Mermaid CLI):
mmdc -i input.mmd -o output.png - 降级 chromedp:无头浏览器渲染 SVG → 截图保存为 PNG
四、Lambda 速查表
| 类型 | 创建函数 | 必备参数 | 常用选项 |
|---|---|---|---|
| 纯函数 Lambda | compose.InvokableLambda(fn) | fn | — |
| 带选项 Lambda | compose.InvokableLambdaWithOption(fn) | fn | 自定义 Option |
| 全模式 Lambda | compose.AnyLambda(invoke, stream, collect, transform) | 4 个函数 | 自定义 Option |
| 列表包装 | compose.ToList[T]() | —(泛型) | — |
| 消息解析 | compose.MessageParser(parser) | schema.MessageJSONParser | — |
常用 import 路径
// Lambda"github.com/cloudwego/eino/compose" // InvokableLambda, AnyLambda, ToList, MessageParser"github.com/cloudwego/eino/schema" // NewMessageJSONParser, MessageParseFromContent
// 调试"github.com/cloudwego/eino-ext/devops" // Init
// 可视化"github.com/cloudwego/eino-examples/devops/visualize" // NewMermaidGenerator全系列文档索引
| 文档 | 内容 | 定位 |
|---|---|---|
| 入门笔记 | ADK 入门 + Middleware + Interrupt + Compose 概览 | 🌱 入门 |
| Agentic 进阶 | AgenticModel / AgenticMessage / Typed 体系 / 截断重试 | 🌿 进阶 |
| 附录一:Flow 流程模块 | Flow 模块:ReAct / Multi-Agent / 状态图 / Manus / Deer-Go | 🌳 深度 |
| 附录二:Components 组件模块 | 组件模块:A/B 路由 / HTTP 日志 / 检索增强 / 文档解析 | 🔧 组件 |
| 附录三:Lambda 与调试工具 | Lambda 写法 / Devops 调试 / Mermaid 可视化 | 🛠️ 工具 |
📇 本附录速记卡片
Lambda: InvokableLambda(ctx+T→T)→ AppendLambda / AddLambdaNode调试: devops.Init → Compile → 图形界面测试可视化: NewMermaidGenerator → WithGraphCompileCallbacks → + .pngMessageParser: ChatModel JSON 输出 → Go 结构体(类型安全处理)📂 源码仓库:github.com/cloudwego/eino-examples↗
📖 继续阅读:
- 入门笔记 — Eino ADK 从 Hello World 到 Compose 编排
- Agentic 进阶 — Responses API / AgenticMessage / Typed 泛型
- 附录一:Flow 流程模块 — ReAct Agent / Multi-Agent / 状态图
- 附录二:Components 组件模块 — A/B 路由 / HTTP 日志 / 检索增强 / 文档解析
- 附录三:Lambda 与调试工具 — Lambda 写法 / Devops / Mermaid 可视化 ← 你在这里