English | 中文
Eino['aino](谐音 “I know”)旨在成为用 Go 语言编写的终极大型语言模型(LLM)应用开发框架。它从开源社区中的诸多优秀 LLM 应用开发框架,如 LangChain 和 LlamaIndex 等获取灵感,同时借鉴前沿研究成果与实际应用,提供了一个强调简洁性、可扩展性、可靠性与有效性,且更符合 Go 语言编程惯例的 LLM 应用开发框架。
Eino 提供的价值如下:
借助上述能力和工具,Eino 能够在人工智能应用开发生命周期的不同阶段实现标准化、简化操作并提高效率:

直接使用组件:
model, _ := openai.NewChatModel(ctx, config) // create an invokable LLM instance
message, _ := model.Generate(ctx, []*Message{
SystemMessage("you are a helpful assistant."),
UserMessage("what does the future AI App look like?")})
当然,你可以这样用,Eino 提供了许多开箱即用的有用组件。但通过使用编排功能,你能实现更多,原因有三:
Eino 提供了两组用于编排的 API:
| API | 特性和使用场景 |
|---|---|
| Chain | 简单的链式有向图,只能向前推进。 |
| Graph | 循环或非循环有向图。功能强大且灵活。 |
我们来创建一个简单的 chain: 一个模版(ChatTemplate)接一个大模型(ChatModel)。

chain, _ := NewChain[map[string]any, *Message]().
AppendChatTemplate(prompt).
AppendChatModel(model).
Compile(ctx)
chain.Invoke(ctx, map[string]any{"query": "what's your name?"})
现在,我们来创建一个 Graph,先用一个 ChatModel 生成回复或者 Tool 调用指令,如生成了 Tool 调用指令,就用一个 ToolsNode 执行这些 Tool。

graph := NewGraph[map[string]any, *schema.Message]()
_ = graph.AddChatTemplateNode("node_template", chatTpl)
_ = graph.AddChatModelNode("node_model", chatModel)
_ = graph.AddToolsNode("node_tools", toolsNode)
_ = graph.AddLambdaNode("node_converter", takeOne)
_ = graph.AddEdge(START, "node_template")
_ = graph.AddEdge("node_template", "node_model")
_ = graph.AddBranch("node_model", branch)
_ = graph.AddEdge("node_tools", "node_converter")
_ = graph.AddEdge("node_converter", END)
compiledGraph, err := graph.Compile(ctx)
if err != nil {
return err
}
out, err := r.Invoke(ctx, map[string]any{"query":"Beijing's weather this weekend"})
现在,咱们来创建一个 “ReAct” 智能体:一个 ChatModel 绑定了一些 Tool。它接收输入的消息,自主判断是调用 Tool 还是输出最终结果。Tool 的执行结果会再次成为聊天模型的输入消息,并作为下一轮自主判断的上下文。

我们在 Eino 的 flow 包中提供了开箱即用的 ReAct 智能体的完整实现。代码参见: flow/agent/react
我们的 ReAct 智能体实现完全基于 Eino 的编排能力。通过使用 Eino 编排,我们可以自动获得如下能力:
例如,你可以轻松地通过回调扩展已编译的图:
handler := NewHandlerBuilder().
OnStartFn(
func(ctx context.Context, info *RunInfo, input CallbackInput) context.Context) {
log.Infof("onStart, runInfo: %v, input: %v", info, input)
}).
OnEndFn(
func(ctx context.Context, info *RunInfo, output CallbackOutput) context.Context) {
log.Infof("onEnd, runInfo: %v, out: %v", info, output)
}).
Build()
compiledGraph.Invoke(ctx, input, WithCallbacks(handler))
或者你可以轻松地为不同节点分配选项:
// assign to All nodes
compiledGraph.Invoke(ctx, input, WithCallbacks(handler))
// assign only to ChatModel nodes
compiledGraph.Invoke(ctx, input, WithChatModelOption(WithTemperature(0.5))
// assign only to node_1
compiledGraph.Invoke(ctx, input, WithCallbacks(handler).DesignateNode("node_1"))
| 流处理范式 | 解释 |
|---|---|
| Invoke | 接收非流类型 I ,返回非流类型 O |
| Stream | 接收非流类型 I , 返回流类型 StreamReader[O] |
| Collect | 接收流类型 StreamReader[I] , 返回非流类型 O |
| Transform | 接收流类型 StreamReader[I] , 返回流类型 StreamReader[O] |

Eino 框架由几个部分组成:
针对 Eino 的学习和使用,我们提供了完善的 Eino用户手册,帮助大家快速理解 Eino 中的概念,掌握基于 Eino 开发设计 AI 应用的技能,赶快通过Eino 用户手册尝试使用吧~。
若想快速上手,了解 通过 Eino 构建 AI 应用的过程,推荐先阅读Eino: 快速开始
如果你在该项目中发现潜在的安全问题,或你认为可能发现了安全问题,请通过我们的安全中心 或漏洞报告邮箱通知字节跳动安全团队。
请不要创建公开的 GitHub Issue。

本项目依据 Apache-2.0 许可证 授权。