news 2026/4/15 19:25:00

手把手教你用 Go 构建 AI Agent

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
手把手教你用 Go 构建 AI Agent

本文将带你从零开始,使用 Go 语言和字节跳动开源的 Eino 框架,构建一个能够调用工具的 AI Agent。我们会分别实现 Function Calling 和 ReAct 两种主流模式,并对比分析它们的区别

一、什么是 AI Agent?

在聊 Agent 之前,我们先看一个场景:

用户:北京今天天气怎么样?

如果是普通的 LLM,它只能基于训练数据"编造"一个答案。但如果是AI Agent,它会:

AI Agent = LLM + 工具调用能力 + 决策能力

简单说,Agent 让 LLM 从"只会说"变成"能做事"。


二、两种主流模式

实现 Agent 有两种主流模式:

模式核心思想特点
Function CallingLLM 直接输出要调用的函数简单直接,适合明确任务
ReActReasoning + Acting,先思考再行动推理过程可见,适合复杂任务

接下来我们用代码实现这两种模式。


三、准备工作

本篇文章我们用字节的开源AI Agent框架eino和字节doubao大模型来做例子。

3.1 获取字节豆包大模型 API Key

我们使用字节跳动的豆包大模型,需要先获取 API Key:

Step 1:注册火山引擎账号

访问 火山引擎官网 注册并登录

Step 2:进入火山方舟控制台

访问 火山方舟控制台

Step 3:创建 API Key

  1. 左侧菜单选择「API Key 管理」
  2. 点击「创建 API Key」
  3. 复制生成的 API Key(格式:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Step 4:创建推理接入点

  1. 左侧菜单选择「模型推理」→「创建推理接入点」
  2. 选择模型(推荐:doubao-pro-32kdoubao-lite-32k
  3. 创建后获得接入点 ID(格式:ep-20240101120000-xxxxx

💡提示:新用户通常有免费额度,doubao-lite系列价格最低,适合学习测试。

3.2 创建项目

mkdir eino-example && cd eino-examplego mod init eino-example

3.3 安装依赖

go get github.com/cloudwego/einogo get github.com/cloudwego/eino-ext/components/model/ark

3.4 定义工具

首先,我们需要定义一个工具供 Agent 调用。创建tools/tools.go

package tools import ( "context" "encoding/json" "fmt" "github.com/cloudwego/eino/components/tool" "github.com/cloudwego/eino/schema" ) // WeatherTool 查询天气的工具 type WeatherTool struct{} // NewWeatherTool 创建工具实例 func NewWeatherTool() *WeatherTool { return &WeatherTool{} } // 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: schema.String, Desc: "城市名称,如:北京、上海", Required: true, }, }), }, nil } // InvokableRun 工具的执行逻辑 func (t *WeatherTool) InvokableRun(ctx context.Context, args string, opts ...tool.Option) (string, error) { // 解析参数 var input struct { City string `json:"city"` } if err := json.Unmarshal([]byte(args), &input); err != nil { return "", fmt.Errorf("invalid input: %w", err) } // 模拟天气查询(实际项目中调用天气 API) result := map[string]interface{}{ "city": input.City, "temperature": "25°C", "weather": "晴", "humidity": "65%", } output, _ := json.Marshal(result) return string(output), nil }

关键点

  • Info()

    这个方法告诉 LLM 这个工具的名称、功能和参数

  • InvokableRun()

    这个方法是工具的实际执行逻辑

  • LLM 会以 JSON 格式传入参数


四、模式一:Function Calling

Function Calling 是最直接的方式:LLM 分析用户输入后,直接输出要调用的函数名和参数。

4.1 工作流程

用户: "北京天气怎么样?" ↓LLM 分析意图,输出: { "name": "get_weather", "arguments": {"city": "北京"} } ↓框架执行工具,返回: {"city": "北京", "temperature": "25°C", ...} ↓LLM 根据工具结果生成回复: "北京今天天气晴朗,气温25°C..."

4.2 代码实现

// RunFunctionCallingAgent 运行 ADK 模式的 Agent(Function Calling) func RunFunctionCallingAgent() { ctx := context.Background() // 1. 创建 LLM(火山引擎 - doubao-seed 模型) llm, err := ark.NewChatModel(ctx, &ark.ChatModelConfig{ APIKey: "27330803-5982-4cb8-a359-55d0c375d15d", // 火山引擎 API Key Model: "doubao-seed-1-6-lite-251015", // 推理接入点 ID }) if err != nil { panic(err) } // 2. 创建工具 weatherTool := tools.NewWeatherTool() // 3. 创建 Agent agent, err := adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{ Name: "WeatherAssistant", Description: "一个能查询天气的 AI 助手", Instruction: `你是一个友好的天气助手。 当用户询问天气时,使用 get_weather 工具查询,然后用自然语言回复用户。`, Model: llm, ToolsConfig: adk.ToolsConfig{ ToolsNodeConfig: compose.ToolsNodeConfig{ Tools: []tool.BaseTool{weatherTool}, }, }, MaxIterations: 10, }) if err != nil { panic(err) } // 4. 运行 Agent(关闭流式模式,确保完整的对话流程) runner := adk.NewRunner(ctx, adk.RunnerConfig{ Agent: agent, EnableStreaming: false, }) // 5. 发送消息 messages := []adk.Message{ schema.UserMessage("北京今天天气怎么样?"), } iter := runner.Run(ctx, messages) // 6. 处理响应 var finalContent string for { event, ok := iter.Next() if !ok { break } if event.Err != nil { panic(event.Err) } // 显示 Action 信息(工具调用) if event.Action != nil { fmt.Printf("[Action] Agent: %s\n", event.AgentName) } if event.Output != nil && event.Output.MessageOutput != nil { msg := event.Output.MessageOutput.Message if msg != nil { switch msg.Role { case schema.Assistant: if msg.Content != "" { finalContent = msg.Content fmt.Println("[Assistant]", msg.Content) } for _, tc := range msg.ToolCalls { fmt.Printf("[Tool Call] %s(%s)\n", tc.Function.Name, tc.Function.Arguments) } case schema.Tool: fmt.Printf("[Tool Result] %s\n", msg.Content) } } } } // 如果没有最终回复,说明模型没有生成总结 if finalContent == "" { fmt.Println("\n⚠️ 模型未生成最终回复,可能是模型配置问题或该模型不支持完整的 Function Calling 流程") } }

4.3 核心概念

  • ADK (Agent Development Kit)

    :Eino 提供的 Agent 开发工具包

  • ChatModelAgent

    :基于聊天模型的 Agent,支持 Function Calling

  • Runner

    :Agent 运行器,负责消息循环和工具执行

  • MaxIterations

    :最大迭代次数,一次用户输入可能触发多次工具调用

4.4 输出

可以看到最后一行Assistant输出了北京的天气:

运行 ADK 模式 Agent (Function Calling)... [Tool Call] get_weather({"city":"北京"}) [Tool Result] {"city":"北京","humidity":"65%","temperature":"25°C","weather":"晴"} [Tool Call] get_weather({"city":"北京"}) [Tool Result] {"city":"北京","humidity":"65%","temperature":"25°C","weather":"晴"} [Assistant] 北京今天天气晴,气温25°C,湿度65%

五、模式二:ReAct

ReAct =Reasoning +Acting,核心思想是让 LLM 交替进行「推理」和「行动」。

5.1 工作流程

用户: "北京和上海今天天气怎么样?比较一下" ↓Thought: 用户想知道两个城市的天气并比较,我需要分别查询Action: get_weather({"city": "北京"})Observation: {"city": "北京", "temperature": "25°C", "weather": "晴"} ↓Thought: 已获取北京天气,还需要查询上海Action: get_weather({"city": "上海"}) Observation: {"city": "上海", "temperature": "28°C", "weather": "多云"} ↓Thought: 两个城市的天气都获取到了,可以进行比较Final Answer: 北京今天晴朗,气温25°C;上海多云,气温28°C。上海比北京热3度...

ReAct 的优势

  • 推理过程透明,便于调试
  • 适合需要多步推理的复杂任务
  • 可以处理需要组合多个工具的场景

5.2 代码实现

package main import ( "context" "fmt" "eino-example/tools" "github.com/cloudwego/eino-ext/components/model/ark" "github.com/cloudwego/eino/components/tool" "github.com/cloudwego/eino/compose" "github.com/cloudwego/eino/flow/agent/react" "github.com/cloudwego/eino/schema" ) // RunReActAgent 运行 ReAct 模式的 Agent // ReAct = Reasoning + Acting,模型会交替进行推理和行动 func RunReActAgent() { ctx := context.Background() // 1. 创建 LLM(火山引擎 - doubao 模型) llm, err := ark.NewChatModel(ctx, &ark.ChatModelConfig{ APIKey: "27330803-5982-4cb8-a359-55d0c375d15d", Model: "doubao-seed-1-6-lite-251015", }) if err != nil { panic(err) } // 2. 创建工具 weatherTool := tools.NewWeatherTool() // 3. 创建 ReAct Agent agent, err := react.NewAgent(ctx, &react.AgentConfig{ // 使用支持工具调用的模型 ToolCallingModel: llm, // 配置可用的工具 ToolsConfig: compose.ToolsNodeConfig{ Tools: []tool.BaseTool{weatherTool}, }, // 最大执行步数(防止无限循环) MaxStep: 10, }) if err != nil { panic(err) } // 4. 准备输入消息(直接在消息中包含系统提示,替代已弃用的 NewPersonaModifier) messages := []*schema.Message{ schema.SystemMessage(`你是一个智能助手,擅长使用工具来回答用户问题。 当用户询问天气时,请使用 get_weather 工具查询,然后用友好的语言回复。 请在回答前先思考需要采取什么行动。`), schema.UserMessage("北京和上海今天天气怎么样?帮我比较一下"), } // 5. 流式运行 Agent fmt.Println("=== ReAct Agent 开始执行 ===") fmt.Println() stream, err := agent.Stream(ctx, messages) if err != nil { panic(err) } // 6. 处理流式响应 for { chunk, err := stream.Recv() if err != nil { break // 流结束 } // 输出模型的思考和回复 if chunk.Content != "" { fmt.Print(chunk.Content) } // 显示工具调用信息 for _, tc := range chunk.ToolCalls { if tc.Function.Name != "" { fmt.Printf("\n[调用工具: %s, 参数: %s]\n", tc.Function.Name, tc.Function.Arguments) } } } fmt.Println() fmt.Println() fmt.Println("=== ReAct Agent 执行完成 ===") }

5.3 核心配置

  • MaxStep

    :最大步数,防止无限循环

5.4 输出

可以看到最后一行大模型输出了答案:

运行 ReAct 模式 Agent... === ReAct Agent 开始执行 === 北京和上海今天的天气情况如下: 北京:晴,气温25°C,湿度65% 上海:晴,气温25°C,湿度65% 两者天气完全一致,都是晴朗舒适的状态~ === ReAct Agent 执行完成 ===

六、两种模式对比

对比项Function CallingReAct
思维方式直觉式,直接决策分析式,逐步推理
透明度黑盒,只看到结果白盒,能看到思考过程
适用场景简单明确的任务复杂多步的任务
Token 消耗较少较多(包含推理文本)
可控性较低较高
调试难度较难较易

选择建议

  • 用 Function Calling

    :任务明确、追求效率、Token 敏感

  • 用 ReAct

    :任务复杂、需要可解释性、需要多工具协作


七、完整项目结构

eino-example/├── main.go # 入口文件├── react_agent.go # ReAct Agent 实现├── tools/│ └── tools.go # 工具定义├── go.mod└── go.sum

main.go(支持模式切换)

func main() { // 通过命令行参数选择模式 // go run . adk -> ADK Agent (Function Calling) // go run . react -> ReAct Agent mode := "adk" if len(os.Args) > 1 { mode = os.Args[1] } switch mode { case "react": fmt.Println("运行 ReAct 模式 Agent...") RunReActAgent() default: fmt.Println("运行 ADK 模式 Agent (Function Calling)...") RunFunctionCallingAgent() } }

运行方式

# Function Calling 模式go run .# ReAct 模式go run . react

八、总结

本文介绍了使用 Go + Eino 框架构建 AI Agent 的两种主流模式:

  1. Function Calling

    :简单直接,LLM 直接决定调用哪个工具

  2. ReAct

    :先推理再行动,适合复杂任务

无论哪种模式,核心都是让 LLM 具备「使用工具」的能力,从而完成更复杂的任务。

相当于给大模型的使用注入了左臂右膀,让大模型可以获取我们工作中的领域知识。

过去在各业务中落地算法能力,都是先定义专属算法框架,再基于业务数据训练出定制化模型来使用;

BERT 模型问世后,行业开始更多通过基于 BERT 的微调方式,将业务知识植入模型以适配场景;

而到了与 BERT 同属 Transformer 框架的大模型时代,AI Agent 为大模型赋予了自主获取私域业务知识的能力,大模型只需专注核心的文本理解工作,无需再为适配业务做额外的训练、预训练或微调。

想入门 AI 大模型却找不到清晰方向?备考大厂 AI 岗还在四处搜集零散资料?别再浪费时间啦!2025 年AI 大模型全套学习资料已整理完毕,从学习路线到面试真题,从工具教程到行业报告,一站式覆盖你的所有需求,现在全部免费分享

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

一、学习必备:100+本大模型电子书+26 份行业报告 + 600+ 套技术PPT,帮你看透 AI 趋势

想了解大模型的行业动态、商业落地案例?大模型电子书?这份资料帮你站在 “行业高度” 学 AI

1. 100+本大模型方向电子书

2. 26 份行业研究报告:覆盖多领域实践与趋势

报告包含阿里、DeepSeek 等权威机构发布的核心内容,涵盖:

  • 职业趋势:《AI + 职业趋势报告》《中国 AI 人才粮仓模型解析》;
  • 商业落地:《生成式 AI 商业落地白皮书》《AI Agent 应用落地技术白皮书》;
  • 领域细分:《AGI 在金融领域的应用报告》《AI GC 实践案例集》;
  • 行业监测:《2024 年中国大模型季度监测报告》《2025 年中国技术市场发展趋势》。

3. 600+套技术大会 PPT:听行业大咖讲实战

PPT 整理自 2024-2025 年热门技术大会,包含百度、腾讯、字节等企业的一线实践:

  • 安全方向:《端侧大模型的安全建设》《大模型驱动安全升级(腾讯代码安全实践)》;
  • 产品与创新:《大模型产品如何创新与创收》《AI 时代的新范式:构建 AI 产品》;
  • 多模态与 Agent:《Step-Video 开源模型(视频生成进展)》《Agentic RAG 的现在与未来》;
  • 工程落地:《从原型到生产:AgentOps 加速字节 AI 应用落地》《智能代码助手 CodeFuse 的架构设计》。

二、求职必看:大厂 AI 岗面试 “弹药库”,300 + 真题 + 107 道面经直接抱走

想冲字节、腾讯、阿里、蔚来等大厂 AI 岗?这份面试资料帮你提前 “押题”,拒绝临场慌!

1. 107 道大厂面经:覆盖 Prompt、RAG、大模型应用工程师等热门岗位

面经整理自 2021-2025 年真实面试场景,包含 TPlink、字节、腾讯、蔚来、虾皮、中兴、科大讯飞、京东等企业的高频考题,每道题都附带思路解析

2. 102 道 AI 大模型真题:直击大模型核心考点

针对大模型专属考题,从概念到实践全面覆盖,帮你理清底层逻辑:

3. 97 道 LLMs 真题:聚焦大型语言模型高频问题

专门拆解 LLMs 的核心痛点与解决方案,比如让很多人头疼的 “复读机问题”:


三、路线必明: AI 大模型学习路线图,1 张图理清核心内容

刚接触 AI 大模型,不知道该从哪学起?这份「AI大模型 学习路线图」直接帮你划重点,不用再盲目摸索!

路线图涵盖 5 大核心板块,从基础到进阶层层递进:一步步带你从入门到进阶,从理论到实战。

L1阶段:启航篇丨极速破界AI新时代

L1阶段:了解大模型的基础知识,以及大模型在各个行业的应用和分析,学习理解大模型的核心原理、关键技术以及大模型应用场景。

L2阶段:攻坚篇丨RAG开发实战工坊

L2阶段:AI大模型RAG应用开发工程,主要学习RAG检索增强生成:包括Naive RAG、Advanced-RAG以及RAG性能评估,还有GraphRAG在内的多个RAG热门项目的分析。

L3阶段:跃迁篇丨Agent智能体架构设计

L3阶段:大模型Agent应用架构进阶实现,主要学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造Agent智能体。

L4阶段:精进篇丨模型微调与私有化部署

L4阶段:大模型的微调和私有化部署,更加深入的探讨Transformer架构,学习大模型的微调技术,利用DeepSpeed、Lamam Factory等工具快速进行模型微调,并通过Ollama、vLLM等推理部署框架,实现模型的快速部署。

L5阶段:专题集丨特训篇 【录播课】


四、资料领取:全套内容免费抱走,学 AI 不用再找第二份

不管你是 0 基础想入门 AI 大模型,还是有基础想冲刺大厂、了解行业趋势,这份资料都能满足你!
现在只需按照提示操作,就能免费领取:

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

2025 年想抓住 AI 大模型的风口?别犹豫,这份免费资料就是你的 “起跑线”!

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

用Material Design In XAML Toolkit快速打造现代化WPF应用界面

用Material Design In XAML Toolkit快速打造现代化WPF应用界面 【免费下载链接】MaterialDesignInXamlToolkit Googles Material Design in XAML & WPF, for C# & VB.Net. 项目地址: https://gitcode.com/gh_mirrors/ma/MaterialDesignInXamlToolkit 还在为WPF…

作者头像 李华
网站建设 2026/4/16 10:41:01

如何用Dokploy实现全球化部署?5步搞定多语言界面

如何用Dokploy实现全球化部署?5步搞定多语言界面 【免费下载链接】dokploy Open Source Alternative to Vercel, Netlify and Heroku. 项目地址: https://gitcode.com/GitHub_Trending/do/dokploy 还在为海外用户的语言障碍头疼吗?担心不同地区的…

作者头像 李华
网站建设 2026/3/31 11:12:20

TensorRT INT8 量化难以维护?这套 CMake 工程化方案解决了

往期文章 RK3588+docker+YOLOv5部署:https://blog.csdn.net/FJN110/article/details/149673049 RK3588测试NPU和RKNN函数包装https://blog.csdn.net/FJN110/article/details/149669753 RK3588刷机:https://blog.csdn.net/FJN110/article/details/149669404 以及深度学习部署工…

作者头像 李华
网站建设 2026/4/16 12:20:36

推理速度大幅提升:Ubuntu + TensorRT 加速 YOLOv5

往期文章 RK3588+docker+YOLOv5部署:https://blog.csdn.net/FJN110/article/details/149673049 RK3588测试NPU和RKNN函数包装https://blog.csdn.net/FJN110/article/details/149669753 RK3588刷机:https://blog.csdn.net/FJN110/article/details/149669404 以及深度学习部署工…

作者头像 李华
网站建设 2026/4/15 12:05:08

YOLOv13 多尺度特征建模:PPM 空间金字塔池化模块解析

文章目录 PPM(Pyramid Pooling Module)模块原理与实现详解 1. 引言与背景 1.1 语义分割中的挑战 1.2 全局上下文的重要性 1.3 设计动机 2. PPM模块核心原理 2.1 金字塔池化概念 2.2 自适应池化机制 2.3 特征融合策略 3. 代码实现详解 3.1 模块初始化 3.2 前向传播过程 3.3 设…

作者头像 李华
网站建设 2026/4/9 21:55:48

Cap开源录屏工具:3步解锁专业级屏幕录制新体验

Cap开源录屏工具:3步解锁专业级屏幕录制新体验 【免费下载链接】Cap Effortless, instant screen sharing. Open-source and cross-platform. 项目地址: https://gitcode.com/GitHub_Trending/cap1/Cap 你是否曾经遇到过这样的场景:需要紧急录制一…

作者头像 李华