第一章:快速开始 - 你的第一个 AI Agent
本章你将学到
读完这一章,你会掌握以下内容:
- ADK-Go 是什么,它解决了什么问题
- ADK 的核心概念:Agent、Tool、Model、Session、Runner、Launcher
- 如何搭建开发环境
- 如何用不到 50 行代码创建一个能联网搜索的 AI Agent
- 4 种运行 Agent 的方式:命令行、Web UI、REST API、Agent-to-Agent
准备好了吗?让我们开始吧。
什么是 ADK-Go
先搞清楚:什么是 Agent?
在聊 ADK 之前,我们先把 "Agent" 这个概念说清楚。
你可以把 Agent 想象成一个有脑子、有手脚的智能员工:
- 脑子 = LLM(大语言模型,比如 Gemini、GPT)。它负责"想"——理解用户说了啥、该怎么回应、下一步干啥。
- 手脚 = 工具(Tool)。光有脑子不行,Agent 还需要"动手"——比如搜索网页、查数据库、调 API、读文件等等。
- 记忆 = Session(会话)。一个好员工得记得之前聊了什么,不能每次都从头开始。
举个例子:你让 Agent "帮我查一下北京今天天气",它的工作流程是这样的:
用户:"帮我查一下北京今天天气"
↓
Agent 的脑子(LLM)理解了:用户想知道北京的天气
↓
Agent 的脑子决定:我需要用 Google 搜索来查一下
↓
Agent 的手脚(Tool):调用 Google Search,搜索 "北京今天天气"
↓
Agent 的脑子(LLM):把搜索结果整理成人话
↓
回复用户:"北京今天晴,气温 -2 到 8 度,西北风 3-4 级..."
看到了吗?Agent 不只是一个聊天机器人,它能思考并行动。这就是 Agent 和普通 ChatBot 的根本区别。
那 ADK-Go 是什么?
ADK 是 Agent Development Kit 的缩写,翻译过来就是 Agent 开发工具包。
ADK-Go 是 Google 官方推出的 Go 语言版 Agent 开发框架。它的定位很简单:
让你用 Go 快速构建、运行、部署 AI Agent。
你可以把 ADK-Go 理解成一个"Agent 工厂"的生产线:
你提供:脑子(模型) + 技能(工具) + 岗位说明(指令)
↓
ADK 帮你:组装 Agent + 管理对话 + 提供运行环境
↓
产出:一个能跑在命令行/Web/API/A2A 协议上的 AI Agent
不用你自己去处理 LLM 的流式响应、工具调用的解析、对话历史的管理、HTTP 服务的搭建...... 这些脏活累活 ADK 都帮你干了。你只需要关注 业务逻辑 就行。
为什么用 Go 写 Agent?
你可能会问:Python 的 Agent 框架那么多(LangChain、CrewAI、ADK-Python),为什么要用 Go?
几个实际的理由:
- 性能:Go 编译后是原生二进制,启动快、内存占用低。部署 Agent 服务时,同样的机器能扛更多请求。
- 并发:Go 的 goroutine 天生适合处理多个并发的 Agent 会话。
- 部署简单:编译成一个二进制文件,扔到服务器上就能跑,不用装 Python 环境。
- 类型安全:Go 的静态类型系统在编译期就能帮你抓住很多 bug。
- 你的技术栈就是 Go:如果你的后端本来就是 Go,用 ADK-Go 可以无缝集成。
当然,这不是说 Go 比 Python 更适合写 Agent,而是说 如果你是 Go 开发者,ADK-Go 给了你一个很好的选择。
ADK 核心概念速览
在动手之前,我们先快速过一遍 ADK 里最重要的 6 个概念。你不需要现在就搞懂每个细节,有个印象就行,后面会一个个展开讲。
| 概念 | 对应包 | 一句话解释 | 类比 |
|---|---|---|---|
| Agent | agent, agent/llmagent |
智能体本身,有名字、有大脑、有技能、有指令 | 一个有岗位职责的员工 |
| Tool | tool, tool/functiontool, tool/geminitool |
Agent 可以使用的工具/能力 | 员工的技能和工具箱 |
| Model | model, model/gemini |
大语言模型,Agent 的"大脑" | 员工的大脑和思维能力 |
| Session | session |
一次对话的上下文,保存对话历史和状态 | 员工的工作笔记本 |
| Runner | runner |
运行时引擎,管理 Agent 的执行流程 | 公司的项目管理系统 |
| Launcher | cmd/launcher |
启动器,提供不同的运行方式(命令行、Web等) | 公司的办公场所(办公室/远程/会议室) |
它们的关系,我画了一张图:
+-----------------+
| Launcher |
| (启动器/入口) |
| console/web/ |
| rest/a2a |
+--------+--------+
|
| 创建并驱动
v
+--------+--------+
| Runner |
| (运行时引擎) |
| 管理执行流程 |
+--------+--------+
|
+--------+--------+
| |
v v
+-------+-------+ +------+-------+
| Agent | | Session |
| (智能体) | | (对话会话) |
+-------+-------+ +--------------+
|
+--------+--------+
| |
v v
+------+------+ +------+------+
| Model | | Tools |
| (LLM大脑) | | (工具/技能) |
+-------------+ +-------------+
简单来说就是:Launcher 启动 Runner,Runner 驱动 Agent 在 Session 中运行,Agent 用 Model 思考、用 Tools 行动。
这就像一家公司:Launcher 是办公楼,Runner 是管理系统,Agent 是员工,Model 是员工的脑子,Tools 是员工的技能,Session 是工作记录。
环境准备
1. 安装 Go
ADK-Go 需要 Go 1.22 或更高版本。
检查你的 Go 版本:
go version
# 输出类似:go version go1.22.0 darwin/arm64
如果还没装 Go,去 https://go.dev/dl/ 下载安装。
提示:项目的 go.mod 里写的是
go 1.24.4,但 Go 的向前兼容性很好, 1.22 及以上版本应该都能正常工作。建议尽量用最新版本。
2. 获取 Google API Key
ADK-Go 默认使用 Google 的 Gemini 模型。你需要一个 Google API Key。
获取步骤:
- 打开 Google AI Studio
- 登录你的 Google 账号
- 点击左侧菜单的 "Get API key"
- 创建一个新的 API Key
- 复制保存好这个 Key
然后设置环境变量:
# Linux / macOS
export GOOGLE_API_KEY="你的API Key"
# 建议加到 ~/.bashrc 或 ~/.zshrc 里,这样每次打开终端都能用
echo 'export GOOGLE_API_KEY="你的API Key"' >> ~/.zshrc
source ~/.zshrc
# Windows PowerShell
$env:GOOGLE_API_KEY="你的API Key"
# 或者永久设置(需要管理员权限)
[System.Environment]::SetEnvironmentVariable("GOOGLE_API_KEY", "你的API Key", "User")
安全提醒:API Key 是敏感信息,不要提交到 Git 仓库里! 如果你用
.env文件管理环境变量,记得把.env加到.gitignore中。
3. 创建项目
# 创建项目目录
mkdir my-first-agent
cd my-first-agent
# 初始化 Go module
go mod init my-first-agent
# 安装 ADK-Go 和相关依赖
go get google.golang.org/adk
go get google.golang.org/genai
搞定!环境准备就这些,接下来正式写代码。
第一个 Agent:天气查询助手
我们要创建一个能查天气和时间的 AI Agent。它能做这些事:
- 回答 "北京现在几点了?"
- 回答 "上海今天天气怎么样?"
- 拒绝回答 "帮我写一首诗"(因为不在它的职责范围内)
先贴完整代码,然后我们逐行解读:
package main
import (
"context"
"log"
"os"
"google.golang.org/genai"
"google.golang.org/adk/agent"
"google.golang.org/adk/agent/llmagent"
"google.golang.org/adk/cmd/launcher"
"google.golang.org/adk/cmd/launcher/full"
"google.golang.org/adk/model/gemini"
"google.golang.org/adk/tool"
"google.golang.org/adk/tool/geminitool"
)
func main() {
ctx := context.Background()
// =========================================
// 第一步:创建模型 - 这是 Agent 的"大脑"
// =========================================
model, err := gemini.NewModel(ctx, "gemini-2.5-flash", &genai.ClientConfig{
// 从环境变量读取 API Key
APIKey: os.Getenv("GOOGLE_API_KEY"),
})
if err != nil {
log.Fatalf("创建模型失败: %v", err)
}
// =========================================
// 第二步:创建 Agent - 给它名字、大脑、指令和工具
// =========================================
a, err := llmagent.New(llmagent.Config{
// Agent 的唯一标识名,在整个 Agent 树中必须唯一
Name: "weather_time_agent",
// Agent 的大脑,用哪个 LLM 模型来思考
Model: model,
// Agent 的能力描述(一句话说明它能做什么)
Description: "回答关于城市天气和时间的问题",
// Agent 的工作指令(相当于 System Prompt)
Instruction: "你的唯一职责是回答关于特定城市的当前时间和天气的问题。" +
"你必须拒绝回答与时间或天气无关的任何问题。" +
"请用中文回答。",
// Agent 可以使用的工具列表
Tools: []tool.Tool{
// Google 搜索工具 - 让 Agent 能联网搜索实时信息
geminitool.GoogleSearch{},
},
})
if err != nil {
log.Fatalf("创建Agent失败: %v", err)
}
// =========================================
// 第三步:配置启动器并运行
// =========================================
config := &launcher.Config{
// AgentLoader 告诉启动器要加载哪个 Agent
AgentLoader: agent.NewSingleLoader(a),
}
// 使用 full.NewLauncher() 创建一个功能最全的启动器
// 它支持 console、web、rest、a2a 四种运行模式
l := full.NewLauncher()
// 根据命令行参数决定以哪种模式运行
if err = l.Execute(ctx, config, os.Args[1:]); err != nil {
log.Fatalf("运行失败: %v\n\n%s", err, l.CommandLineSyntax())
}
}
是不是比想象中简单?不到 50 行有效代码,就创建了一个能联网搜索、能对话的 AI Agent。
逐行解读
让我们把代码拆开,一块一块地理解。
导入的包
import (
"context"
"log"
"os"
"google.golang.org/genai" // Google GenAI SDK,提供模型配置等类型
"google.golang.org/adk/agent" // Agent 基础接口和加载器
"google.golang.org/adk/agent/llmagent" // LLM Agent 的具体实现
"google.golang.org/adk/cmd/launcher" // 启动器的配置类型
"google.golang.org/adk/cmd/launcher/full" // 功能最全的启动器
"google.golang.org/adk/model/gemini" // Gemini 模型的实现
"google.golang.org/adk/tool" // 工具接口
"google.golang.org/adk/tool/geminitool" // Gemini 内置工具(如 Google 搜索)
)
ADK-Go 的包结构很清晰:
agent/- Agent 相关(定义、创建、加载)model/- 模型相关(目前支持 Gemini)tool/- 工具相关(自定义函数工具、Gemini 内置工具、MCP 工具等)session/- 会话管理runner/- 运行时引擎cmd/launcher/- 各种启动器
第一步:创建模型
model, err := gemini.NewModel(ctx, "gemini-2.5-flash", &genai.ClientConfig{
APIKey: os.Getenv("GOOGLE_API_KEY"),
})
这一步是给 Agent 装上"大脑"。
gemini.NewModel()创建一个 Gemini 模型实例"gemini-2.5-flash"是模型名称。Gemini 2.5 Flash 是目前速度快、价格低的选择,适合大部分场景APIKey从环境变量读取,这是调用 Gemini API 的凭证
你可以换成其他 Gemini 模型:
| 模型名 | 特点 |
|---|---|
gemini-2.5-flash |
速度快,成本低,适合大部分任务 |
gemini-2.5-pro |
能力更强,适合复杂推理任务 |
gemini-2.0-flash |
上一代 Flash,依然好用 |
小知识:
gemini.NewModel()返回的是model.LLM接口。ADK-Go 通过接口解耦了 Agent 和具体的模型实现。理论上你可以实现自己的model.LLM来接入其他模型(比如通 过 OpenAI 兼容 API 接入本地模型),不过目前官方只提供了 Gemini 的实现。
第二步:创建 Agent
a, err := llmagent.New(llmagent.Config{
Name: "weather_time_agent",
Model: model,
Description: "回答关于城市天气和时间的问题",
Instruction: "你的唯一职责是回答关于特定城市的当前时间和天气的问题。...",
Tools: []tool.Tool{
geminitool.GoogleSearch{},
},
})
这是最核心的一步,让我们逐个字段看:
Name(名字)
Name: "weather_time_agent",
Agent 的唯一标识。在整个 Agent 树中(后面会讲多 Agent 协作),每个 Agent 的名字必须唯一。名字不能是 "user",因为这个名字被保留给了用户输入。
命名建议:用小写字母加下划线,像变量名一样。比如 weather_agent、code_reviewer、translator。
Model(模型/大脑)
Model: model,
把前面创建的 Gemini 模型传进去。这就是 Agent 用来"思考"的大脑。
Description(描述)
Description: "回答关于城市天气和时间的问题",
一句话描述这个 Agent 能做什么。这个描述很重要,在多 Agent 协作的场景下,LLM 会读这个描述来决定是否把任务委托给这个 Agent。所以描述要简洁且准确。
Instruction(指令)
Instruction: "你的唯一职责是回答关于特定城市的当前时间和天气的问题。" +
"你必须拒绝回答与时间或天气无关的任何问题。" +
"请用中文回答。",
这就是我们常说的 System Prompt(系统提示词)。它定义了 Agent 的行为边界和风格。
好的 Instruction 应该包含: - 角色定位:你是谁,负责什么 - 行为边界:什么该做,什么不该做 - 输出格式:用什么语言、什么风格回答
ADK-Go 的 Instruction 还支持模板变量。你可以用 {变量名} 的语法插入 Session 状态中的值:
// 比如这样的指令,ADK 会在运行时把 {user_name} 替换成 Session 中的实际值
Instruction: "你好 {user_name},我是你的天气助手。",
这个高级功能我们后面的章节会详细讲。
Tools(工具)
Tools: []tool.Tool{
geminitool.GoogleSearch{},
},
工具列表定义了 Agent 能使用的"技能"。这里我们只给了一个工具:Google 搜索。
geminitool.GoogleSearch{} 是 Gemini 模型内置的搜索工具。它的特别之处在于:搜索操作是在 Gemini 服务端完成的,不需要你本地执行任何代码。Agent 调用这个工具时,Gemini 会自动去搜索并返回结果。
ADK-Go 支持多种类型的工具:
| 工具类型 | 对应包 | 说明 |
|---|---|---|
| Gemini 内置工具 | tool/geminitool |
Google Search 等,服务端执行 |
| 自定义函数工具 | tool/functiontool |
把你的 Go 函数包装成工具 |
| MCP 工具 | tool/mcptoolset |
通过 MCP 协议使用外部工具服务 |
| Agent 工具 | tool/agenttool |
把另一个 Agent 当作工具使用 |
后面的章节我们会详细讲怎么写自定义工具。
第三步:配置启动器并运行
// 创建启动配置
config := &launcher.Config{
AgentLoader: agent.NewSingleLoader(a),
}
// 创建启动器
l := full.NewLauncher()
// 执行
if err = l.Execute(ctx, config, os.Args[1:]); err != nil {
log.Fatalf("运行失败: %v\n\n%s", err, l.CommandLineSyntax())
}
这部分代码做了三件事:
1. 创建 launcher.Config
launcher.Config 是启动配置。最重要的字段是 AgentLoader,它告诉启动器要加载哪个 Agent。
agent.NewSingleLoader(a) 创建一个单 Agent 加载器。如果你有多个 Agent,可以用 agent.NewMultiLoader(rootAgent, otherAgent1, otherAgent2)。
Config 还有其他可选字段:
type Config struct {
SessionService session.Service // 会话存储服务(默认用内存)
ArtifactService artifact.Service // 文件/制品存储服务
MemoryService memory.Service // 长期记忆服务
AgentLoader agent.Loader // Agent 加载器(必需)
PluginConfig runner.PluginConfig // 插件配置
TelemetryOptions []telemetry.Option // 遥测配置
}
目前我们只需要 AgentLoader,其他字段后面的章节会用到。
2. 创建 full.NewLauncher()
full.NewLauncher() 返回一个"全功能启动器",它内部组合了所有可用的运行模式:
// full.NewLauncher() 的内部实现(简化版)
func NewLauncher() launcher.Launcher {
return universal.NewLauncher(
console.NewLauncher(), // 命令行交互模式
web.NewLauncher( // Web 模式(包含多个子模式)
api.NewLauncher(), // REST API
a2a.NewLauncher(), // Agent-to-Agent 协议
webui.NewLauncher(), // Web UI 界面
),
)
}
你也可以只创建某个模式的启动器。比如只要命令行交互:
l := console.NewLauncher()
但一般来说,用 full.NewLauncher() 最方便,想用哪种模式通过命令行参数指定就行。
3. 调用 l.Execute()
l.Execute(ctx, config, os.Args[1:])
Execute() 接收三个参数:
- ctx:标准的 Go context
- config:前面创建的启动配置
- os.Args[1:]:命令行参数(去掉程序名本身)
启动器会根据命令行参数决定以哪种模式运行。比如 go run . console 就以命令行模式运行。
运行 Agent 的 4 种方式
现在我们把代码保存为 main.go,然后来试试不同的运行方式。
方式一:命令行交互模式(console)
go run . console
运行后你会看到一个交互式命令行,可以直接和 Agent 对话:
User -> 北京现在天气怎么样?
Agent -> 根据最新的搜索结果,北京现在的天气情况如下:
- 温度:-2°C 到 8°C
- 天气:晴转多云
- 风力:西北风 3-4 级
...
User -> 帮我写一首诗
Agent -> 抱歉,我只能回答关于城市天气和时间的问题。写诗不在我的职责范围内。
如果你想了解某个城市的天气或时间,请随时告诉我!
User -> (按 Ctrl+C 退出)
看到了吗?Agent 严格按照我们的 Instruction 执行,不在职责范围内的请求会被拒绝。
console 模式适合开发调试,快速验证 Agent 的行为。
方式二:Web UI 模式
go run . web webui
启动后会在 http://localhost:8080 开启一个 Web 界面。打开浏览器访问,你会看到一个类似 ChatGPT 的聊天界面,可以在浏览器里和 Agent 对话。
web webui 模式适合演示和体验。当你想给别人展示你的 Agent 时,这个自带的 Web UI 非常方便。
你还可以指定端口:
go run . web -port 3000 webui
方式三:REST API 模式
go run . web api
启动一个 REST API 服务,你可以通过 HTTP 请求和 Agent 交互。
用 curl 测试一下:
# 先创建一个会话
curl -X POST http://localhost:8080/apps/weather_time_agent/users/test_user/sessions \
-H "Content-Type: application/json"
# 假设返回的 session id 是 "session_abc123"
# 发送消息给 Agent
curl -X POST http://localhost:8080/run \
-H "Content-Type: application/json" \
-d '{
"app_name": "weather_time_agent",
"user_id": "test_user",
"session_id": "session_abc123",
"new_message": {
"role": "user",
"parts": [{"text": "上海今天天气如何?"}]
}
}'
web api 模式适合集成到你的应用中。你的前端(Web、App、小程序)可以通过 HTTP 请求调用 Agent。
方式四:Agent-to-Agent 模式(A2A)
go run . web a2a
这会启动一个遵循 A2A(Agent-to-Agent)协议 的服务。A2A 是一个标准化的 Agent 间通信协议,让不同的 Agent(甚至不同框架、不同语言实现的 Agent)能互相发现、互相调用。
web a2a 模式适合多 Agent 协作场景。比如你的天气 Agent 可以被另一个旅行规划 Agent 调用。
组合使用
你甚至可以同时启动多个 Web 子模式:
# 同时启动 REST API 和 Web UI
go run . web api webui
# 同时启动所有 Web 子模式
go run . web api webui a2a
运行方式速查表
| 命令 | 模式 | 适用场景 |
|---|---|---|
go run . console |
命令行交互 | 开发调试 |
go run . web webui |
Web UI 界面 | 演示体验 |
go run . web api |
REST API 服务 | 应用集成 |
go run . web a2a |
A2A 协议服务 | Agent 间协作 |
go run . web api webui a2a |
全部 Web 模式 | 一次全开 |
ADK 架构全景图
现在让我们退后一步,看看 ADK-Go 的完整架构。理解这张图对后续的学习很有帮助。
用户 / 客户端
|
v
+-----------------------------------------------------+
| Launcher (启动器) |
| |
| console web+webui web+api web+a2a |
| (命令行) (Web界面) (REST API) (A2A协议) |
+-------------------------+-----------------------------+
|
| 创建 Session,转发用户消息
v
+-----------------------------------------------------+
| Runner (运行引擎) |
| |
| - 管理 Agent 的执行流程 |
| - 找到正确的 Agent 来处理请求 |
| - 将事件保存到 Session |
| - 管理插件的生命周期 |
+-------------------------+-----------------------------+
|
+--------------+--------------+
| |
v v
+----------+----------+ +----------+----------+
| Agent (智能体) | | Session (会话) |
| | | |
| Name: 唯一标识 | | ID: 会话标识 |
| Description: 描述 | | Events: 事件列表 |
| Instruction: 指令 | | State: 状态存储 |
| Model: LLM大脑 | | |
| Tools: 工具列表 | | (对话历史都存在这里) |
| SubAgents: 子Agent | | |
+----------+----------+ +---------------------+
|
+--------+--------+
| |
v v
+-----+------+ +------+-------+
| Model(LLM) | | Tools(工具) |
| | | |
| Gemini | | GoogleSearch |
| 2.5 Flash | | 自定义函数 |
| 2.5 Pro | | MCP工具 |
| ... | | Agent工具 |
+-------------+ +--------------+
数据流详解
一次完整的用户交互,数据流是这样的:
1. 用户发送消息 "北京天气怎么样?"
|
v
2. Launcher 接收到消息,转交给 Runner
|
v
3. Runner 从 Session 中加载对话历史
|
v
4. Runner 找到应该处理这条消息的 Agent(这里就是 weather_time_agent)
|
v
5. Agent 运行:
a. 构建请求:系统指令 + 对话历史 + 用户新消息 + 可用工具列表
b. 发送给 Model(Gemini)
c. Model 返回:我要调用 google_search("北京天气")
d. ADK 执行 Google Search 工具
e. 搜索结果返回给 Model
f. Model 根据搜索结果生成最终回复
|
v
6. Runner 将 Agent 的回复事件保存到 Session
|
v
7. Launcher 将回复返回给用户
注意第 5 步中的 c-e,这就是所谓的 工具调用循环(Tool Call Loop)。Agent 可能会连续调用多个工具,直到它认为已经收集了足够的信息来回复用户。这个过程是自动的,ADK 帮你处理了。
关于 Session
Session 是 ADK 中一个重要但容易被忽略的概念。它的作用是:
- 保存对话历史:每一轮用户输入和 Agent 回复都作为 Event 存在 Session 中
- 维护状态:你可以在 Session 中存储键值对,比如用户偏好、中间计算结果等
- 跨轮对话:因为有 Session,Agent 能记住之前聊了什么
默认情况下,ADK 使用内存中的 Session 存储(session.InMemoryService()),程序重启后数据就没了。在生产环境中,你可以切换到数据库存储(ADK 提供了基于 GORM 的数据库实现)或 Vertex AI 的托管服务。
这些高级用法我们在后面的章节中会详细讲到。
理解 llmagent.Config 的完整配置
我们刚才用了 llmagent.Config 最基础的字段。实际上它还有很多可选配置,这里列出一些后面会用到的:
llmagent.Config{
// === 基础配置(我们已经用过了)===
Name: "agent_name", // 必需:唯一标识
Model: model, // 必需:LLM 模型
Description: "做什么的", // 推荐:能力描述
Instruction: "你应该...", // 推荐:行为指令
Tools: []tool.Tool{...}, // 可选:工具列表
// === 子 Agent(多 Agent 协作时用)===
SubAgents: []agent.Agent{...}, // 可选:子 Agent 列表
// === 回调函数(拦截和定制行为)===
BeforeAgentCallbacks: []agent.BeforeAgentCallback{...}, // Agent 运行前
AfterAgentCallbacks: []agent.AfterAgentCallback{...}, // Agent 运行后
BeforeModelCallbacks: []llmagent.BeforeModelCallback{...}, // 模型调用前
AfterModelCallbacks: []llmagent.AfterModelCallback{...}, // 模型调用后
BeforeToolCallbacks: []llmagent.BeforeToolCallback{...}, // 工具调用前
AfterToolCallbacks: []llmagent.AfterToolCallback{...}, // 工具调用后
// === 高级配置 ===
GenerateContentConfig: &genai.GenerateContentConfig{
Temperature: genai.Ptr(float32(0.7)), // 控制回答的随机性
},
OutputKey: "result", // 把 Agent 输出保存到 Session 状态
// === 全局指令(对整个 Agent 树生效)===
GlobalInstruction: "你是一个友好的 AI 助手...",
}
别担心,这些配置你不需要现在就全搞懂。我们会在后续章节中一个一个来讲。
小结
恭喜你完成了第一章!让我们回顾一下关键知识点:
Agent 的本质
Agent = 大脑(LLM) + 手脚(Tools) + 记忆(Session) + 指令(Instruction)
它不只是一个聊天机器人,而是能思考并行动的智能体。
ADK-Go 的核心组件
Launcher --> Runner --> Agent --> Model + Tools
|
Session
六个核心概念:Agent、Tool、Model、Session、Runner、Launcher,各司其职。
创建 Agent 的三步
- 创建 Model:
gemini.NewModel()- 给 Agent 一个大脑 - 创建 Agent:
llmagent.New()- 组装 Agent(名字 + 大脑 + 指令 + 工具) - 启动运行:
full.NewLauncher().Execute()- 选择运行模式,开跑
四种运行模式
| 模式 | 命令 | 场景 |
|---|---|---|
| 命令行 | console |
开发调试 |
| Web UI | web webui |
演示体验 |
| REST API | web api |
应用集成 |
| A2A | web a2a |
Agent 协作 |
动手练习
学了这么多,是时候自己动手了。以下是两个练习,建议你真的去做一下——看十遍不如写一遍。
练习 1:把天气助手改成翻译助手
修改 Agent 的配置,让它变成一个中英互译助手:
- Name:
"translator_agent" - Description:
"中英文互相翻译" - Instruction: 自己写一段合适的指令(提示:告诉它只做翻译,不做其他事)
- Tools: 翻译不需要联网搜索,可以把
Tools设为空[]tool.Tool{}
改完后用 go run . console 试试效果:
User -> Please translate: 今天天气真好
Agent -> Today's weather is really nice.
User -> 翻译:The quick brown fox jumps over the lazy dog
Agent -> 敏捷的棕色狐狸跳过了那只懒狗
User -> 帮我写一首诗
Agent -> 抱歉,我只负责中英文翻译,无法为你写诗。请给我需要翻译的内容。
参考答案(先自己试,实在不行再看)
a, err := llmagent.New(llmagent.Config{
Name: "translator_agent",
Model: model,
Description: "中英文互相翻译",
Instruction: "你是一个专业的中英文翻译助手。" +
"你的唯一职责是将中文翻译成英文,或将英文翻译成中文。" +
"你必须拒绝任何与翻译无关的请求。" +
"翻译时请保持原文的语气和风格。" +
"如果用户直接发送文本而没有明确说翻译,请自动判断语言并翻译成另一种语言。",
Tools: []tool.Tool{}, // 翻译不需要工具
})
练习 2:尝试不同的运行模式
用你的 Agent(无论是天气助手还是翻译助手),依次尝试以下运行模式:
go run . console- 在命令行里聊几句go run . web webui- 打开浏览器体验 Web 界面go run . web api webui- 同时开启 API 和 Web UI,用浏览器和 curl 分别测试
感受一下不同模式的区别。思考一下:在什么场景下你会选择用哪种模式?
练习 3(选做):调整模型参数
试试通过 GenerateContentConfig 调整模型的 "温度"(temperature),看看不同温度下 Agent 回答风格的变化:
a, err := llmagent.New(llmagent.Config{
// ... 其他配置 ...
GenerateContentConfig: &genai.GenerateContentConfig{
// 温度范围 0.0 - 2.0
// 低温度(0.1):回答更确定、更一致
// 高温度(1.5):回答更有创意、更多样
Temperature: genai.Ptr(float32(0.1)),
},
})
分别用 0.1 和 1.5 的温度问同一个问题,对比回答的差异。
下一章预告
在下一章中,我们将学习如何创建自定义工具。Agent 光会搜索可不够,我们要让它学会更多技能——调用你自己的 Go 函数、访问数据库、调用第三方 API...... 这才是 Agent 真正强大的地方。
到时见!