news 2026/6/15 19:35:52

ChatModel 30行Go代码搞定大模型,Eino组件体系带你构建AI Agent(收藏版)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ChatModel 30行Go代码搞定大模型,Eino组件体系带你构建AI Agent(收藏版)

本文介绍了如何使用Eino组件体系构建AI Agent。核心组件包括ChatModel(大脑)、Tool(手)、Retriever(知识库)、ChatTemplate(格式化)、Embedding(向量化)和Document Loader(文档加载)。重点讲解了ChatModel、Tool、Chain和Graph的编排方式,以及流式处理和Callbacks功能。通过Eino,开发者可以轻松构建具备查资料、调接口、执行命令等能力的AI Agent。

昨天跑通了 ChatModel,30 行 Go 代码就让大模型说话了。但光会聊天不算 Agent——真正的 Agent 要能查资料、调接口、执行命令。

今天把 Eino 的组件体系和编排能力掰开讲清楚。这部分是 AI Agent 的骨架。


先看组件全景

Eino 里有几类核心组件,每个都对应 AI Agent 的一项基础能力:

六类核心组件协作关系

六类组件各司其职:

组件一句话解释典型场景
ChatModel大模型的大脑,负责理解+生成对话、摘要、翻译
Tool能动手干活的"手"查天气、调API、搜网页
Retriever从知识库找资料企业文档问答
ChatTemplate把输入格式化成Prompt系统提示+用户问题拼接
Embedding把文字转成向量语义搜索前置
Document Loader加载各种格式文档读取PDF/Markdown

核心组件逐个看

ChatModel:所有 AI Agent 的大脑

ChatModel 的核心接口:

type ChatModel 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) BindTools(tools []*schema.ToolInfo) error }

别被三个方法吓到,搞清楚每个的用途就行:

  • Generate:非流式,一次性拿到完整结果
  • Stream:流式,逐字输出,做聊天界面用这个
  • BindTools:告诉模型"你可以用这些工具",模型答不上来的时候会主动说要调哪个工具

关键理解:BindTools 不是让模型执行工具,只是让模型"知道"有这些工具。真正执行在 ToolsNode 里。


ChatTemplate:把杂乱的输入转成标准 Prompt

用户输入千奇百怪,ChatTemplate 负责格式化——把用户问题 + 角色设定 + 历史对话拼成一组标准 Message:

template := prompt.FromMessages(schema.FString, schema.SystemMessage("你是一个{{.role}},请用{{.style}}的风格回答。"), schema.UserMessage("{{.question}}"), ) msgs, _ := template.Format(ctx, map[string]any{ "role": "Go语言专家", "style": "简洁", "question": "goroutine 和线程有什么区别?", })

输出自动变成了:

SystemMessage: "你是一个Go语言专家,请用简洁的风格回答。" UserMessage: "goroutine 和线程有什么区别?"

Tool:给 Agent 装上一双能干活的手

Tool 是 Agent"动手"的能力。模型说"我需要查天气",Tool 就去调天气 API。

定义一个 Tool 只需要实现两个方法:

type WeatherTool struct{} // Info 告诉模型:我是什么、需要什么参数 func (t *WeatherTool) Info(ctx context.Context) (*schema.ToolInfo, error) { return &schema.ToolInfo{ Name: "get_weather", Desc: "获取指定城市的天气信息", ParamsOneOf: schema.NewParamsOneOfByParams(map[string]*schema.ParameterInfo{ "city": {Type: "string", Desc: "城市名称", Required: true}, }), nil } // InvokableRun 模型决定调用时,真正执行的逻辑 func (t *WeatherTool) InvokableRun(ctx context.Context, args string, opts ...tool.Option) (string, error) { // 实际调天气 API return "北京今天晴,22-30°C", nil }

Info 里的参数定义会被转换成 JSON Schema,模型看到后自己决定什么时候调、传什么参数。

整个过程用时序图看更清楚:

Tool 调用时序

关键点:ChatModel 不执行工具,它只负责"决定调哪个工具"。真正的执行发生在 Tool 里。 这个分离让模型和工具各司其职,互不干扰。


Retriever:让 Agent 能"查资料"

ChatModel 的知识截止到训练日期。Retriever 负责从外部知识库检索相关内容,拼到 Prompt 里:

RAG 检索流程

使用 Retriever 之前需要先建好索引(这部分 Day 3 会完整演示)。


Chain 和 Graph:两种编排方式怎么选

组件有了,问题变成:怎么让它们按正确顺序串起来?

Eino 给了两种编排方式。选型的判断标准是这样的:

编排方式怎么选

Chain:简单线性场景

组件一个接一个,数据单向流动:

Chain:简单线性链路

代码就是逐行 Append:

chain := NewChain[map[string]any, *schema.Message](). AppendChatTemplate(template). // 第1步:拼 Prompt AppendChatModel(model). // 第2步:调模型 Compile(ctx) resp, _ := chain.Invoke(ctx, map[string]any{ "question": "解释一下 goroutine", })

Chain 自动处理了 template.Format() → model.Generate() 的完整流程。

Graph:处理分支和循环

真实 Agent 不可能是直线。模型调了工具,结果要传回来再分析——这是循环。

Graph:分支与循环

这就是 ReAct Agent 的核心循环。代码上用 Graph 来表示:

graph := NewGraph[map[string]any, *schema.Message]() // 添加节点 graph.AddChatTemplateNode("template", chatTpl) graph.AddChatModelNode("model", chatModel) graph.AddToolsNode("tools", toolsNode) graph.AddLambdaNode("converter", lambdaFunc) // 连接节点 graph.AddEdge(START, "template") graph.AddEdge("template", "model") // 关键:条件分支——模型输出后走哪条路 graph.AddBranch("model", func(ctx context.Context, msg *schema.Message) (string, error) { if len(msg.ToolCalls) > 0 { return "tools", nil// 模型要调工具 } return END, nil// 模型直接输出答案 }) graph.AddEdge("tools", "converter") graph.AddEdge("converter", "template") // 回到起点,循环 compiledGraph, _ := graph.Compile(ctx) result, _ := compiledGraph.Invoke(ctx, input)

选型结论:做 AI Agent 基本都要用 Graph,因为 Tool Call 天然需要循环。Chain 适合不需要判断、一路走到底的简单场景。


流式处理:不用等,打字机效果

Graph 编译产物同时支持 Invoke 和 Stream,无需额外代码:

// 非流式:等全部结果 result, _ := compiledGraph.Invoke(ctx, input) // 流式:逐字输出 streamReader, _ := compiledGraph.Stream(ctx, input) for { chunk, err := streamReader.Recv() if errors.Is(err, io.EOF) { break } fmt.Print(chunk.Content) }

Eino 还能自动处理流和非流之间的转换:

流与非流自动转换

不用写任何转换逻辑,Compile 时自动搞定。


Callbacks:看清 Agent 每一步

Agent 跑起来之后怎么看它内部发生了什么?用 Callbacks:

handler := compose.NewHandlerBuilder(). OnStartFn(func(ctx context.Context, info *compose.RunInfo, input compose.CallbackInput) context.Context { log.Printf("[%s] 开始,输入:%v", info.Name, input) return ctx }). OnEndFn(func(ctx context.Context, info *compose.RunInfo, output compose.CallbackOutput) context.Context { log.Printf("[%s] 结束,输出:%v", info.Name, output) return ctx }). Build() compiledGraph.Invoke(ctx, input, compose.WithCallbacks(handler))

每个组件执行前后都能拿到输入输出。Eino 内置了 Langfuse 和 APMPlus 的 Callback 实现,接上就能在 Web 看完整 Trace。


第二天小结

今天讲了五件事:

第一,Eino 六类核心组件——ChatModel(大脑)、Tool(手)、Retriever(知识库)、ChatTemplate(格式化)、Embedding(向量化)、Document Loader(文档加载)。

第二,ChatModel 除了 Generate 和 Stream,最关键的是 BindTools——让模型知道自己有什么工具。

第三,Chain 适合直线流程,Graph 适合有分支和循环的复杂场景。做 Agent 基本都要用 Graph。

第四,Graph 编译产物同时支持 Invoke 和 Stream,流与非流之间自动转换。

第五,Callbacks 能追踪 Agent 每一步的执行过程。

明天是重点:用 Graph 编排一个完整的 RAG ReAct Agent,会查知识库、会调工具,Go 代码全程可运行。

最后

如果说程序员已经是高薪职业,那么干AI的程序员,就是高薪中的高薪。

现在的市场,已经用数据给程序员指明了方向:学AI大模型,就是冲刺高薪的最优解!

看着身边越来越多的同行转型大模型、拿到高薪offer,很多人心里都动了心,但真正的难题来了:零基础小白不知道从哪入门?有基础的程序员找不到系统学习路径?实战项目练手无门?面试不知道考什么?

别慌!今天就给大家整理了一份【2026年最新版】AI大模型免费学习资源包,覆盖从入门到实战、从理论到面试、从基础到进阶的全流程,所有资料均已整理归档,无冗余、无套路,免费分享给每一位想抓住AI风口的程序员和小白!

👇👇扫码免费领取全部内容👇👇

1、大模型系统化学习路线

2、大模型学习书籍&文档

3、AI大模型最新行业报告

4、大模型项目实战&配套源码

5、大模型大厂面试真题

四阶段精细化学习规划(附时间节点,可直接照做)

结合上述资源,给大家整理了一份可直接落地的四阶段学习规划,总时长约2个月,小白可循序渐进,程序员可根据自身基础调整节奏,高效掌握大模型核心能力,快速实现从“入门”到“能落地、能面试”的跨越。

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范
第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署
第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建
第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

👇👇扫码免费领取全部内容👇👇

6、这些资料真的有用吗?

这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理,现任上海殷泊信息科技CEO,其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证,服务航天科工、国家电网等1000+企业,以第一作者在IEEE Transactions发表论文50+篇,获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。

资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的技术人员,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 19:34:52

Confluence OGNL漏洞(CVE-2022-26134)应急响应指南:排查、处置与加固步骤详解

CVE-2022-26134漏洞实战防御手册:Confluence OGNL注入漏洞全流程处置方案当企业安全团队在凌晨三点收到Confluence服务器的异常告警时,最需要的不只是漏洞原理分析,而是一套能立即执行的应急响应方案。这份指南将带您从漏洞预警到系统加固&am…

作者头像 李华
网站建设 2026/6/15 19:29:50

能源电子 | 射频测试利器:深度了解鼎讯 DXSL 矢量信号源系列

一、能源产业升级下,射频测试设备的价值定位在风电、光伏、储能、智能电网等新能源体系快速迭代的当下,电力电子设备、无线通信监测、能源测控系统的精密测试,成为产业稳健运行的关键一环。各类射频、微波信号的模拟、发射与检测,…

作者头像 李华
网站建设 2026/6/15 19:25:55

3分钟让你的Windows 11焕然一新:Win11Debloat一键优化指南

3分钟让你的Windows 11焕然一新:Win11Debloat一键优化指南 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter an…

作者头像 李华
网站建设 2026/6/15 19:25:17

嵌入式MPU内存保护单元:PXS20区域描述符配置与实战指南

1. MPU核心概念与嵌入式系统安全基石在嵌入式系统开发,尤其是涉及实时操作系统或多任务环境的项目中,内存安全是悬在开发者头顶的达摩克利斯之剑。一次越界的指针操作、一个任务对另一个任务数据区的意外写入,都可能导致系统崩溃、数据损坏&a…

作者头像 李华
网站建设 2026/6/15 19:24:38

终极指南:iBatis到MyBatis的自动化框架迁移解决方案

终极指南:iBatis到MyBatis的自动化框架迁移解决方案 【免费下载链接】ibatis2mybatis Tool to convert iBATIS 2 xml files to MyBatis3 项目地址: https://gitcode.com/gh_mirrors/ib/ibatis2mybatis 在当今快速发展的技术环境中,框架迁移已成为…

作者头像 李华
网站建设 2026/6/15 19:23:48

企业落地AI大模型,这5个选型要点决定成败

自从GPT突然出现, 直至进行深度推理, AI大模型正由“技术热词”, 变成企业能够降低成本、提高效率的核心引擎。然而, 真正的问题也跟着产生了: 当一个企业作出决定, 打算构建自己的AI大模型系统时, 究竟应当从什么地方开始着手呢? 众多管理者觉得只要购置一台高性能服务器, 安…

作者头像 李华