
test
测试 (cè shì)
cloudwego
README
Eino
English | 中文
概述
Eino['aino] (发音类似于 "I know") 旨在成为 Golang 中终极的 LLM 应用开发框架。从开源社区中许多优秀的 LLM 应用开发框架(如 LangChain & LlamaIndex 等)汲取灵感,并学习前沿研究和实际应用,Eino 提供了一个 LLM 应用开发框架,该框架强调简单性、可扩展性、可靠性和有效性,更符合 Golang 编程规范。
Eino 提供以下内容:
- 一份精心策划的组件抽象和实现列表,可以轻松重用和组合以构建 LLM 应用程序
- 一个强大的组合框架,为用户完成繁重的强类型检查、流处理、并发管理、切面注入、选项分配等工作。
- 一组精心设计的 API,专注于简洁和清晰。
- 以捆绑的流程和示例形式呈现的不断增长的最佳实践集合。
- 一套有用的工具,涵盖整个开发周期,从可视化开发和调试到在线跟踪和评估。
借助上述武器库,Eino 可以标准化、简化和提高 AI 应用程序开发周期不同阶段的效率:
快速入门
直接使用组件:
model, _ := openai.NewChatModel(ctx, config) // 创建一个可调用的 LLM 实例
message, _ := model.Generate(ctx, []*Message{
SystemMessage("你是一个乐于助人的助手。"),
UserMessage("未来 AI 应用是什么样的?")})
当然,你可以这样做,Eino 提供了许多有用的组件供你开箱即用。但是,通过使用编排可以做更多的事情,原因有三:
- 编排封装了 LLM 应用程序的常见模式。
- 编排解决了 LLM 处理流响应的难题。
- 编排为你处理类型安全、并发管理、切面注入和选项分配。
Eino 提供了两组用于编排的 API
API | 特点和用法 |
---|---|
Chain | 简单的链式有向图,只能向前。 |
Graph | 循环或非循环有向图。强大而灵活。 |
让我们创建一个简单的链:一个 ChatTemplate 后面跟着一个 ChatModel。
chain, _ := NewChain[map[string]any, *Message]().
AppendChatTemplate(prompt).
AppendChatModel(model).
Compile(ctx)
chain.Invoke(ctx, map[string]any{"query": "你叫什么名字?"})
现在让我们创建一个图,该图使用 ChatModel 生成答案或工具调用,然后使用 ToolsNode 在需要时执行这些工具。
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":"北京这个周末的天气"})
现在让我们创建一个“ReAct”代理:一个 ChatModel 绑定到 Tools。它接收输入消息并独立决定是调用 Tool 还是输出最终结果。Tool 的执行结果将再次成为 ChatModel 的输入消息,并作为下一轮独立判断的上下文。
我们在 flow
包中提供了一个完整的 ReAct Agent 实现。在此处查看代码:flow/agent/react
我们对 ReAct Agent 的实现专门使用 Eino 的图编排,它提供了以下开箱即用的好处:
- 类型检查:它确保两个节点的输入和输出类型在编译时匹配。
- 流处理:如果需要,在传递给 chatModel 和 toolsNode 之前连接消息流,并将流复制到回调处理程序中。
- 并发管理:共享状态可以安全地读取和写入,因为 StatePreHandler 是并发安全的。
- 切面注入:如果在指定的 ChatModel 实现尚未自行注入的情况下,在 ChatModel 执行前后注入回调切面。
- 选项分配:调用选项可以全局分配,也可以分配给特定组件类型或特定节点。
例如,你可以轻松地使用回调扩展已编译的图:
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))
或者你可以轻松地将选项分配给不同的节点:
// 分配给所有节点
compiledGraph.Invoke(ctx, input, WithCallbacks(handler))
// 仅分配给 ChatModel 节点
compiledGraph.Invoke(ctx, input, WithChatModelOption(WithTemperature(0.5))
// 仅分配给 node_1
compiledGraph.Invoke(ctx, input, WithCallbacks(handler).DesignateNode("node_1"))
主要特性
丰富的组件
-
将通用构建块封装到组件抽象中,每个抽象都有多个组件实现,可以开箱即用。
- 组件抽象,例如 ChatModel、Tool、ChatTemplate、Retriever、Document Loader、Lambda 等。
- 每种组件类型都有自己的接口:定义了输入和输出类型,定义了选项类型,以及有意义的流式范例。
- 实现是透明的。在编排组件时,你只需要关心抽象。
-
实现可以嵌套并捕获复杂的业务逻辑。
- ReAct Agent、MultiQueryRetriever、Host MultiAgent 等。它们由多个组件和重要的业务逻辑组成。
- 它们从外部仍然是透明的。MultiQueryRetriever 可以在任何接受 Retriever 的地方使用。
强大的编排
- 数据从 Retriever / Document Loaders / ChatTemplate 流向 ChatModel,然后流向 Tools 并解析为 Final Answer。这种通过多个组件定向、受控的数据流可以通过图编排来实现。
- 组件实例是图节点,边是数据流通道。
- 图编排足够强大和灵活,可以实现复杂的业务逻辑:
- 类型检查、流处理、并发管理、切面注入和选项分配由框架处理。
- 在运行时分支执行,读取和写入全局状态,或使用工作流(目前处于 alpha 阶段)进行字段级别的数据映射。
完整的流处理
- 流处理非常重要,因为 ChatModel 会在实时生成消息时输出消息块。对于编排来说尤其重要,因为更多组件需要处理流数据。
- Eino 会自动连接流块,以便下游节点仅接受非流输入,例如 ToolsNode。
- 当图执行期间需要流时,Eino 会自动将非流装箱到流中。
- 当多个流汇聚到单个向下节点时,Eino 会自动合并它们。
- 当流扇出到不同的向下节点或传递给回调处理程序时,Eino 会自动复制流。
- 编排元素(例如分支和状态处理程序)也具有流感知能力。
- 借助这些流处理能力,组件本身的流式范例对用户变得透明。
- 编译后的图可以使用 4 种不同的流式范例运行:
流式范例 | 说明 |
---|---|
Invoke | 接受非流类型 I 并返回非流类型 O |
Stream | 接受非流类型 I 并返回流类型 StreamReader[O] |
Collect | 接受流类型 StreamReader[I] 并返回非流类型 O |
Transform | 接受流类型 StreamReader[I] 并返回流类型 StreamReader[O] |
高度可扩展的切面(回调)
- 切面处理诸如日志记录、跟踪、指标等横切关注点,以及公开组件实现的内部细节。
- 支持五个切面:OnStart、OnEnd、OnError、OnStartWithStreamInput、OnEndWithStreamOutput。
- 开发人员可以轻松创建自定义回调处理程序,通过选项在图运行时添加它们,并且它们将在图运行时被调用。
- 图还可以将切面注入到那些不支持自身回调的组件实现中。
Eino 框架结构
Eino 框架由几个部分组成:
-
Eino(此仓库):包含 Eino 的类型定义、流机制、组件抽象、编排能力、切面机制等。
-
EinoExt:组件实现、回调处理程序实现、组件使用示例以及各种工具,例如评估器、提示优化器。
-
Eino Devops:可视化开发、可视化调试等。
-
EinoExamples 是包含 Eino 示例应用程序和最佳实践的仓库。
详细文档
为了学习和使用 Eino,我们提供了全面的 Eino 用户手册,以帮助你快速理解 Eino 中的概念并掌握基于 Eino 开发 AI 应用程序的技能。立即通过 Eino 用户手册 开始探索!
要快速了解如何使用 Eino 构建 AI 应用程序,我们建议从 Eino:快速入门 开始
依赖项
- Go 1.18 及以上版本。
- Eino 依赖于 kin-openapi 的 OpenAPI JSONSchema 实现。为了保持与 Go 1.18 的兼容性,我们已将 kin-openapi 的版本固定为 v0.118.0。
安全
如果你在此项目中发现潜在的安全问题,或者认为你可能发现了安全问题,我们要求你通过我们的 安全中心 或 漏洞报告电子邮件 通知 Bytedance Security。
请不要创建公共 GitHub 问题。
联系我们
<img src=".github/static/img/eino/lark_group_zh.png" alt="LarkGroup" width="200"/>
许可证
本项目采用 Apache-2.0 许可证。
推荐服务器
Crypto Price & Market Analysis MCP Server
一个模型上下文协议 (MCP) 服务器,它使用 CoinCap API 提供全面的加密货币分析。该服务器通过一个易于使用的界面提供实时价格数据、市场分析和历史趋势。 (Alternative, slightly more formal and technical translation): 一个模型上下文协议 (MCP) 服务器,利用 CoinCap API 提供全面的加密货币分析服务。该服务器通过用户友好的界面,提供实时价格数据、市场分析以及历史趋势数据。
MCP PubMed Search
用于搜索 PubMed 的服务器(PubMed 是一个免费的在线数据库,用户可以在其中搜索生物医学和生命科学文献)。 我是在 MCP 发布当天创建的,但当时正在度假。 我看到有人在您的数据库中发布了类似的服务器,但还是决定发布我的服务器。
mixpanel
连接到您的 Mixpanel 数据。 从 Mixpanel 分析查询事件、留存和漏斗数据。

Sequential Thinking MCP Server
这个服务器通过将复杂问题分解为顺序步骤来促进结构化的问题解决,支持修订,并通过完整的 MCP 集成来实现多条解决方案路径。

Nefino MCP Server
为大型语言模型提供访问德国可再生能源项目新闻和信息的能力,允许按地点、主题(太阳能、风能、氢能)和日期范围进行筛选。
Vectorize
将 MCP 服务器向量化以实现高级检索、私有深度研究、Anything-to-Markdown 文件提取和文本分块。
Mathematica Documentation MCP server
一个服务器,通过 FastMCP 提供对 Mathematica 文档的访问,使用户能够从 Wolfram Mathematica 检索函数文档和列出软件包符号。
kb-mcp-server
一个 MCP 服务器,旨在实现便携性、本地化、简易性和便利性,以支持对 txtai “all in one” 嵌入数据库进行基于语义/图的检索。任何 tar.gz 格式的 txtai 嵌入数据库都可以被加载。
Research MCP Server
这个服务器用作 MCP 服务器,与 Notion 交互以检索和创建调查数据,并与 Claude Desktop Client 集成以进行和审查调查。

Cryo MCP Server
一个API服务器,实现了模型补全协议(MCP),用于Cryo区块链数据提取,允许用户通过任何兼容MCP的客户端查询以太坊区块链数据。