☰
第三章:3、Agent架构模式
2026/10/15 15:47:26 网站建设 项目流程

要点

  • ReAct模式:推理(Reasoning)与行动(Acting)循环,Agent自主规划并执行步骤。
  • Plan-and-Execute模式:先制定完整计划,再逐步执行各项任务。
  • Human-in-the-Loop:关键步骤由人工确认,降低Agent自主决策的风险。
  • Spring AI Alibaba Agent Framework:快速构建AI Agent的实用框架。
  • 结构化输出(Structured Output):支持Agent直接返回Java POJO对象,便于集成。

一、ReAct模式——让Agent“思考-行动-观察”

1. 理解ReAct模式

Thought(思考):用户问payment-service的问题,我需要先确认服务状态
Action(行动):调用checkServiceHealth("payment-service")
Observation(观察):服务DOWN,CPU 98%,连接池耗尽
Thought:连接池耗尽可能是慢查询导致的,我需要查看数据库状态
Action:调用getDbPoolStatus("master")
Observation:活跃连接48/50,有慢查询12.3s
Thought:根因是慢查询导致连接池耗尽,我需要查看具体错误日志确认
Action:调用getRecentErrors("payment-service", 60)
Observation:HikariPool连接超时89次
Thought:确认根因是慢查询导致连接池耗尽,结合知识库中的历史方案给出建议
Final Answer:...
核心思想:模型不是一次性调用所有工具,而是每一步都先“思考”,再“行动”,根据上一步的结果决定下一步操作。

2. System Prompt引导ReAct行为

Spring AI 2.0 的 ToolCallingAdvisor 已内置工具调用循环,本质即ReAct实现。只需通过System Prompt引导模型推理风格:
.defaultSystem(""" 你是一个智能运维助手,遵循以下工作流程排查问题: 1. 理解问题:明确用户描述的现象和影响范围 2. 收集信息:使用工具查询服务状态、错误日志、数据库连接池等 3. 分析根因:根据收集到的信息,逐步缩小问题范围 4. 查阅方案:从知识库中检索类似问题的历史处理方案 5. 给出建议:提供短期修复方案和长期优化建议 每一步都要说明你的推理过程,让用户了解排查思路。 """)

3. ReAct效果测试

curl "http://localhost:8080/agent/ops/chat?message=用户反馈下单很慢,帮我排查一下原因"
观察点:
  • 是否先查 order-service 健康状态
  • 是否查错误日志
  • 是否查数据库连接池
  • 是否能综合所有信息给出结论

二、自定义Advisor——观测工具调用过程

1. 编写工具调用日志Advisor

import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.ai.chat.client.ChatClientRequest; import org.springframework.ai.chat.client.ChatClientResponse; import org.springframework.ai.chat.client.advisor.api.BaseAdvisor; import org.springframework.ai.chat.client.advisor.api.AdvisorChain; import org.springframework.ai.chat.messages.AssistantMessage; import org.springframework.stereotype.Component; /** * 工具调用日志记录(同时支持同步和流式) * <p> * Spring AI 2.0 API: * - 实现 BaseAdvisor(同时支持 CallAdvisor + StreamAdvisor) * - 只需实现 before() 和 after(),adviseCall()/adviseStream() 由 BaseAdvisor 默认实现调用 * * @author hejie */ @Component public class ToolCallLoggingAdvisor implements BaseAdvisor { private static final Logger log = LoggerFactory.getLogger(ToolCallLoggingAdvisor.class); @Override public ChatClientRequest before(ChatClientRequest request, AdvisorChain advisorChain) { // 请求前:记录用户输入 log.info("【Agent请求】用户消息: {}", request.prompt().getContents()); return request; } @Override public ChatClientResponse after(ChatClientResponse response, AdvisorChain advisorChain) { // 请求后:记录模型响应(可能是文本,也可能是工具调用) if (response.chatResponse() == null || response.chatResponse().getResults() == null || response.chatResponse().getResults().isEmpty()) { return response; } response.chatResponse().getResults().forEach(result -> { AssistantMessage output = result.getOutput(); if (output == null) { return; } // 情况1:模型返回工具调用(无文本,有ToolCall列表) if (output.getToolCalls() != null && !output.getToolCalls().isEmpty()) { output.getToolCalls().forEach(toolCall -> { log.info("【Agent响应】触发工具调用: {} (参数: {})", toolCall.name(), toolCall.arguments()); }); return; } // 情况2:模型返回文本内容 String text = output.getText(); if (text != null && !text.isBlank()) { // 流式场景下可能是分片,截取前500字符避免日志过长 String preview = text.length() > 500 ? text.substring(0, 500) + "...(截断)" : text; log.info("【Agent响应】{}", preview); } }); return response; } @Override public int getOrder() { // order值越小越先执行(最先处理请求,最后处理响应) return 0; } }

2. 注册到Advisor链

/** * Agent配置类 */ @Configuration public class AgentConfig { @Bean public ChatClient opsAgentChatClient(ChatClient.Builder builder, OpsTools opsTools, VectorStore vectorStore, ChatMemory chatMemory, ToolCallLoggingAdvisor loggingAdvisor) { return builder .defaultSystem(""" 你是一个智能运维助手,遵循以下工作流程排查问题: 1. 理解问题:明确用户描述的现象和影响范围 2. 收集信息:使用工具查询服务状态、错误日志、数据库连接池等 3. 分析根因:根据收集到的信息,逐步缩小问题范围 4. 查阅方案:从知识库中检索类似问题的历史处理方案 5. 给出建议:提供短期修复方案和长期优化建议 每一步都要说明你的推理过程,让用户了解排查思路。 """) .defaultOptions(ChatOptions.builder() .temperature(0.1) // 工具调用场景用低temperature ) .defaultAdvisors( loggingAdvisor, // 日志观测(最先执行) // 对话记忆(保留最近10轮) MessageChatMemoryAdvisor.builder(chatMemory) .order(0) .build(), // RAG知识库检索(允许空上下文:检索不到文档时保留原始用户消息,让LLM能触发工具调用) RetrievalAugmentationAdvisor.builder() .order(1) .documentRetriever(VectorStoreDocumentRetriever.builder() .vectorStore(vectorStore) .similarityThreshold(0.7) .topK(6) .build()) // 查询增强,允许知识库检索为空 .queryAugmenter(ContextualQueryAugmenter.builder() .allowEmptyContext(true) .build()) .build(), ToolCallingAdvisor.builder() .toolCallingManager(ToolCallingManager.builder() .maxTotalToolCalls(10)// 最多调用10次工具 .build()) .build() ) // 注册运维工具 .defaultTools(opsTools) .build(); } }

3. 测试日志观测

  • 调用接口后,检查日志输出,确认能完整记录请求和响应过程。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询