前言:Eino框架的定位与价值
Eino是字节跳动开源的一款基于Golang的大模型应用开发框架,它结合了开源社区中多个优秀的LLM应用开发框架(如Langchain和LlamaIndex)的优点,提供了一个可扩展性强、可靠性高且符合Go语言编程习惯的LLM应用开发解决方案。在当今大模型技术迅猛发展的背景下,Eino框架的出现为Go语言开发者提供了强大的工具,使得构建基于大模型的智能应用变得更加高效和系统化。
Eino框架背靠字节跳动豆包、抖音等应用的丰富实践经验,拥有稳定的内核、灵活的扩展性和完善的工具生态。开发基于大模型的软件应用,就像指挥一支足球队:组件是能力各异的队员,编排是灵活多变的战术,数据是流转的足球。Eino框架让开发者即使初出茅庐,也能快速构建高质量的大模型应用。
本文将深入浅出地解析Eino框架的核心架构、关键组件和设计理念
一,Eino整体架构设计
- 基础组件层(components) :这是Eino框架的基石,包括与大模型交互的ChatModel 、与世界交互的Tool 、获取上下文的Retriever 、格式化输入的ChatTemplate等基础组件。这些组件定义了标准的接口和协议,确保各个模块可以无缝协作。
- 编排引擎层(flow+compose) :这是Eino最具特色的部分,它允许开发者将各个组件像搭积木一样组合起来。编排方式可以是简单的Chain(链式有向图),也可以是复杂的Graph(有向图或有向无环图),支持灵活的业务流程设计。
- 工具生态层 (EinoDev):Eino提供了丰富的开发工具和插件,如EinoDev插件支持可视化拖拽编排AI应用并生成代码,极大地提升了开发效率
- 扩展实现层 (EIno-Ext) :在基础组件接口的基础上,Eino提供了多种具体实现。例如ChatModel可以有OpenAI、Claude、Gemini、Ark、Ollama等多种实现;Tool组件包含Google Search、DuckDuckGo等具体工具。开发者可以根据需求选择合适的实现,也可以自定义实现。

二, Eino的核心组件和工作原理:
Eino框架将大模型应用开发过程中的各种功能抽象为标准化组件,这些组件如同足球队中不同位置的队员,各司其职又相互配合,组件是Eino的最小单元
以下是Eino中的核心组件分类及其功能:
ChatModel组件 :
这是与大模型交互的核心接口,定义了Generate(Invoke式输出) 和Stream(流式输出)等方法,用于输入Message上下文并获取模型输出。官方提供了多种实现,包括OpenAI、Claude、Gemini、Ark、Ollama。ChatModel组件支持绑定工具(BindTools),使模型能够调用外部功能。


Tool组件 :
代表与真实世界交互的能力,根据模型输出执行对应动作。例如Google Search、DuckDuckGo等搜索工具,以及各种API连接器。在Eino中,Tool通过标准化接口定义,可以轻松集成到应用流程中。


Retriever组件 (类似于知识库的概念):
负责获取相关上下文,让模型的输出基于高质量的事实。Eino支持Elastic Search、Volc VikingDB等多种检索器实现。Retriever在RAG(检索增强生成)架构中扮演关键角色。
且Retriever检索返回的文档使用Document结构体表示

数据处理组件 :
包括
- Document Loader(加载文本)组件:用于加载文档的组件。它的主要作用是从不同来源(如网络 URL、本地文件等)加载文档内容,并将其转换为标准的文档格式
- Document Transformer(按规则转化文本)组件:用于文档转换和处理的组件。它的主要作用是对输入的文档进行各种转换操作,如分割、过滤、合并等,从而得到满足特定需求的文档。这个组件可用于以下场景中:
- Indexer(存储文件并建立索引组件): 用于建立索引,便于文件的对应查询
这些组件构成了数据处理流水线,为模型提供结构化的输入。 对于Retriver和indexer的差异主要在于
维度 | Retriever | Indexer |
---|---|---|
主要职责 | 实时检索相关文档 | 构建和维护文档索引 |
操作类型 | 读操作 | 写操作 |
RAG阶段 | 查询检索阶段 | 索引构建阶段 |
性能关注点 | 低延迟检索 | 高吞吐索引 |
典型实现 | ElasticSearch, VikingDB | Redis向量索引, ElasticSearch |
配置重点 | TopK, 相似度阈值 | 向量模型, 存储后端 |
使用频率 | 每次查询都会调用 | 定期或数据变更时调用 |
Lambda组件 :
允许用户定制function,为应用添加特定业务逻辑。这提供了极大的灵活性,使开发者能够扩展框架功能。
三,组件编排模式
Eino的Agent编排基于"组件-节点-边"的范式构建:
- 组件(Component):代表具体功能单元,如ChatModel(聊天模型)、Tool(工具)等
- 节点(Node):在编排图中代表一个组件实例
- 边(Edge):表示节点间的数据流向
- 分支(Branch):实现条件逻辑流
这种设计使得Agent可以像足球队一样,由不同"位置"的组件协同工作,通过灵活的"战术"(编排)实现复杂功能
Chain(链式编排) :
最简单的编排方式,形成有向链式结构,数据单向流动。适合简单流程,如ChatTemplate→ChatModel的链式调用。优点是简单直观,缺点是不支持复杂分支。
css
chain, _ := NewChain[map[string]any, *Message]().
AppendChatTemplate(prompt).
AppendChatModel(model).
Compile(ctx)
chain.Invoke(ctx, map[string]any{"query": "what's your name?"})
Graph(图编排) :
提供最大灵活性,支持有向图和有向无环图(DAG)结构。节点代表组件,边代表数据。适合复杂业务逻辑,支持条件分支和并行执行。
go
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)
// 添加边和分支...
compiledGraph, err := graph.Compile(ctx)
out, err := compiledGraph.Invoke(ctx, map[string]any{"query":"Beijing's weather"})
Workflow(工作流编排):
scss
wf := NewWorkflow[[]*Message, *Message]()
wf.AddChatModelNode("model", model).AddInput(START)
wf.AddLambdaNode("l1", lambda1).AddInput("model", MapFields("Content", "Input"))
// 添加更多节点和映射...
runnable, _ := wf.Compile(ctx)
runnable.Invoke(ctx, []*Message{UserMessage("kick start this workflow!")})
支持字段级数据映射的有向无环图,最典型的像coze那种类似的工作流模式:
Eino的编排系统在背后自动处理了许多复杂问题:
- 类型检查:编译时确保节点输入输出类型匹配
- 流处理:自动处理流式数据的拼接、合并、复制和转啊魂
- 状态管理:安全地读写共享状态
- 切面注入:自动为不支持回调的组件注入回调逻辑
- 选项分配:灵活地将选项分配给特定节点或节点类型
四, Eino与MCP协议的集成
Eino框架与MCP(Model Context Protocol)协议有深度集成。MCP是由Anthropic推出的用于LLM应用和外部数据源或工具之间通信的标准协议,可以理解为AI应用程序的USB-C接口,它规范了应用程序应该按照什么样的格式为LLM提供上下
MCP协议采用创新的三层架构设计:
- 客户端:负责向MCP服务器发送请求,在Eino应用中通常作为主机程序的一部分
- 服务器:充当中介,将请求转发至相应资源
- 资源层:包括本地资源(如文件、数据库)和远程资源(如API)
在Eino框架中使用MCP的工作流程包括:
- 连接建立:客户端向服务器发起连接请求
- 请求传输:构造并发送请求消息
- 请求处理:服务器解析并执行操作(如数据库查询)
- 结果返回:服务器封装响应并回传
- 连接终止:任务完成后关闭连接
这种设计就像一个安保严密的图书馆:应用(客户端)不能直接访问资源,必须通过MCP服务器(图书管理员),它会检查权限并提供所需的数据
五,Callbacks机制
个人认为是Eino最为亮点的机制, 其为开发者提供了强大的横切面功能注入和中间状态透出能力。
解决的问题
Eino Callbacks 主要解决两大核心问题:
- 横切面功能注入:如日志记录(logging)、追踪(tracing)、指标统计(metrics)等与业务逻辑正交的功能需
- 中间状态透出:允许开发者获取组件执行过程中的内部信息,如 VikingDBRetriever 的查询 DB Name、ArkChatModel 的请求 temperature 参数
核心概念体系
Callbacks 机制围绕三个核心概念构建:
- 触发实体:包括 Component(官方组件和 Lambda)、Graph Node(及 Chain Node)、Graph 自身(及 Chain)
- 触发时机:定义了五种回调切面时机
- 回调处理器(Handler):开发者实现的处理函数,接收运行上下文、实体元信息和业务数据
c
const (
TimingOnStart // 进入并开始执行
TimingOnEnd // 成功完成即将 return
TimingOnError // 失败并即将 return err
TimingOnStartWithStreamInput // 输入是 StreamReader 的 OnStart
TimingOnEndWithStreamOutput // 输出是 StreamReader 的 OnEnd
)
用人话来讲,callback是提供了一种监控探头的机制,在某个节点执行的时候(无论是失败还是异常),都能帮你去进行人工的手动处理或者纠正(类似于React的机制)
六,总结
Eino大模型应用开发是一个融合多种技术的领域,需要开发者保持好奇心和学习热情,不断探索和实践。随着经验的积累,您将能够设计并实现越来越复杂的智能系统,推动人工智能技术的实际落地,创造真正的业务价值。