04. 编排篇:深入 Eino 框架
当你的 AI 应用不仅仅是“一问一答”,而是涉及“多步推理、工具调用、条件分支”时,你就需要编排 (Orchestration)。
1. 为什么需要编排框架?
硬写 if-else 调用 LLM 会导致代码极难维护。
- Chain (链): 线性流程 (A -> B -> C)。
- Graph (图): 复杂流程 (循环、分支、合并)。
在 Python 界有 LangGraph,而在 Go 界,字节跳动开源的 Eino 是最佳选择。
2. Eino 核心概念
Eino 提供了高度抽象的组件:
- Node: 节点(Prompt, Model, Tool, Lambda)。
- Edge: 边,定义数据流向。
- State: 全局状态,在节点间传递。
3. 实战:构建 ReAct Agent 工作流
我们用 Eino 的 Graph API 编排一个简单的 Agent:
- Input: 用户问题。
- Think: LLM 思考是否需要用工具。
- Act: 如果需要,执行工具;否则直接回答。
- Loop: 执行完工具后,将结果喂回给 LLM,继续思考。
go
// 伪代码演示 Eino Graph 构建
import "github.com/cloudwego/eino/compose"
func BuildAgentGraph() {
g := compose.NewGraph[State, State]()
// 1. 添加节点
g.AddNode("model_node", NewChatModelNode())
g.AddNode("tool_node", NewToolNode())
// 2. 定义分支逻辑 (Condition)
shouldCallTool := func(ctx context.Context, s State) (string, error) {
if s.LastMessage.FunctionCall != nil {
return "call_tool", nil
}
return "end", nil
}
// 3. 编排连线
g.AddEdge(compose.START, "model_node")
// 从 Model 出来,根据条件走不同分支
g.AddBranch("model_node", compose.NewBranch(shouldCallTool).
Add("call_tool", "tool_node").
Add("end", compose.END),
)
// 工具执行完,回到 Model 继续思考 (循环)
g.AddEdge("tool_node", "model_node")
// 4. 编译并运行
runner, _ := g.Compile(context.Background())
runner.Invoke(context.Background(), initialState)
}4. 多 Agent 协作 (Multi-Agent)
Eino 也支持多 Agent 模式,例如 Supervisor 模式:
- Supervisor (Manager): 负责派发任务。
- Coder Agent: 负责写代码。
- Reviewer Agent: 负责代码审查。
这本质上是一个更大的 Graph,每个 Node 本身可以是一个 SubGraph。
5. 进阶作业
- 阅读 Eino 官方文档,跑通官方的 "ReAct Agent" 示例。
- 尝试实现一个 "翻译 Agent",包含三个步骤:直译 -> 反思 -> 意译。
