Unity UIWidgets 入门:环境搭建、首个界面与核心架构全解析
2026/10/15 19:12:20
Thought(思考):用户问payment-service的问题,我需要先确认服务状态Action(行动):调用checkServiceHealth("payment-service")Observation(观察):服务DOWN,CPU 98%,连接池耗尽Thought:连接池耗尽可能是慢查询导致的,我需要查看数据库状态Action:调用getDbPoolStatus("master")Observation:活跃连接48/50,有慢查询12.3sThought:根因是慢查询导致连接池耗尽,我需要查看具体错误日志确认Action:调用getRecentErrors("payment-service", 60)Observation:HikariPool连接超时89次Thought:确认根因是慢查询导致连接池耗尽,结合知识库中的历史方案给出建议Final Answer:...
.defaultSystem(""" 你是一个智能运维助手,遵循以下工作流程排查问题: 1. 理解问题:明确用户描述的现象和影响范围 2. 收集信息:使用工具查询服务状态、错误日志、数据库连接池等 3. 分析根因:根据收集到的信息,逐步缩小问题范围 4. 查阅方案:从知识库中检索类似问题的历史处理方案 5. 给出建议:提供短期修复方案和长期优化建议 每一步都要说明你的推理过程,让用户了解排查思路。 """)curl "http://localhost:8080/agent/ops/chat?message=用户反馈下单很慢,帮我排查一下原因"
- 是否先查 order-service 健康状态
- 是否查错误日志
- 是否查数据库连接池
- 是否能综合所有信息给出结论
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; } }/** * 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(); } }
- 调用接口后,检查日志输出,确认能完整记录请求和响应过程。