Spring AI、AgentScope 与 ReAct 在研发效能工具中的实践
1. 对应简历段落
这篇文章对应简历中“在研发效能场景中探索 Spring AI、AgentScope 和 ReAct 思想,构建面向 Java 团队的智能研发助手,支持需求理解、代码检索、接口说明、日志分析、测试建议、发布检查和工单辅助处理”的经历。
面试时这段不要讲成“写了一个 ChatGPT 套壳”。资深面试官会关注:为什么研发效能工具需要 Agent,Spring AI 在 Java 体系里解决什么问题,AgentScope 适合做什么编排,ReAct 如何让模型边思考边调用工具,以及如何控制工具权限、上下文长度、误操作和结果可信度。
可以这样表述:
面向 Java 研发团队搭建内部研发效能助手,使用 Spring AI 统一接入模型、Prompt、Embedding 和向量检索能力,借鉴 AgentScope 的多 Agent 编排思想拆分需求分析、代码检索、日志诊断和测试建议角色,并基于 ReAct 模式让模型在推理过程中按需调用代码搜索、知识库、CI、日志平台和工单系统工具,提高排障和需求理解效率。
这段经历重点体现 AI 工程化框架选择、Agent 设计和研发流程结合能力。
2. 业务背景
大型 Java 团队的研发效率瓶颈不只在写代码本身。很多时间消耗在理解需求、查历史逻辑、找接口文档、定位日志、分析 CI 失败、补测试、写发布说明和处理工单上。
比如一个新需求来了,研发需要看产品文档、查相关服务、理解数据库表、找历史工单、确认接口影响面。一个线上问题来了,需要查日志、看链路追踪、定位最近发布、比对配置、判断是否回滚。很多信息散落在 Git 仓库、Wiki、接口平台、日志平台、CI、工单系统和聊天记录里。
AI 研发助手的价值是把这些分散信息通过自然语言入口串起来。但如果只是把问题发给模型,模型并不知道公司代码、内部接口、近期发布和日志。它必须能检索内部知识、调用工具、逐步分析。
这就引出三个技术点。
Spring AI 适合 Java 团队,因为它把模型调用、Prompt 模板、Embedding、VectorStore、ChatClient 等能力封装成 Spring 风格,便于接入现有 Spring Boot 系统。
AgentScope 更强调 Agent 编排思想,可以把复杂任务拆给不同角色或步骤,例如需求分析 Agent、代码检索 Agent、测试建议 Agent、发布检查 Agent。
ReAct 是一种推理和行动交替的模式,让模型不是一次性给答案,而是在 Reasoning 和 Acting 之间循环:先判断需要什么信息,再调用工具,再基于观察结果继续分析。
3. 核心原理
Spring AI 的核心价值是降低 Java 应用接入大模型的工程成本。它提供 ChatClient、PromptTemplate、EmbeddingModel、VectorStore、Advisor 等抽象,让模型调用更像普通 Spring 服务。对 Java 团队来说,这比在业务代码里散落 HTTP 调用更可维护。
AgentScope 的价值在于任务组织。研发效能场景的问题往往不是单轮问答。例如“帮我分析这个接口改动影响哪些模块,并给测试建议”,需要理解需求、检索代码、查接口调用、总结风险、生成测试点。可以让一个总控 Agent 拆任务,再由不同子 Agent 处理。
ReAct 的价值在于让模型显式使用工具。它的基本循环是:
Thought: 我需要先找到相关接口定义。
Action: code.search({"keyword":"PolicyController"})
Observation: 找到 PolicyController 和 PolicyService。
Thought: 还需要查看最近修改和测试。
Action: git.diff({"module":"policy-service"})
Observation: 修改了续保校验逻辑。
Thought: 基于代码和 diff 给出影响面。
Final: ...
生产系统里通常不会把完整 Thought 暴露给用户,但内部编排可以保留结构化步骤:plan、tool_call、observation、answer。这样系统更可控,也方便审计和调试。
研发效能 Agent 的工具可以包括:
- code.search:代码关键词或语义检索。
- code.read:读取指定文件片段。
- git.diff:查看分支改动。
- ci.query:查询构建失败原因。
- log.search:查询日志。
- trace.query:查询链路追踪。
- wiki.search:检索内部文档。
- ticket.query:查询需求或缺陷。
- test.suggest:基于代码改动生成测试建议。
这些工具同样要做权限控制。研发助手不能让所有人读取所有仓库、所有日志和所有生产数据。
4. 项目落地
一个可落地的研发效能助手可以分成五层:入口层、编排层、工具层、知识层、审计层。
入口层可以接入 Web 页面、IDE 插件、企业 IM 或工单系统。用户可以问“这个需求影响哪些服务”“这个 CI 为什么失败”“这段日志是什么问题”“帮我补一份测试点”。
编排层使用 Spring Boot + Spring AI。ChatClient 负责模型调用,PromptTemplate 负责不同任务模板,VectorStore 负责代码和文档检索,Advisor 可以注入会话上下文和安全提示。对于复杂任务,编排层使用 AgentScope 思想,把任务拆给多个角色。
工具层封装研发系统。代码检索可以基于 Git 仓库索引和向量库;CI 工具对接 Jenkins、GitHub Actions 或内部流水线;日志工具对接 ELK、Loki 或 APM;工单工具对接 Jira、禅道或内部系统。所有工具统一走 Tool Runtime,做权限、限流和审计。
知识层包括代码索引、架构文档、接口文档、数据库字典、故障复盘、发布规范、测试规范。代码索引要定期更新,最好按仓库、分支、模块、文件路径、类名、方法名建立元数据。
审计层记录用户问题、工具调用、读取文件、日志查询范围、生成建议和用户采纳情况。研发助手可能访问敏感代码和生产日志,审计不能缺。
落地时建议从低风险场景开始:代码解释、文档问答、测试建议、CI 失败摘要。不要一开始就让 Agent 自动提交代码、自动发布或自动回滚。自动化动作要逐步引入人工确认。
5. 流程或伪代码
public DevAssistantAnswer ask(DevQuestion question, UserContext user) {
DevIntent intent = intentClassifier.classify(question.text());
AgentPlan plan = planner.plan(intent, question, user);
AgentMemory memory = new AgentMemory(question.text());
for (AgentStep step : plan.steps()) {
ToolDefinition tool = toolRegistry.find(step.toolName());
permissionService.check(user, tool.permissionCode(), step.arguments());
ToolResult observation = toolRuntime.execute(tool.name(), step.arguments(), user);
memory.addObservation(step, observation.safeContent());
if (memory.shouldStop()) {
break;
}
}
Prompt prompt = promptBuilder.buildFinalAnswer(question, memory, intent);
String answer = springAiChatClient.prompt(prompt.toString()).call().content();
auditLogger.record(question, user, plan, memory, answer);
return DevAssistantAnswer.of(answer, memory.visibleEvidence());
}
一个 ReAct 风格的日志分析流程可以是:
用户:支付回调接口今天 10 点后失败率升高,帮我分析。
Plan:查询告警 -> 查询日志 -> 查询最近发布 -> 总结可能原因。
Action:metric.query(payment-callback, 10:00-11:00)
Observation:失败率从 0.2% 升到 8%,主要错误码 SIGN_INVALID。
Action:log.search(keyword=SIGN_INVALID, service=payment)
Observation:大量日志显示 partnerKey 为空。
Action:deploy.query(service=payment, today)
Observation:09:55 发布配置加载改动。
Final:疑似配置读取兼容问题,建议回滚或补充 partnerKey 配置,并增加测试。
这类流程比单纯“把日志粘给模型”更可靠,因为每个结论都有工具观察支撑。
6. 安全边界
第一,代码权限边界。不同团队、仓库、分支可能有不同权限。Agent 检索代码前必须校验用户是否有仓库访问权限。
第二,日志数据边界。生产日志可能包含手机号、身份证、token、订单号。日志工具要脱敏,查询范围要限制,敏感字段不能直接送模型。
第三,动作边界。研发助手可以建议修改、生成 patch、创建工单,但自动提交、合并、发布、回滚必须人工确认,甚至走审批。
第四,上下文边界。不要把整个仓库或大段日志塞给模型。要做检索、摘要和片段裁剪,避免泄露无关信息和超上下文。
第五,工具边界。不要提供 shell.execute 这种万能工具给模型。研发工具要细粒度封装,如 code.search、ci.query、log.search。
第六,结论边界。AI 给出的根因分析是辅助判断,尤其线上故障场景,必须标明证据和不确定性。
第七,审计边界。访问了哪些代码、查了哪些日志、调用了哪些工具,都要记录,便于安全审计。
7. 常见坑
第一个坑是把 Agent 做成无限循环。ReAct 如果没有最大步数、超时和停止条件,可能反复调用工具。
第二个坑是工具太强。给模型一个通用命令执行工具,看似能力强,安全风险极高。企业研发助手要工具白名单。
第三个坑是上下文污染。检索到一堆无关代码,模型会基于噪声生成错误结论。代码检索要重视 rerank 和路径过滤。
第四个坑是忽略权限。研发效能工具常常访问代码和日志,如果权限控制弱,风险不比业务系统小。
第五个坑是把 Agent 输出当事实。模型总结的根因必须有日志、指标、代码或发布记录支撑。
第六个坑是一次性做太大。研发助手最好从一个场景打穿,比如 CI 失败分析,再扩展到日志诊断和测试建议。
第七个坑是没有采纳反馈。开发者是否接受建议、是否解决问题,是优化 Agent 的重要信号。
8. 面试追问
面试官可能问:Spring AI 解决了什么?回答:它把模型、Prompt、Embedding、VectorStore 等能力封装成 Spring 风格,方便 Java 应用集成和治理。
可能问:AgentScope 和普通链式调用有什么区别?回答:AgentScope 更强调角色、任务和多 Agent 协作,适合把复杂研发任务拆成多个职责明确的子任务。
可能问:ReAct 的优势是什么?回答:让模型在推理中按需调用工具,结论基于观察结果,而不是一次性凭空回答。
可能问:怎么防止 Agent 乱调用工具?回答:工具白名单、权限校验、最大步数、超时、风险分级、人工确认和审计。
可能问:代码检索怎么做?回答:结合关键词检索、语义向量、文件路径和符号元数据,按仓库权限过滤,再 rerank。
可能问:研发助手如何评估效果?回答:可以看问题解决率、建议采纳率、CI 分析准确率、平均排障时间、工具调用成功率、人工反馈。
9. 推荐回答
推荐回答如下:
我们在研发效能场景里没有把 AI 助手做成纯聊天,而是让它能安全使用研发工具。底层用 Spring AI 接入模型、Prompt、Embedding 和向量检索,这样比较符合 Java 团队的技术栈。复杂任务上借鉴 AgentScope,把需求分析、代码检索、日志诊断、测试建议拆成不同职责。
编排上使用 ReAct 思路,模型不是直接给结论,而是先判断需要什么信息,再调用代码搜索、CI、日志、工单或文档工具,拿到 observation 后继续分析。最终回答会带证据,比如相关文件、日志摘要、构建失败原因或发布记录。
安全上所有工具都走统一 Tool Runtime,按用户校验仓库和日志权限,生产日志先脱敏,自动提交代码、发布、回滚这类动作不允许模型直接执行,只能生成建议或草稿并等待人工确认。这样既能提升研发效率,又不会把 AI 变成不可控的运维入口。
这个回答既体现框架理解,也体现企业落地边界。
10. 延伸学习路线
第一阶段学习 Spring AI:ChatClient、PromptTemplate、EmbeddingModel、VectorStore、Advisor、Tool Calling,做一个 Java 问答 Demo。
第二阶段学习 RAG for Code:代码切分、符号索引、仓库元数据、语义检索、调用关系分析。
第三阶段学习 Agent 模式:ReAct、Plan-and-Execute、多 Agent 协作、反思机制、工具失败恢复。
第四阶段学习研发平台集成:Git、CI、日志、APM、工单、Wiki、接口平台,把它们封装成安全工具。
第五阶段学习治理和评测:权限、脱敏、审计、最大步数、工具选择准确率、建议采纳率、排障时间指标。
最终可以做一个内部研发助手项目:支持“解释代码”“分析 CI 失败”“根据 diff 生成测试建议”“查询日志并总结根因”。这类项目在 Java / AI 工程化面试中很容易展开,能展示你对模型、工具和研发流程的综合理解。