一、本章核心学习目标

学完本章,你将能够:

  1. 深刻理解AI Agent的本质与核心价值
  2. 掌握ReAct框架的工作原理与实现逻辑
  3. 熟练使用Spring AI 1.0原生Agent工作流
  4. 实现Agent的短期记忆与长期记忆系统
  5. 掌握任务分解与规划技术
  6. 构建一个具备自主思考和执行能力的基础Agent
  7. 理解Agent的常见架构与演进方向

二、前置知识准备

  • 已经完成前12篇的学习,熟练掌握工具调用与MCP协议
  • 理解ChatClient与提示词工程的核心方法
  • 了解向量数据库的基本使用
  • 掌握Spring Boot的依赖注入与配置管理

三、为什么我们需要AI Agent?

在前12篇的学习中,我们已经实现了两个核心能力:

  1. RAG知识库系统:让大模型能够回答基于私有知识的问题
  2. 工具调用能力:让大模型能够执行外部操作

但这两个能力都是被动的:大模型只能响应用户的明确指令,不能主动思考和规划。

被动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执行过程

  1. 思考:我需要先获取项目的最新进展,然后写周报,最后发送邮件。首先我应该读取项目文档。
  2. 行动:调用read_file工具读取/data/project-report.md
  3. 观察:获取到项目文档内容
  4. 思考:现在我有了项目数据,我需要根据这些数据写一份周报。
  5. 行动:调用write_file工具生成weekly-report-2026-06.md
  6. 观察:周报生成成功
  7. 思考:周报已经生成,现在我需要发送邮件给团队。
  8. 行动:调用send_email工具发送邮件
  9. 观察:邮件发送成功
  10. 思考:所有步骤都已完成,任务结束。
  11. 最终回答:已为你生成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会自动:

  1. 调用list_files工具列出目录下的文件
  2. 筛选出Markdown文件
  3. 调用read_file工具读取每个文件的标题
  4. 生成目录索引
  5. 返回最终结果

关键观察:你不需要告诉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. ❌ 记忆溢出

问题:对话历史太长,超过了大模型的上下文窗口限制
解决方案

  • 限制短期记忆的最大长度
  • 定期总结对话历史,只保留重要信息
  • 使用上下文压缩技术,只保留与当前任务相关的记忆

十一、本章总结与下章预告

本章总结

  1. AI Agent是具备自主感知、思考、规划和执行能力的智能体,能够主动完成用户给出的最终目标
  2. ReAct框架是目前最主流的Agent实现范式,核心是"思考-行动-观察"循环
  3. Spring AI 1.0提供了原生的Agent工作流支持,基于ReAct框架,使用非常简单
  4. 记忆系统是Agent的灵魂,分为短期记忆和长期记忆
  5. 任务规划能力让Agent能够处理复杂的多步骤任务
  6. 企业级Agent必须做好安全控制、可观测性和错误处理

预告式提及:我们现在已经掌握了AI Agent的核心原理和实现方法。下一章我们将把这些技术整合起来,实战开发一个功能完善的智能办公Agent,它能够自动完成邮件处理、文档生成、日程管理、数据查询等多种复杂任务。

下章预告

下一章我们将学习实战:开发一个智能办公Agent。你将学会:

  • 智能办公Agent的需求分析与架构设计
  • 工具集设计与实现:邮件、日历、文档、数据库工具
  • Agent角色定制与系统提示词优化
  • 多任务处理与上下文管理
  • 完整代码实现与测试

十二、课后练习

  1. 实现一个基础的ReAct Agent,集成文件系统和命令执行MCP工具
  2. 为Agent添加短期记忆功能,测试多轮对话的上下文连续性
  3. 实现长期记忆功能,让Agent能够记住用户的偏好
  4. 测试Agent处理复杂任务的能力,比如"帮我整理上周的会议记录并生成会议纪要"
  5. 为你的Agent添加安全控制,对于删除文件等危险操作,要求用户确认
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐