基于Spring AI构建AI Agent团队:从概念到代码生成与审查实战

基于Spring AI构建AI Agent团队:从概念到代码生成与审查实战 1. 背景与核心概念从“代码秀”到AI Agent驱动的软件工程新范式最近在技术社区和开发者大会的预热中一个名为“代码秀”的概念频繁出现它描绘了未来软件工程的一种可能形态在类似2026年技术峰会的现场一个由AI驱动的开发团队能够实时协作将产品需求、架构设计、编码实现、测试部署等环节无缝衔接进行一场高效、透明的“现场秀”。这并非遥不可及的科幻而是当前AI Agent技术、大模型应用与软件工程实践深度融合的必然趋势。对于每一位开发者而言理解并掌握构建AI Agent团队的能力已成为提升个人和团队生产力的关键。那么什么是“代码秀”背后的核心支撑技术答案就是AI Agent。简单来说AI Agent是一个能够感知环境、自主决策并执行任务以达成目标的智能体。在软件开发语境下它不再是一个简单的代码补全工具而是一个拥有特定角色如架构师、后端开发、测试工程师的“虚拟开发者”。多个AI Agent可以组成一个团队各司其职协同完成从需求分析到代码交付的完整流程。为什么我们需要关注这个趋势传统的软件开发流程存在诸多痛点需求沟通成本高、不同环节信息断层、重复性编码工作耗时、知识传承困难等。AI Agent团队的引入旨在将这些流程自动化、智能化让开发者从繁琐的重复劳动中解放出来更专注于核心的架构设计、创造性问题解决和业务逻辑深化。无论是快速原型验证、遗留代码重构还是自动化测试生成AI Agent都能显著提升工程效率。2. 环境准备与版本说明要动手搭建一个简易的AI Agent开发环境我们不需要等待2026年。现在就可以利用成熟的开源框架和云服务开始实验。本文将基于Spring AI一个简化AI应用开发的Spring生态项目和大语言模型API如OpenAI GPT、通义千问等来构建一个具备基础能力的AI Agent。你可以根据项目实际情况选择不同的模型后端。基础环境要求操作系统: Windows 10/11, macOS 10.14, 或主流的Linux发行版如Ubuntu 20.04。Java开发环境: JDK 17 或更高版本Spring AI 2.x 推荐JDK 17。本文示例使用JDK 17。构建工具: Apache Maven 3.6 或 Gradle 7.x。本文使用Maven。IDE: IntelliJ IDEA推荐对Spring Boot支持好、VS Code 或 Eclipse。模型API访问: 你需要一个可用的大语言模型API密钥例如来自OpenAI、Azure OpenAI、Anthropic Claude或国内的阿里云灵积、百度千帆等。本文将使用OpenAI GPT-4o作为示例但框架是通用的。关键依赖版本说明本文的核心是Spring AI框架它抽象了与不同AI服务的交互。请确保你的pom.xml中引入正确版本的依赖。Spring AI版本迭代较快以下配置以当前稳定的1.0.0 M2版本为例生产环境请使用稳定版。!-- 在项目的 pom.xml 文件中 -- parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.3.0/version !-- 使用Spring Boot 3.3.x -- relativePath/ /parent dependencies !-- Spring AI 核心依赖 -- dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-openai-spring-boot-starter/artifactId version1.0.0-M2/version !-- 注意版本 -- /dependency !-- 其他必要依赖 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency /dependencies重要提示Spring AI和各大模型API的版本更新频繁接口可能发生变化。如果遇到依赖无法解析或类找不到的问题请优先查看 Spring AI官方文档 和所选模型服务商的最新集成指南调整依赖版本和配置方式。3. 核心概念与架构拆解AI Agent团队是如何工作的在深入代码之前我们需要厘清几个关键概念这有助于我们设计出更合理的Agent系统。3.1 AI Agent的核心组件一个功能完整的AI Agent通常包含以下部分规划器Planner解析复杂任务将其拆解为一系列可执行的子任务或步骤。例如接到“开发一个用户登录API”的任务规划器会将其拆解为“设计数据库表”、“编写实体类”、“实现Service层”、“创建Controller”等。工具ToolsAgent执行具体操作的能力延伸。工具可以是代码执行器在安全沙箱中运行生成的代码片段。网络搜索器获取最新信息。文件读写器读取项目现有代码或写入新代码。命令行工具执行系统命令如git,mvn。专用API调用调用内部或第三方服务。记忆Memory使Agent拥有上下文感知能力。包括短期记忆对话历史记住当前会话中用户说过的话和Agent的回复。长期记忆向量数据库将项目文档、代码库、设计稿等知识转换成向量存储供Agent检索使其具备“项目知识”。执行器Executor协调规划、工具调用和记忆最终执行任务并返回结果。3.2 多Agent协作模式“代码秀”场景依赖于多Agent协作。常见的模式有主从模式Manager-Worker一个“经理”Agent负责接收总任务、进行规划并将子任务分发给不同的“工人”Agent如前端Agent、后端Agent、测试Agent执行最后汇总结果。辩论模式Debate多个Agent针对同一问题如技术选型提出不同方案并进行辩论最终综合出一个最优解。流水线模式Pipeline任务像流水线一样经过多个Agent每个Agent完成特定环节的处理。例如需求分析Agent - 架构设计Agent - 编码Agent - 代码审查Agent。3.3 Spring AI中的抽象Spring AI为我们提供了构建Agent所需的核心抽象ChatClient: 与AI模型对话的客户端。PromptTemplate: 提示词模板用于结构化地生成给模型的指令。VectorStore: 向量存储接口用于实现长期记忆。Function Calling/Tools: 让大模型具备调用外部函数工具的能力这是实现Agent自主性的关键。理解了这些我们就知道构建一个AI Agent本质上是为一个大语言模型配备规划能力、一系列可调用的工具函数、一个记忆系统并通过程序逻辑将它们有机结合起来。4. 完整实战案例构建一个代码生成与审查双Agent系统现在我们动手实现一个简化版的“双Agent团队”一个代码生成Agent和一个代码审查Agent。生成Agent负责根据自然语言描述编写Java Spring Boot代码审查Agent负责检查生成的代码是否存在常见问题如空指针、资源未关闭、SQL注入风险等。4.1 项目初始化与配置首先使用Spring Initializr创建一个新项目选择Spring Boot 3.3.x添加Spring Web和Lombok依赖。然后手动添加上文提到的spring-ai-openai依赖。创建配置文件application.yml配置模型连接信息# application.yml spring: ai: openai: api-key: ${OPENAI_API_KEY:} # 建议通过环境变量设置密钥 chat: options: model: gpt-4o # 或 gpt-3.5-turbo gpt-4o 效果更好 temperature: 0.7 # 创造性代码生成建议0.3-0.7 max-tokens: 2000 # 如果使用其他模型如Azure OpenAI或通义千问需配置对应的base-url和api-key字段具体参考Spring AI文档。重要安全提示API密钥务必通过环境变量OPENAI_API_KEY或安全的配置中心管理切勿直接硬编码在配置文件中提交到代码仓库。4.2 定义工具Tools我们为Agent定义两个基础工具一个文件写入工具模拟保存代码一个静态代码分析工具模拟基础审查。// 文件路径src/main/java/com/example/codeshow/tool/CodeFileWriterTool.java package com.example.codeshow.tool; import org.springframework.stereotype.Component; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; Component public class CodeFileWriterTool { /** * 将生成的代码内容写入到项目的指定路径。 * param filePath 相对项目根目录的路径如 “src/main/java/com/example/demo/UserController.java” * param content 代码内容 * return 写入结果信息 */ public String writeCodeToFile(String filePath, String content) { try { Path path Paths.get(filePath); // 确保目录存在 Files.createDirectories(path.getParent()); // 写入文件如果文件存在则覆盖 Files.writeString(path, content, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); return String.format(代码已成功写入文件: %s, filePath); } catch (Exception e) { return String.format(写入文件失败 [%s]: %s, filePath, e.getMessage()); } } }// 文件路径src/main/java/com/example/codeshow/tool/SimpleCodeReviewTool.java package com.example.codeshow.tool; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; Component public class SimpleCodeReviewTool { /** * 对给定的Java代码进行简单的静态模式检查。 * param code Java代码字符串 * return 审查结果和建议列表 */ public String reviewCode(String code) { ListString issues new ArrayList(); // 检查1: 是否存在明显的空指针解引用 (简化版匹配 . 前面可能为null的变量名) if (Pattern.compile(\\b(\\w)\\.\\w\\s*(?\\(|\\s*)).matcher(code).find()) { // 这是一个非常粗略的检查真实场景需要更复杂的AST分析 issues.add(警告代码中存在对象方法调用请确保对象不为null。); } // 检查2: 是否使用了 println (生产代码不推荐) if (code.contains(System.out.println)) { issues.add(建议生产代码中请使用日志框架如SLF4J替代 System.out.println。); } // 检查3: 是否存在简单的SQL拼接提示SQL注入风险 if (Pattern.compile((?i).*\SELECT.*\\.*\.*|.*\INSERT.*\\.*\.*).matcher(code).find()) { issues.add(严重发现字符串拼接SQL语句存在SQL注入风险请使用预编译语句PreparedStatement或JPA。); } // 检查4: 是否关闭了资源如Connection, BufferedReader if (Pattern.compile(new\\s(BufferedReader|FileReader|Connection)).matcher(code).find() !Pattern.compile(try-with-resources).matcher(code).find() !code.contains(.close())) { issues.add(警告创建了可能需要关闭的资源如IO流、数据库连接请确保在finally块中关闭或使用try-with-resources语法。); } if (issues.isEmpty()) { return 静态检查未发现明显问题。请注意此检查仅为简单模式匹配仍需人工进行深入审查。; } else { return 审查发现以下问题\n String.join(\n, issues); } } }4.3 构建AI Agent服务接下来我们创建两个Agent服务。这里我们使用Spring AI的ChatClient和PromptTemplate并手动集成上面定义的工具。更复杂的编排可以使用Spring AI的Agent模块或LangChain4j等框架。// 文件路径src/main/java/com.example.codeshow.service/CodeGenAgentService.java package com.example.codeshow.service; import com.example.codeshow.tool.CodeFileWriterTool; import lombok.RequiredArgsConstructor; import org.springframework.ai.chat.ChatClient; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.chat.prompt.PromptTemplate; import org.springframework.stereotype.Service; import java.util.Map; Service RequiredArgsConstructor public class CodeGenAgentService { private final ChatClient chatClient; private final CodeFileWriterTool fileWriterTool; // 用于代码生成的提示词模板 private static final String CODE_GEN_PROMPT_TEMPLATE 你是一个资深的Java Spring Boot后端开发工程师。请根据以下需求生成完整、可运行、符合最佳实践的代码。 要求 1. 代码必须是完整的包含必要的类、方法、注解。 2. 使用Spring Boot 3.x 和 Java 17 的语法特性。 3. 遵循RESTful API设计规范。 4. 包含必要的异常处理。 5. 如果涉及数据库使用Spring Data JPA和Hibernate假设实体类已存在。 6. 最终只输出代码本身不要有任何额外的解释或Markdown标记。 开发需求 {requirement} ; public String generateCode(String requirement) { // 1. 构建提示词 PromptTemplate promptTemplate new PromptTemplate(CODE_GEN_PROMPT_TEMPLATE); Prompt prompt promptTemplate.create(Map.of(requirement, requirement)); // 2. 调用大模型生成代码 String generatedCode chatClient.call(prompt).getResult().getOutput().getContent(); // 3. (可选) 调用工具保存代码到文件这里我们模拟一个固定路径 // 在实际应用中路径可以根据需求动态生成 String mockFilePath src/main/java/com/example/demo/generated/GeneratedController.java; String writeResult fileWriterTool.writeCodeToFile(mockFilePath, generatedCode); System.out.println(文件保存结果: writeResult); // 生产环境应使用日志 return generatedCode; } }// 文件路径src/main/java/com/example/codeshow/service/CodeReviewAgentService.java package com.example.codeshow.service; import com.example.codeshow.tool.SimpleCodeReviewTool; import lombok.RequiredArgsConstructor; import org.springframework.ai.chat.ChatClient; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.chat.prompt.PromptTemplate; import org.springframework.stereotype.Service; import java.util.Map; Service RequiredArgsConstructor public class CodeReviewAgentService { private final ChatClient chatClient; private final SimpleCodeReviewTool codeReviewTool; private static final String CODE_REVIEW_PROMPT_TEMPLATE 你是一个严谨的代码审查专家。请对以下Java代码进行审查重点关注 1. **代码风格**命名规范、缩进、注释。 2. **潜在缺陷**空指针异常、资源泄漏、并发问题、性能瓶颈。 3. **安全性**SQL注入、XSS、CSRF防护如果涉及Web。 4. **设计模式**是否符合单一职责、开闭原则等。 5. **Spring Boot最佳实践**注解使用是否正确、配置是否合理。 请以清晰的结构化格式如列表给出审查意见对每个问题指出位置行号或代码片段和修改建议。 待审查代码 {code} 同时以下是我们通过基础工具扫描发现的问题供你参考 {toolFindings} ; public String reviewCode(String code) { // 1. 先用静态工具进行初步扫描 String toolFindings codeReviewTool.reviewCode(code); // 2. 构建结合了工具结果的提示词交给更智能的LLM进行深度审查 PromptTemplate promptTemplate new PromptTemplate(CODE_REVIEW_PROMPT_TEMPLATE); Prompt prompt promptTemplate.create(Map.of( code, code, toolFindings, toolFindings )); // 3. 调用大模型进行深度审查 return chatClient.call(prompt).getResult().getOutput().getContent(); } }4.4 创建协调控制器与运行验证最后我们创建一个REST控制器来协调两个Agent的工作模拟一个简单的“需求-生成-审查”流水线。// 文件路径src/main/java/com/example/codeshow/controller/CodeShowController.java package com.example.codeshow.controller; import com.example.codeshow.service.CodeGenAgentService; import com.example.codeshow.service.CodeReviewAgentService; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.Map; RestController RequestMapping(/api/code-show) RequiredArgsConstructor public class CodeShowController { private final CodeGenAgentService codeGenAgent; private final CodeReviewAgentService codeReviewAgent; PostMapping(/generate-and-review) public MapString, String generateAndReview(RequestBody MapString, String request) { String requirement request.get(requirement); if (requirement null || requirement.isBlank()) { return Map.of(error, 需求描述不能为空); } // 步骤1: 代码生成Agent工作 String generatedCode codeGenAgent.generateCode(requirement); // 步骤2: 代码审查Agent工作 String reviewComments codeReviewAgent.reviewCode(generatedCode); return Map.of( generatedCode, generatedCode, reviewComments, reviewComments ); } }4.5 启动与测试将OPENAI_API_KEY设置为你的环境变量。启动Spring Boot应用。使用curl、Postman或任何HTTP客户端发送POST请求进行测试。# 示例请求 curl -X POST http://localhost:8080/api/code-show/generate-and-review \ -H Content-Type: application/json \ -d { requirement: 创建一个Spring Boot REST控制器实现用户管理功能包含根据ID查询用户、新增用户、分页查询用户列表三个接口。用户实体有id(Long), username(String), email(String)字段。 }4.6 结果说明你将收到一个JSON响应包含generatedCode和reviewComments两个字段。generatedCode字段是AI生成的完整Java控制器代码reviewComments字段包含了从静态检查到AI深度分析的审查意见。同时在项目目录下你会找到生成的代码文件src/main/java/com/example/demo/generated/GeneratedController.java。这个简单的双Agent系统已经展示了自动化“开发-审查”流程的雏形。5. 常见问题与排查思路在构建和运行AI Agent应用时你可能会遇到以下典型问题问题现象常见原因解决思路启动失败提示No qualifying bean of type ‘ChatClient‘1. Spring AI依赖未正确引入或版本冲突。2. 未配置AI模型连接信息如api-key。1. 检查pom.xml依赖确保版本与Spring Boot兼容。运行mvn dependency:tree查看依赖冲突。2. 检查application.yml配置确保spring.ai.openai.api-key已设置或通过环境变量OPENAI_API_KEY设置。调用Agent接口超时或返回空1. 网络问题无法访问模型API。2. API密钥无效或额度不足。3. 模型名称配置错误如将gpt-4写成gpt4。4. 提示词导致模型输出被截断或格式错误。1. 检查网络连接尝试ping模型服务地址。2. 登录模型供应商控制台检查密钥状态和余额。3. 核对application.yml中的model参数确保是有效的模型名。4. 简化提示词测试查看原始API返回。在代码中打印或记录ChatClient的完整响应。生成的代码质量差或不符合要求1. 提示词Prompt不够清晰、具体。2. 模型温度temperature参数设置过高导致随机性太大。3. 任务本身过于复杂超出了单次对话的上下文长度或模型能力。1.优化提示词工程明确角色、任务、约束条件、输出格式。提供少量示例Few-shot Learning效果显著。2. 对于代码生成任务将temperature调低如0.3增加确定性。3. 采用任务分解策略让规划器Agent先将大任务拆解再分发给执行Agent。工具Tools无法被Agent调用1. 在Spring AI中工具需要以特定方式暴露给ChatClient例如通过Bean定义FunctionCallback。本文示例是手动调用未使用AI自动调用工具功能。2. 工具函数的描述不够清晰导致大模型不理解何时调用。1. 若需AI自动调用工具请参考Spring AI官方文档关于Function Calling的章节使用Bean定义FunctionCallback包装你的工具类。2. 为工具函数编写详细、结构化的描述包括函数名、参数说明、功能描述。内存向量数据库检索不准1. 文本切分Chunking策略不合理导致检索上下文不完整。2. 嵌入模型Embedding Model不适合当前领域。3. 检索时返回的片段数量k值设置不当。1. 根据文档类型代码、文档、日志调整切分大小和重叠区。2. 尝试不同的嵌入模型如OpenAI的text-embedding-3-small或开源的BGE模型。3. 调整检索的top-k值并通过RAG检索增强生成评估效果。6. 最佳实践与工程建议将AI Agent引入软件工程流程不仅仅是技术集成更涉及工程方法和团队协作的变革。6.1 提示词工程Prompt Engineering提示词是Agent的“工作说明书”其质量直接决定输出结果。角色定义清晰明确告诉AI它扮演的角色“你是一位经验丰富的Java架构师”。任务描述具体避免模糊需求。使用“做什么”、“输入是什么”、“输出格式是什么”、“约束条件有哪些”的结构。提供示例对于复杂或格式固定的任务在提示词中提供1-2个输入输出示例Few-shot能极大提升效果。迭代优化将提示词视为代码一样管理进行版本控制并根据实际输出结果持续迭代优化。6.2 Agent系统设计单一职责每个Agent应专注于一个明确的领域如代码生成、单元测试、文档编写避免设计“全能”但不可靠的Agent。人机协同Agent不是替代开发者而是增强。设计流程时应保留关键的人工审核和决策节点如合并代码、发布生产。可观测性为Agent系统添加完善的日志记录记录每个Agent的输入Prompt、输出、调用的工具和耗时。这对于调试和优化至关重要。成本控制大模型API调用是主要成本。通过缓存频繁使用的提示词结果、设置Token上限、对非关键任务使用更经济的模型等方式进行控制。6.3 安全与合规代码安全永远不要让Agent在拥有高权限的生产环境中直接执行代码或命令。必须在严格隔离的沙箱Sandbox中运行生成的代码。数据隐私确保发送给模型API的数据不包含敏感信息密钥、用户个人数据、核心业务逻辑。考虑对数据进行脱敏或使用本地化部署的模型。结果审核AI生成的代码、设计或文档必须经过资深开发者的审查确保其正确性、安全性和符合公司规范。6.4 集成到现有流程CI/CD管道可以将代码审查Agent集成到Git的pre-commit钩子或CI流程中自动对提交的代码提供初步审查意见。知识库构建利用Agent的长期记忆能力将团队的项目文档、设计规范、API文档转化为向量知识库成为团队随时可查询的“超级助手”。渐进式采用从一个具体、高频、痛点的场景开始如自动生成单元测试、数据库迁移脚本、接口文档验证价值后再逐步推广。7. 总结与学习路线通过本文的拆解与实战我们完成了从理解“代码秀”愿景到亲手搭建一个简易AI Agent团队的过程。我们看到了如何利用Spring AI框架快速连接大模型能力如何定义工具扩展Agent的行动范围以及如何通过设计提示词和多Agent协作流程来完成一个软件工程任务。本文掌握的关键点概念理解AI Agent是由大模型驱动具备规划、工具使用和记忆能力的智能体是构建自动化开发流程的核心。环境搭建基于Spring Boot和Spring AI可以快速构建集成主流大模型的Java应用。核心开发通过定义Tool组件、设计结构化Prompt、调用ChatClient实现了代码生成和代码审查两个基础Agent。流程编排通过Controller层简单串联演示了多Agent流水线协作的基本模式。避坑指南总结了配置、调用、提示词、工具集成等方面的常见问题与解决方案。下一步学习路线建议深入Spring AI学习其Agent、VectorStore、Prompt Template等高级特性构建能自动调用工具的智能体。探索专业框架研究更成熟的Agent框架如LangChain4jJava版LangChain、AutoGen微软、CrewAI等它们提供了更强大的多Agent编排、任务分解和记忆管理能力。强化工程能力向量数据库学习使用Chroma、Weaviate、PgVectorPostgreSQL扩展或Milvus为Agent构建强大的长期记忆系统。复杂工具为Agent集成更专业的工具如调用JUnit执行测试、调用SonarQube进行代码质量分析、调用K8s API进行部署等。关注开源项目在GitHub上关注spring-projects/spring-ai、langchain4j等仓库了解最新特性和社区最佳实践。“代码秀”所代表的未来已来。作为开发者主动拥抱并驾驭AI Agent技术将其转化为提升研发效能、保障代码质量的利器是在智能化浪潮中保持竞争力的关键。从今天这个简单的双Agent系统开始逐步探索和构建属于你自己团队的“AI开发队友”吧。如果在实践中遇到任何问题欢迎在评论区交流探讨。