Spring AI 学习篇(十三)| AI Agent的核心原理与实现
Spring AI 学习篇(十三)| AI Agent的核心原理与实现
一、本章核心学习目标
学完本章,你将能够:
- 深刻理解AI Agent的本质与核心价值
- 掌握ReAct框架的工作原理与实现逻辑
- 熟练使用Spring AI 1.0原生Agent工作流
- 实现Agent的短期记忆与长期记忆系统
- 掌握任务分解与规划技术
- 构建一个具备自主思考和执行能力的基础Agent
- 理解Agent的常见架构与演进方向
二、前置知识准备
- 已经完成前12篇的学习,熟练掌握工具调用与MCP协议
- 理解ChatClient与提示词工程的核心方法
- 了解向量数据库的基本使用
- 掌握Spring Boot的依赖注入与配置管理
三、为什么我们需要AI Agent?
在前12篇的学习中,我们已经实现了两个核心能力:
- RAG知识库系统:让大模型能够回答基于私有知识的问题
- 工具调用能力:让大模型能够执行外部操作
但这两个能力都是被动的:大模型只能响应用户的明确指令,不能主动思考和规划。
被动AI的局限性
- 只能处理单步骤任务:用户必须明确告诉它每一步要做什么
- 没有上下文连续性:每次调用都是独立的,无法记住之前的对话和操作
- 没有纠错能力:如果工具调用失败,不会自动重试或调整策略
- 无法处理复杂任务:对于"帮我写一份项目周报并发送给团队"这样的多步骤任务,需要用户拆解成多个指令
AI Agent的本质
AI Agent是一个具备自主感知、思考、规划和执行能力的智能体。它的核心思想是:用户只需要告诉Agent最终目标,Agent会自己分解任务、规划步骤、调用工具、处理异常,直到完成目标。
用户给出最终目标 → Agent分解任务 → Agent规划执行步骤 → Agent调用工具执行 → Agent观察结果 → Agent调整策略 → 直到完成目标
关键区别:普通AI是"你让我做什么,我就做什么";AI Agent是"你告诉我目标,我来想办法完成"。
预告式提及:本章我们将实现一个基础的AI Agent,下一章我们会把它升级为一个功能完善的智能办公Agent,能够自动完成邮件处理、文档生成、日程管理等复杂任务。
四、AI Agent的核心组成部分
一个完整的AI Agent由5个核心组件组成:
┌─────────────────┐
│ 用户目标 │
└─────────┬───────┘
│
┌─────────▼───────┐
│ 规划器 │ 分解任务,制定执行计划
└─────────┬───────┘
│
┌─────────▼───────┐
│ 大模型 │ 思考决策,决定下一步动作
└─────────┬───────┘
│
┌─────────▼───────┐
│ 工具集 │ 执行具体操作(MCP工具)
└─────────┬───────┘
│
┌─────────▼───────┐
│ 记忆系统 │ 存储对话历史、任务状态和用户偏好
└─────────┬───────┘
│
┌─────────▼───────┐
│ 执行结果 │
└─────────────────┘
1. 大模型(大脑)
Agent的核心决策单元,负责思考、推理和决策。所有的Agent行为都是由大模型驱动的。
- 通用大模型:GPT-4o、Claude 3.5、DeepSeek-R1
- Agent专用模型:DeepSeek-Agent、OpenAI Operator
2. 工具集(手和脚)
Agent与外部世界交互的接口,负责执行具体的操作。通过MCP协议接入各种工具:
- 文件操作、数据库查询、邮件发送、浏览器访问
- 自定义业务工具
3. 记忆系统(大脑的记忆)
存储Agent的所有信息,分为三种类型:
- 短期记忆:当前对话的历史和任务状态
- 长期记忆:用户的偏好、历史任务和知识
- 工具记忆:工具的使用方法和历史调用记录
4. 规划器(指挥官)
将用户的最终目标分解为多个可执行的步骤,并制定执行计划。
- 简单任务:线性规划
- 复杂任务:树状规划、多轮迭代
5. 执行器(执行者)
负责调用工具执行规划好的步骤,并处理执行过程中的异常。
- 工具调用、结果解析
- 异常处理、自动重试
五、ReAct框架:Agent的标准实现范式
ReAct(Reasoning + Acting)是目前主流的Agent实现框架,大量现代Agent都基于ReAct框架构建。
1. ReAct的核心循环
ReAct的核心是一个无限循环,直到任务完成或达到最大迭代次数:
思考(Thought) → 行动(Action) → 观察(Observation) → 思考(Thought) → ...
- 思考:大模型分析当前状态,决定下一步要做什么
- 行动:调用对应的工具执行操作
- 观察:获取工具执行的结果,更新当前状态
2. ReAct工作流程示例
用户目标:帮我写一份2026年6月的项目周报,并发送给team@example.com
ReAct执行过程:
- 思考:我需要先获取项目的最新进展,然后写周报,最后发送邮件。首先我应该读取项目文档。
- 行动:调用
read_file工具读取/data/project-report.md - 观察:获取到项目文档内容
- 思考:现在我有了项目数据,我需要根据这些数据写一份周报。
- 行动:调用
write_file工具生成weekly-report-2026-06.md - 观察:周报生成成功
- 思考:周报已经生成,现在我需要发送邮件给团队。
- 行动:调用
send_email工具发送邮件 - 观察:邮件发送成功
- 思考:所有步骤都已完成,任务结束。
- 最终回答:已为你生成2026年6月的项目周报并发送给team@example.com。
六、Spring AI 1.0原生Agent实现
Spring AI 提供了 Agent 工作流支持(以下展示核心概念和实现思路,具体 API 以实际版本的官方文档为准):
1. 核心依赖
Agent功能是Spring AI ChatClient的内置扩展,不需要额外添加依赖。
2. 基础Agent实现
(1) 配置Agent
import org.springframework.ai.agent.Agent;
import org.springframework.ai.agent.ReActAgent;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.mcp.client.McpClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.List;
@Configuration
public class AgentConfig {
@Bean
public Agent reActAgent(ChatClient.Builder chatClientBuilder,
List<McpClient> mcpClients) {
return ReActAgent.builder()
.chatClient(chatClientBuilder.build())
// 注册所有MCP工具
.tools(mcpClients)
// 最大迭代次数,防止无限循环
.maxIterations(10)
// 系统提示词,定义Agent的身份和行为
.systemPrompt("""
你是一个智能办公助手,能够帮助用户完成各种办公任务。
你可以使用提供的工具来执行操作。
请一步步思考,每次只执行一个动作。
如果你不知道如何完成任务,请如实告诉用户。
任务完成后,给用户一个简洁的总结。
""")
.build();
}
}
(2) Agent控制器
import org.springframework.ai.agent.Agent;
import org.springframework.ai.agent.AgentResponse;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
@RestController
@RequestMapping("/agent")
public class AgentController {
private final Agent agent;
public AgentController(Agent agent) {
this.agent = agent;
}
// 非流式调用
@GetMapping("/chat")
public String chat(@RequestParam String message) {
AgentResponse response = agent.call(message);
return response.getContent();
}
// 流式调用
@GetMapping("/chat/stream")
public Flux<String> chatStream(@RequestParam String message) {
return agent.stream(message)
.map(step -> step.getContent() + "\n");
}
}
3. 测试Agent
启动项目,访问以下地址测试:
http://localhost:8080/agent/chat?message=帮我列出/data/documents目录下的所有Markdown文件,并生成一个目录索引
Agent会自动:
- 调用
list_files工具列出目录下的文件 - 筛选出Markdown文件
- 调用
read_file工具读取每个文件的标题 - 生成目录索引
- 返回最终结果
关键观察:你不需要告诉Agent任何步骤,只需要告诉它最终目标。Agent会自己思考需要调用哪些工具,以及调用的顺序。
七、Agent记忆系统实现
记忆是Agent的灵魂,没有记忆的Agent每次对话都是全新的,无法完成复杂的长任务。
1. 短期记忆(对话记忆)
短期记忆存储当前对话的历史和任务状态,Spring AI Agent默认已经实现了短期记忆。
自定义短期记忆
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.memory.MessageWindowChatMemory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MemoryConfig {
@Bean
public ChatMemory chatMemory() {
return MessageWindowChatMemory.builder().build();
}
@Bean
public Agent reActAgent(ChatClient.Builder chatClientBuilder,
List<McpClient> mcpClients,
ChatMemory chatMemory) {
return ReActAgent.builder()
.chatClient(chatClientBuilder.build())
.tools(mcpClients)
.maxIterations(10)
.chatMemory(chatMemory) // 注入记忆
.systemPrompt("""
你是一个智能办公助手,能够帮助用户完成各种办公任务。
你可以使用提供的工具来执行操作。
请一步步思考,每次只执行一个动作。
如果你不知道如何完成任务,请如实告诉用户。
任务完成后,给用户一个简洁的总结。
""")
.build();
}
}
2. 长期记忆(用户记忆)
长期记忆存储用户的偏好、历史任务和知识,使用向量数据库实现。
实现长期记忆
import org.springframework.ai.document.Document;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
@Component
public class LongTermMemory {
private final VectorStore vectorStore;
public LongTermMemory(VectorStore vectorStore) {
this.vectorStore = vectorStore;
}
// 保存记忆
public void saveMemory(String userId, String content, String type) {
Document document = new Document(content, Map.of(
"user_id", userId,
"type", type,
"timestamp", System.currentTimeMillis()
));
vectorStore.add(List.of(document));
}
// 检索相关记忆
public List<Document> retrieveMemory(String userId, String query) {
return vectorStore.similaritySearch(
org.springframework.ai.vectorstore.SearchRequest.builder().query(query)
.topK(5)
.filterExpression("user_id == '" + userId + "'")
.build()
);
}
}
集成到Agent中
// 在Agent的系统提示词中添加记忆使用说明
.systemPrompt("""
你是一个智能办公助手,能够帮助用户完成各种办公任务。
你可以使用提供的工具来执行操作。
你有长期记忆,可以记住用户的偏好和历史任务。
在回答用户问题之前,先检索相关的长期记忆。
请一步步思考,每次只执行一个动作。
如果你不知道如何完成任务,请如实告诉用户。
任务完成后,给用户一个简洁的总结,并将重要信息保存到长期记忆中。
""")
八、任务规划能力
对于复杂任务,Agent需要能够将其分解为多个子任务,并制定执行计划。
1. 链式任务分解
将复杂任务分解为线性的步骤序列:
// 在系统提示词中添加任务分解说明
.systemPrompt("""
当你遇到复杂任务时,请先将其分解为多个清晰的步骤。
例如:
用户目标:帮我写一份项目周报并发送给团队
分解步骤:
1. 读取项目最新进展文档
2. 生成周报内容
3. 保存周报到文件
4. 发送邮件给团队
""")
2. 树状任务分解
对于更复杂的任务,可以分解为树状结构,并行执行独立的子任务:
// 启用并行工具调用
@Bean
public Agent reActAgent(ChatClient.Builder chatClientBuilder,
List<McpClient> mcpClients,
ChatMemory chatMemory) {
return ReActAgent.builder()
.chatClient(chatClientBuilder.build())
.tools(mcpClients)
.maxIterations(10)
.chatMemory(chatMemory)
.toolOptions(org.springframework.ai.tool.ToolOptions.builder()
.parallelToolCalls(true) // 启用并行工具调用
.build())
.systemPrompt("""
当你遇到可以并行执行的独立子任务时,可以同时调用多个工具。
例如:同时读取多个文件,同时发送多封邮件。
""")
.build();
}
九、企业级最佳实践
1. Agent安全控制
- 工具权限控制:根据用户的角色限制可以调用的工具
- 操作审计:记录所有Agent的操作和工具调用
- 人工确认:对于危险操作(如删除文件、发送邮件),要求用户确认
- 沙箱环境:在沙箱环境中执行所有外部操作
2. 可观测性
- 步骤追踪:记录Agent的每一步思考、行动和观察
- 性能监控:监控Agent的响应时间、工具调用次数和成功率
- 错误告警:当Agent失败次数超过阈值时,发送告警通知
- 用户反馈:收集用户对Agent回答的反馈,持续优化
3. 错误处理与容错
- 自动重试:对于临时失败的工具调用,自动重试
- 回退策略:当工具调用失败时,使用替代方案
- 最大迭代次数:限制Agent的最大迭代次数,防止无限循环
- 优雅降级:当Agent无法完成任务时,给出友好的提示
4. Agent定制化
- 行业专用Agent:为不同行业定制专用的Agent和工具集
- 角色定制:为不同角色的用户定制不同的Agent身份和权限
- 提示词优化:根据用户反馈持续优化Agent的系统提示词
- 模型选择:根据任务的复杂度选择合适的大模型
十、常见坑与解决方案
1. ❌ Agent陷入无限循环
问题:Agent反复调用同一个工具,无法完成任务
解决方案:
- 设置合理的最大迭代次数(一般5-10次)
- 在系统提示词中明确要求"如果连续3次调用同一个工具没有进展,就停止并告诉用户"
- 添加循环检测机制,当检测到循环时,强制终止并返回错误
2. ❌ Agent规划错误
问题:Agent分解的任务步骤不正确,导致任务失败
解决方案:
- 在系统提示词中提供任务分解的示例
- 使用更强大的推理模型(如DeepSeek-R1)
- 添加人工审核步骤,对于复杂任务,先让Agent生成计划,用户确认后再执行
3. ❌ 工具调用错误
问题:Agent调用工具时参数错误,导致执行失败
解决方案:
- 为工具添加详细的描述和参数说明
- 在工具内部添加严格的参数验证
- 当工具调用失败时,返回详细的错误信息,让Agent可以调整参数重试
4. ❌ 记忆溢出
问题:对话历史太长,超过了大模型的上下文窗口限制
解决方案:
- 限制短期记忆的最大长度
- 定期总结对话历史,只保留重要信息
- 使用上下文压缩技术,只保留与当前任务相关的记忆
十一、本章总结与下章预告
本章总结
- AI Agent是具备自主感知、思考、规划和执行能力的智能体,能够主动完成用户给出的最终目标
- ReAct框架是目前最主流的Agent实现范式,核心是"思考-行动-观察"循环
- Spring AI 1.0提供了原生的Agent工作流支持,基于ReAct框架,使用非常简单
- 记忆系统是Agent的灵魂,分为短期记忆和长期记忆
- 任务规划能力让Agent能够处理复杂的多步骤任务
- 企业级Agent必须做好安全控制、可观测性和错误处理
预告式提及:我们现在已经掌握了AI Agent的核心原理和实现方法。下一章我们将把这些技术整合起来,实战开发一个功能完善的智能办公Agent,它能够自动完成邮件处理、文档生成、日程管理、数据查询等多种复杂任务。
下章预告
下一章我们将学习实战:开发一个智能办公Agent。你将学会:
- 智能办公Agent的需求分析与架构设计
- 工具集设计与实现:邮件、日历、文档、数据库工具
- Agent角色定制与系统提示词优化
- 多任务处理与上下文管理
- 完整代码实现与测试
十二、课后练习
- 实现一个基础的ReAct Agent,集成文件系统和命令执行MCP工具
- 为Agent添加短期记忆功能,测试多轮对话的上下文连续性
- 实现长期记忆功能,让Agent能够记住用户的偏好
- 测试Agent处理复杂任务的能力,比如"帮我整理上周的会议记录并生成会议纪要"
- 为你的Agent添加安全控制,对于删除文件等危险操作,要求用户确认
更多推荐
所有评论(0)