Go 语言开发 AI 智能体实战:字节开源 Eino 框架详解与教程
基于大模型构建应用,本质上是在编排能力各异的组件。Eino 是字节跳动开源的大模型应用开发框架,提供稳定的内核、灵活的扩展性以及完善的工具生态。它支持 Go 开发者快速搭建从简单对话到复杂 Agent 的各种场景。
核心概念
组件抽象与实现
Eino 应用由功能各异的组件构成。每个组件都定义了固定的输入输出类型、Option 类型和方法签名。实际运行时,我们需要具体的组件实现。
type ChatModel interface {
Invoke(ctx context.Context, input *schema.Message) (*schema.Message, error)
Stream(ctx context.Context, input *schema.Message) (StreamReader[*schema.Message], error)
}
就像足球队先决定上什么位置的角色,再挑选具体球员一样,开发时先选择组件抽象,再确定具体实现。组件可以像普通 Go Interface 一样单独使用,但发挥 Eino 威力需要多个组件协同编排。
编排模式
在 Eino 中,组件成为'节点',流转关系成为'边'或'分支'。根据业务形态,主要有两种编排方式:
Chain(链式) 适用于简单的顺序处理,例如 Prompt + Model。
chain, _ := NewChain[map[string]any, *Message]().
AppendChatTemplate(prompt).
AppendChatModel(model).
Compile(ctx)
out, err := chain.Invoke(ctx, map[string]any{"query": "what's your name?"})
Graph(图结构) 适用于复杂的决策流程,如 ReAct Agent。支持条件分支和循环。
g := NewGraph[map[string]any, *schema.Message]()
_ = g.AddChatTemplateNode("node_template", chatTpl)
_ = g.AddChatModelNode("node_model", chatModel)
_ = g.AddToolsNode("node_tools", toolsNode)
_ = g.AddLambdaNode("node_converter", takeOne)
_ = g.AddEdge(START, "node_template")
_ = g.AddEdge("node_template", "node_model")
_ = g.AddBranch("node_model", branch)
_ = g.AddEdge("node_tools", "node_converter")
_ = g.AddEdge("node_converter", END)
compiledGraph, err := g.Compile(ctx)
if err != { err }
out, err := compiledGraph.Invoke(ctx, []any{: })


