Skip to content

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:

  1. Input: 用户问题。
  2. Think: LLM 思考是否需要用工具。
  3. Act: 如果需要,执行工具;否则直接回答。
  4. 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. 进阶作业

  1. 阅读 Eino 官方文档,跑通官方的 "ReAct Agent" 示例。
  2. 尝试实现一个 "翻译 Agent",包含三个步骤:直译 -> 反思 -> 意译。

最后一次更新于:

🚀 学习遇到瓶颈?想进大厂?

看完这篇技术文章,如果还是觉得不够系统,或者想在实战中快速提升?
王中阳的就业陪跑训练营,提供定制化学习路线 + 企业级实战项目 + 简历优化 + 模拟面试。

了解训练营详情