让 AI 不只是"回答问题",而是"完成任务"
01 引子
在之前的九篇文章中,我们完成了:
- Spring AI 核心功能(多轮对话、流式输出、Function Calling、Output Parser)
- RAG 完整链路(文档加载、向量化、混合检索、元数据过滤)
这些能力让 AI 能够回答问题,并且回答得越来越精准。
但有一个问题始终存在:用户需要自己拆解任务。
比如用户说"我现在在北京,想出门散步",他需要自己去查天气、看空气质量、规划路线------AI 只能回答"好的"或者给一些通用建议。
如果 AI 能主动调用工具获取实时信息,再给出针对性建议呢?
这就是 Agent 要做的事。
02 什么是 Agent?
一句话定义: Agent 是一个能够自主理解意图、调用工具、完成任务的 AI 系统。
对比理解:
| 能力 | 普通对话 | Function Calling | Agent |
|---|---|---|---|
| 理解用户意图 | ✅ | ✅ | ✅ |
| 调用单个工具 | ❌ | ✅ | ✅ |
| 多工具协作 | ❌ | ❌ | ✅ |
| 自主规划步骤 | ❌ | ❌ | ✅ |
| 根据结果调整 | ❌ | ❌ | ✅ |
03 ReAct 模式:Agent 的工作方式
ReAct = Re asoning(推理)+ Acting(行动)
这是目前最主流的 Agent 工作模式:

核心思想: Agent 不是一次性回答,而是"思考 → 行动 → 观察 → 再思考"的循环过程。
04 代码实现
4.1 准备工作:已有的 Tool
在之前的实战中,我们已经定义了 Tool:
WeatherTool.java

TimeTool.java

4.2 创建 Agent 服务
AgentService.java

4.3 创建 Controller
AgentController.java

05 测试验证
场景一:多工具协作
请求:

行为分析:
- Agent 识别用户问了两个问题
- 调用
getCurrentTime获取时间 - 调用
getWeather("上海")获取天气 - 汇总两个结果,生成完整回复
场景二:复杂任务规划
请求:

行为分析:
- Agent 理解"散步"需要天气信息
- 自动调用
getWeather("北京") - 根据天气结果给出针对性建议
- 结合常识补充细节(防晒、补水、时段、空气质量)
06 Agent vs Function Calling
| 对比项 | Function Calling | Agent |
|---|---|---|
| 工具数量 | 单次调用 | 可多次调用 |
| 决策方式 | 一次决策 | 循环决策 |
| 任务复杂度 | 简单任务 | 复杂任务 |
| 中间结果 | 不保留 | 保留并用于后续决策 |
| 典型场景 | "现在几点了?" | "查天气→判断→给建议" |
07 踩坑记录
坑一:CHAT_MEMORY_CONVERSATION_ID_KEY 常量找不到
在某些 Spring AI 版本中,这个常量可能不存在或名称不同。
解决: 直接使用字符串字面量 "chat_memory_conversation_id"。
坑二:Agent 不调用工具
原因: 系统提示词(System Prompt)不够清晰。
解决: 明确告诉 AI 有哪些工具可用,以及在什么情况下调用。

坑三:Agent 只调用一个工具
当用户问了多个问题时,Agent 可能只调用了一个工具。
解决: 在提示词中强调"如果用户问了多个问题,需要分别调用对应的工具"。
08 成果总结
经过这一篇,你的系统现在具备:
| 能力 | 状态 |
|---|---|
| 理解用户意图 | ✅ |
| 多工具注册 | ✅ |
| 多工具协作 | ✅ |
| 主动调用工具 | ✅ |
| 基于结果生成建议 | ✅ |
09 下期预告
你已经实现了 Agent 的基础能力。接下来可以深入的方向:
| 方向 | 内容 |
|---|---|
| Agent 进阶 | 复杂任务拆解、多步推理、错误重试 |
| Rerank 重排序 | 在 RAG 检索结果上进一步精排 |
| 实战项目 | 构建一个"智能会议助手"或"智能客服" |
下一篇,我们探索 Agent 的进阶能力------让 Agent 能够拆解复杂任务、多步推理。
📌 我是超超不吵吵,10年Java全栈,正在转型AI应用开发。
每周一篇实战笔记,不贩卖焦虑,只分享能落地的技术。
掘金/CSDN同名,欢迎关注。