综合介绍
Eino 是 CloudWeGo 团队推出的一款基于 Golang 的开源框架,旨在成为大模型(LLM)应用的终极开发工具。它汲取了 LangChain 和 LlamaIndex 等开源框架的优秀设计,结合前沿研究成果和字节跳动内部实践经验,提供了简洁、可扩展、高效的开发体验。Eino 通过精心设计的组件抽象、强大的编排能力、完整的流式处理支持以及类型安全的特性,帮助开发者快速构建可靠的 AI 应用。已在字节跳动内部(如抖音、豆包)广泛应用,现开源至 GitHub,代码覆盖率高,社区活跃,致力于推动 Golang 生态的 AI 开发标准化和效率提升。
功能列表
- 丰富的组件抽象:提供 ChatModel、Tool、ChatTemplate 等可复用组件,支持嵌套和复杂逻辑封装。
- 强大的编排能力:支持 Chain 和 Graph 两种模式,处理类型检查、并发管理和数据流编排。
- 完整的流式处理:自动处理流数据的拼接、拆分、合并和复制,适配多种流式范式。
- 高扩展性切面:内置回调机制,支持日志、追踪等横切关注点的注入。
- 类型安全:利用 Golang 编译时检查,确保输入输出匹配。
- 开发工具集:提供可视化调试、评估器等,覆盖开发全周期。
- 最佳实践示例:内置 ReAct Agent 等流程实现,附带丰富示例代码。
使用帮助
安装流程
Eino 是一个 Golang 框架,安装需准备 Go 环境。以下是详细步骤:
- 安装 Go
- 访问 Go 官网 下载 1.18 或以上版本。
- 安装完成后,运行
go version
检查版本(如go1.21.0
)。
- 拉取 Eino 核心库
- 在终端运行:
go get github.com/cloudwego/eino@latest
- 若需扩展组件(如 OpenAI 支持),运行:
go get github.com/cloudwego/eino-ext@latest
- 在终端运行:
- 验证安装
- 创建文件
main.go
:package main import "github.com/cloudwego/eino" func main() { println("Eino installed successfully!") }
- 执行
go run main.go
,输出成功即完成。
- 创建文件
- 依赖说明
- Eino 依赖 kin-openapi 的 v0.118.0 版本以兼容 Go 1.18。
- 可选:EinoExt 提供更多组件实现。
- 社区支持
- 访问 GitHub Issues 提交问题或加入飞书用户群(见官方页面二维码)。
主要功能操作流程
1. 直接使用 ChatModel
ChatModel 是基础组件,用于调用大模型生成内容。
- 代码示例
package main import ( "context" "github.com/cloudwego/eino-ext/components/model/openai" "github.com/cloudwego/eino/schema" ) func main() { ctx := context.Background() config := &openai.Config{APIKey: "你的OpenAI-API-Key"} model, err := openai.NewChatModel(ctx, config) if err != nil { panic(err) } messages := []*schema.Message{ {Role: schema.System, Content: "你是一个助手。"}, {Role: schema.User, Content: "未来AI应用是什么样?"}, } msg, err := model.Generate(ctx, messages) if err != nil { panic(err) } println(msg.Content) }
- 操作说明
- 用
NewChatModel
初始化模型实例,传入上下文和 API 配置。 - 调用
Generate
方法生成非流式输出。 - 可通过扩展组件支持其他模型(如 LLaMA)。
- 用
2. 使用 Chain 编排简单流程
Chain 适合线性流程,如模板+模型。
- 代码示例
package main import ( "context" "github.com/cloudwego/eino" "github.com/cloudwego/eino-ext/components/model/openai" ) func main() { ctx := context.Background() model, _ := openai.NewChatModel(ctx, &openai.Config{APIKey: "你的API-Key"}) prompt := eino.NewChatTemplate("你好,我的名字是{{.name}}") chain, _ := eino.NewChain[map[string]any, *eino.Message](). AppendChatTemplate(prompt). AppendChatModel(model). Compile(ctx) result, _ := chain.Invoke(ctx, map[string]any{"name": "Eino"}) println(result.Content) }
- 操作说明
NewChain
定义输入输出类型,Append
添加节点。Compile
编译链条,Invoke
执行并返回结果。- 适合简单的前后顺序任务。
3. 使用 Graph 实现复杂编排
Graph 支持循环或非循环的有向图,适合工具调用等场景。
- 代码示例
package main import ( "context" "github.com/cloudwego/eino" "github.com/cloudwego/eino-ext/components/model/openai" "github.com/cloudwego/eino/schema" ) func main() { ctx := context.Background() model, _ := openai.NewChatModel(ctx, &openai.Config{APIKey: "你的API-Key"}) graph := eino.NewGraph[map[string]any, *schema.Message]() graph.AddChatModelNode("model", model) graph.AddEdge(eino.START, "model") graph.AddEdge("model", eino.END) runnable, _ := graph.Compile(ctx) result, _ := runnable.Invoke(ctx, map[string]any{"query": "你好,世界!"}) println(result.Content) }
- 操作说明
Add*Node
添加节点,AddEdge
定义数据流向。- 支持分支(
AddBranch
)和工具调用。 Stream
可替换Invoke
获取流式输出。
4. 配置流式处理
Eino 提供四种流式范式:Invoke、Stream、Collect、Transform。
- 流式输出示例
stream, _ := runnable.Stream(ctx, map[string]any{"query": "你好,世界!"}) for chunk := range stream { if chunk.Err != nil { panic(chunk.Err) } print(chunk.Value.Content) }
- 功能解析
- Eino 自动处理流的拼接(如给非流节点)和拆分(如分支时复制)。
- 下游节点无需关心上游流状态,框架透明处理。
5. 添加回调机制
回调用于日志、追踪等扩展。
- 代码示例
handler := eino.NewHandlerBuilder(). OnStartFn(func(ctx context.Context, info *eino.RunInfo, input eino.CallbackInput) context.Context { println("开始:", info.NodeID) return ctx }).Build() result, _ := runnable.Invoke(ctx, map[string]any{"query": "测试"}, eino.WithCallbacks(handler))
- 操作要点
- 支持
OnStart
、OnEnd
等五种切面。 - 可通过
WithCallbacks
指定节点或全局生效。
- 支持
特色功能操作
1. ReAct Agent
- 功能说明
ReAct Agent 结合 ChatModel 和工具调用,实现自主决策循环。 - 操作步骤
- 参考 react.go。
- 运行示例:配置模型和工具,调用
Invoke
执行。
2. 可视化调试
- 功能说明
通过 Eino Devops 提供 UI 调试。 - 操作步骤
- 拉取
eino-ext
仓库,运行devops
模块,查看文档配置。
- 拉取