编程 cloudwego/eino:用 Go 写 LLM Agent,从 ChatModelAgent 到图编排与中断恢复

2026-09-07 21:33:38

cloudwego/eino:Go 生态写 LLM Agent,从 ChatModelAgent 到图编排与中断恢复

仓库: github.com/cloudwego/eino(Apache-2.0,Go 语言,要求 Go 1.18+;stars/tags 等实时数据以仓库页面为准)

Eino(读作 aino)是 cloudwego 用 Go 写的 LLM 应用开发框架。cloudwego 是字节跳动开源组织,旗下还有 Kitex、Hertz 等项目。框架设计参考 LangChain、Google ADK,目标是保持 Go 惯例:类型与接口显式,组件之间通过接口衔接,而不是靠字符串协议到处拼。

框架整体提供四块能力:

  • Components(组件层):ChatModel、Tool、Retriever、ChatTemplate 这类可复用构建块,官方实现在 eino-ext 中覆盖 OpenAI、Ollama、Claude、Gemini、Ark、Elasticsearch 等。
  • ADK(Agent 开发套件):工具调用、多智能体协调、上下文管理,以及带人类介入的中断/恢复,附带可直接使用的 agent 模式。
  • Composition(组合层):把组件连成图/工作流,可独立运行,也可以暴露成 agent 的一个工具。
  • Examples:常见模式与真实用例的可运行示例。

最小可用的 agent:ChatModelAgent

配置一个 ChatModel,可选挂上 tools,就是一个能跑的 agent:

chatModel, _ := openai.NewChatModel(ctx, &openai.ChatModelConfig{
    Model:  "gpt-4o",
    APIKey: os.Getenv("OPENAI_API_KEY"),
})

agent, _ := adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{
    Model: chatModel,
})

runner := adk.NewRunner(ctx, adk.RunnerConfig{Agent: agent})

iter := runner.Query(ctx, "Hello, who are you?")
for {
    event, ok := iter.Next()
    if !ok {
        break
    }
    fmt.Println(event.Message.Content)
}

给 agent 加工具时,在 ToolsConfig 里声明:

Tools: []tool.BaseTool{weatherTool, calculatorTool},

之后 agent 内部自行跑 ReAct 循环,自己决定什么时候调工具、什么时候给最终响应。这个层适合“单个模型 + 一组工具就能闭环”的对话任务;如果后面还要多步计划、多个角色分工,就该上 DeepAgent。

复杂任务:DeepAgent 拆解与派发

DeepAgent 面向的是更复杂的任务:先把问题拆成步骤,委派给子 agent 执行,再跟踪整体进度。可以协调多个专门的 agent,也可以让它跑 shell 命令、执行 Python、联网搜索。适合任务结构不确定、需要边推进边规划的场景;代价是执行过程不像固定流程图那样完全可预期。

图编排:用 Composition 固定流程

需要精确控制执行流时,用 compose 建图:

graph := compose.NewGraph[*Input, *Output]()

graph.AddLambdaNode("validate", validateFn)
graph.AddChatModelNode("generate", chatModel)
graph.AddLambdaNode("format", formatFn)

graph.AddEdge(compose.START, "validate")
graph.AddEdge("validate", "generate")
// ... 连接 format 节点与 END

runnable, _ := graph.Compile(ctx)
result, _ := runnable.Invoke(ctx, input)

这里的特点是流程阶段、节点依赖、输入输出类型都在图上固定下来,适合“流程确定”的管线,比如校验 → 生成 → 格式化;也适合给 LLM 造一个外部工具:通过 graphtool 包把整张图包成 agent 的 tool,让自治的 agent 去调用一段确定性的工作流:

graphtool.NewInvokableGraphTool(graph, "data_pipeline", "Process and validate data")

编排图越精确,行为越可预测,但它要求流程在运行前就能画清楚;流程本身需要“现想”的任务,放给 DeepAgent 更合适。

流式处理

框架在编排过程中自动处理节点间的数据流:拼接、装箱、合并、复制。组件只需要实现对自己有意义的流式范式,不需要自己维护上游到下游的搬运逻辑。上层拿到的 Runner/Stream 是迭代器接口,方便以流的方式消费 LLM 输出。

回调切面:固定点注入可观测性

框架在固定节点提供回调切面:OnStart、OnEnd、OnError、OnStartWithStreamInput、OnEndWithStreamOutput。日志、追踪、指标都挂在统一切点上,而不是散落在业务代码里。适合需要统一观测 agent 生命周期、并按阶段打点埋点的场景。

中断与恢复:human-in-the-loop

agent 或 tool 可以在任意位置暂停,等待人类输入,之后从检查点恢复继续执行。状态持久化与路由由框架处理。适合人工审批、需要澄清用户意图、或运行中要修正输入/工具结果的交互式任务,不需要业务自己维护暂停时的会话状态。

仓库划分与工程要求

框架按职责拆成几个部分:

  • eino 主仓:类型定义、流式机制、组件抽象、编排能力、agent 实现、切面机制。
  • eino-ext:组件实现、回调处理器、示例、评估器、prompt 优化器。
  • eino-devops:可视化开发与调试。
  • eino-examples:示例应用与最佳实践。

依赖要求是 Go 1.18 及以上。代码风格规定用 golangci-lint,导出符号需要带 GoDoc,格式走 gofmt -s,import 顺序固定为标准库 → 第三方 → 本地。

文档与相关仓库

复制全文 生成海报 Go LLM Agent cloudwego eino AI框架 langchain

推荐文章

程序员茄子在线接单