Eino框架基本概念及环境准备

📅 2026/7/9 1:48:31
Eino框架基本概念及环境准备
目录一、Eino 是什么二、核心概念2.1 八大原子组件2.2 三种编排模式2.3 流处理与回调三、环境准备3.1 前置条件3.2 项目初始化与依赖安装3.3 API Key 获取四、Hello Eino第一次调用大模型五、总结一、Eino 是什么Eino发音 /ˈaɪnoʊ/谐音I know是字节跳动 CloudWeGo 团队开源的Go 语言 LLM/AI 应用开发框架。它的定位不是又一个模型 SDK而是一套完整的AI 应用工程化基础设施——用 Go 原生的类型系统、并发模型和工程习惯把 ChatModel、Tool、Retriever、Document Loader 等原子能力组装成可测试、可观测、可部署的后端服务。核心能力一览能力说明组件抽象ChatModel、Tool、Retriever 等 8 种标准组件统一接口图编排用 Graph 串联组件形成 DAG支持分支、并行、循环流处理原生支持流式输出自动处理流的拼接、复制、合并回调机制OnStart / OnEnd / OnError 等钩子支持日志、追踪、监控类型安全编译时检查上下游输入输出类型Graph 在 Compile 阶段即发现类型不匹配ADKAgent Development Kit支持 ReAct、Plan-Execute、多 Agent 协作项目结构Eino 生态 ├── eino # 核心框架类型定义、组件抽象、编排引擎、流处理 ├── eino-ext # 扩展实现OpenAI/ARK/Ollama 等模型、Milvus/Redis 等检索器 ├── eino-devops # 开发工具可视化编排、调试面板 └── eino-examples # 示例仓库RAG、Agent、Multi-Agent 最佳实践二、核心概念2.1 八大原子组件Eino 将 AI 应用中的基础能力抽象为 8 种组件每种都是 Go 接口定义统一的输入、输出和选项类型组件职责核心方法ChatModel与大模型交互Generate / StreamChatTemplate将外部输入格式化为 PromptFormatTool执行外部动作搜索、计算、API 调用InvokableTool / StreamableToolRetriever从向量数据库检索相关上下文RetrieveDocument Loader加载并切分文档PDF、网页、MarkdownLoadEmbedding文本转向量Retriever 和 Indexer 的依赖EmbedStringsIndexer存储文档并建立索引StoreLambda将任意 Go 函数封装为组件自定义以 ChatModel 为例标准接口定义gotype BaseChatModel interface { Generate(ctx context.Context, input []*schema.Message, opts ...Option) (*schema.Message, error) Stream(ctx context.Context, input []*schema.Message, opts ...Option) (*schema.StreamReader[*schema.Message], error) }Generate 返回完整回复Stream 返回流式输出。这种双模式让同一组件既能用于后台批处理也能对接前端的 SSE 流式体验。2.2 三种编排模式Chain链式最简单的线性编排A → B → C适合固定流程gochain : compose.NewChain[Input, Output]() chain.AppendChatTemplate(template) chain.AppendChatModel(chatModel) compiled, _ : chain.Compile(ctx) result, _ : compiled.Invoke(ctx, input)Graph图式基于有向图的编排支持分支和并行是 Eino 编排层的核心gograph : compose.NewGraph[Input, Output]() graph.AddChatTemplateNode(prompt, template) graph.AddChatModelNode(model, chatModel) graph.AddToolsNode(tools, toolsNode) graph.AddEdge(compose.START, prompt) graph.AddEdge(prompt, model) // 条件分支模型输出包含 ToolCall → 执行工具 → 结果喂回模型 graph.AddBranch(model, compose.NewGraphBranch(func(ctx context.Context, in *schema.Message) (string, error) { if len(in.ToolCalls) 0 { return tools, nil } return compose.END, nil }, map[string]bool{tools: true, compose.END: true})) graph.AddEdge(tools, model) compiled, _ : graph.Compile(ctx)一个典型的 ReAct Agent 就是这样的循环结构模型输出 → 判断是否需要工具 → 调用工具 → 结果喂回模型 → 再次判断直到模型给出最终答案。Workflow工作流面向字段级别数据映射的编排适合跨组件复杂数据流转。2.3 流处理与回调Eino 内置流处理引擎自动处理 Stream 的复制、合并与类型转换。开发者不需要关心上游输出是流、下游只接受非流这类转换——框架自动装箱拆箱。回调机制是 Eino 的横切面能力在组件执行前后注入逻辑gohandler : callbacks.HandlerBuilder{}. OnStart(func(ctx context.Context, info *callbacks.RunInfo, input callbacks.CallbackInput) context.Context { log.Printf([%s] 开始执行, info.Name) return ctx }). OnEnd(func(ctx context.Context, info *callbacks.RunInfo, output callbacks.CallbackOutput) context.Context { log.Printf([%s] 执行完毕耗时: %v, info.Name, info.Duration) return ctx }). Build()同一个回调处理器可注入到 Graph 全局或单个节点实现全链路追踪和 Token 用量监控。三、环境准备3.1 前置条件环境项要求检查命令Go 版本1.18推荐 1.21go versionGit已安装git --version模型 API KeyARK / OpenAI / Ollama 三选一注册对应平台国内网络建议提前配置代理powershellgo env -w GOPROXYhttps://goproxy.cn,direct3.2 项目初始化与依赖安装powershellmkdir eino-tutorial cd eino-tutorial go mod init eino-tutorial # 核心框架 go get github.com/cloudwego/einolatest # 模型实现国内推荐火山引擎 ARK go get github.com/cloudwego/eino-ext/components/model/arklatest # 可选OpenAI # go get github.com/cloudwego/eino-ext/components/model/openai # 可选Ollama 本地模型 # go get github.com/cloudwego/eino-ext/components/model/ollama # .env 自动加载 go get github.com/joho/godotenvlatest go mod tidy若遇 kin-openapi 版本冲突在 go.mod 添加replace github.com/getkin/kin-openapi github.com/getkin/kin-openapi v0.118.03.3 API Key 获取三种接入方式ARK豆包国内推荐访问火山引擎控制台 → 创建推理接入点 → 获取 API Key。OpenAI在 platform.openai.com 创建 Key。Ollama 本地安装后执行 ollama pull qwen2.5:0.5b无需 Key。创建 .env 文件以 ARK 为例ARK_API_KEYyour-api-key-here ARK_MODEL_IDep-xxxxxxxx务必加入 .gitignore。四、Hello Eino第一次调用大模型创建 main.gogopackage main import ( context fmt log os github.com/cloudwego/eino-ext/components/model/ark github.com/cloudwego/eino/schema github.com/joho/godotenv ) func init() { godotenv.Load() } func main() { ctx : context.Background() chatModel, err : ark.NewChatModel(ctx, ark.ChatModelConfig{ APIKey: os.Getenv(ARK_API_KEY), Model: os.Getenv(ARK_MODEL_ID), }) if err ! nil { log.Fatalf(create model failed: %v, err) } messages : []*schema.Message{ schema.SystemMessage(你是Go语言专家回答简洁、技术准确。), schema.UserMessage(用一句话解释goroutine是什么。), } resp, err : chatModel.Generate(ctx, messages) if err ! nil { log.Fatalf(generate failed: %v, err) } fmt.Println(resp.Content) }运行powershellgo run main.go流式输出版本——将 Generate 替换为 Streamgostream, _ : chatModel.Stream(ctx, messages) defer stream.Close() for { chunk, err : stream.Recv() if err ! nil { break } fmt.Print(chunk.Content) // 逐字输出 }三层信息流SystemMessage 定义角色行为、UserMessage 携带用户输入、Generate 返回模型回复或 Stream 逐字推送——从安装到首次调用不超过 10 分钟。五、总结维度要点定位Go 原生 LLM 应用框架非模型 SDK组件ChatModel / Tool / Retriever 等 8 种编译时类型检查编排Chain → Graph分支/循环→ Workflow逐级增强流处理内置引擎自动处理 Stream ↔ 非 Stream 互转回调OnStart / OnEnd / OnError 注入全链路可观测安装go get github.com/cloudwego/eino 一行模型原生支持 ARK / OpenAI / Ollama对已在使用 Go 做后端的团队Eino 让 LLM 像数据库驱动一样自然融入 Go 微服务体系——无需维护 Python 服务不用跨语言 RPC编译时类型检查杜绝运行时错误。这是 Eino 与 LangChain 最本质的区别前者面向工程落地后者面向原型验证。