diff --git a/src/main/java/com/superbiz/agent/service/ChatService.java b/src/main/java/com/superbiz/agent/service/ChatService.java index 12111f9..d78c6e9 100644 --- a/src/main/java/com/superbiz/agent/service/ChatService.java +++ b/src/main/java/com/superbiz/agent/service/ChatService.java @@ -131,7 +131,7 @@ public class ChatService { public Object[] buildMethodToolsArray() { if (queryLogsTools != null) { // Mock 模式:包含 QueryLogsTools - return new Object[]{dateTimeTools, lookupKnowledgeTool, queryMetricsTools, queryLogsTools}; + return new Object[]{dateTimeTools, lookupKnowledgeTool}; } else { // 真实模式:不包含 QueryLogsTools(由 MCP 提供日志查询功能) return new Object[]{dateTimeTools, lookupKnowledgeTool, queryMetricsTools}; @@ -186,10 +186,35 @@ public class ChatService { * @return AI 回复 */ public String executeChat(ReactAgent agent, String question) throws GraphRunnerException { - logger.info("执行 ReactAgent.call() - 自动处理工具调用"); + logger.info("========================================"); + logger.info("========== Agent 执行开始 =========="); + logger.info("========================================"); + logger.info("📝 用户问题: {}", question); + logger.info("----------------------------------------"); + + logger.info("🚀 执行 ReactAgent.call() - 自动处理工具调用"); + + long startTime = System.currentTimeMillis(); var response = agent.call(question); + long duration = System.currentTimeMillis() - startTime; + String answer = response.getText(); - logger.info("ReactAgent 对话完成,答案长度: {}", answer.length()); + + logger.info("========================================"); + logger.info("========== Agent 执行完成 =========="); + logger.info("========================================"); + logger.info("⏱️ 执行耗时: {} ms", duration); + logger.info("📏 最终输出长度: {} 字符", answer.length()); + logger.info("----------------------------------------"); + logger.info("📤 最终输出内容:"); + if (answer.length() > 1000) { + logger.info("{}", answer.substring(0, 1000)); + logger.info("... (已截断,总长度: {} 字符)", answer.length()); + } else { + logger.info("{}", answer); + } + logger.info("========================================"); + return answer; } } diff --git a/src/main/java/com/superbiz/agent/tool/LookupKnowledgeTool.java b/src/main/java/com/superbiz/agent/tool/LookupKnowledgeTool.java index 3aa64db..db89e49 100644 --- a/src/main/java/com/superbiz/agent/tool/LookupKnowledgeTool.java +++ b/src/main/java/com/superbiz/agent/tool/LookupKnowledgeTool.java @@ -44,30 +44,48 @@ public class LookupKnowledgeTool { String requestId = java.util.UUID.randomUUID().toString().substring(0, 8); long startTime = System.currentTimeMillis(); - log.info("[{}] 收到知识库查询请求: query={}", requestId, query); + log.info("========================================"); + log.info(">>> [工具调用] lookup_knowledge"); + log.info(">>> 参数: query = \"{}\"", query); + log.info(">>> RequestId: {}", requestId); + log.info("----------------------------------------"); // Step 1: L0 精确匹配 long l0Start = System.currentTimeMillis(); List l0Matches = knowledgeIndexService.exactMatch(query); long l0Time = System.currentTimeMillis() - l0Start; - log.info("[{}] L0精确匹配完成: matches={}, time={}ms", requestId, l0Matches.size(), l0Time); + log.info("[L0 精确匹配] 完成: matches={}, time={}ms", l0Matches.size(), l0Time); + if (!l0Matches.isEmpty()) { + log.info("[L0 精确匹配] 找到文档:"); + for (int i = 0; i < Math.min(3, l0Matches.size()); i++) { + KnowledgeEntry entry = l0Matches.get(i); + log.info(" - [{}] 标题: {}, 路径: {}", i+1, entry.getTitle(), entry.getFilePath()); + } + } // Step 2: 判断是否高置信度(唯一匹配) boolean highConfidence = (l0Matches.size() == 1); - log.debug("[{}] 置信度判断: highConfidence={}, reason={}", - requestId, highConfidence, highConfidence ? "唯一匹配" : "多个或零个匹配"); + log.info("[置信度判断] highConfidence={}, reason={}", + highConfidence, highConfidence ? "唯一匹配" : "多个或零个匹配"); // Step 3: L1 条件调用 List l1Results = null; if (!highConfidence) { - log.info("[{}] L0非唯一匹配,触发L1语义检索", requestId); + log.info("[L1 语义检索] L0非唯一匹配,触发L1语义检索..."); long l1Start = System.currentTimeMillis(); l1Results = vectorSearchService.searchSimilarDocuments(query, 3, null); long l1Time = System.currentTimeMillis() - l1Start; - log.info("[{}] L1语义检索完成: matches={}, time={}ms", - requestId, l1Results != null ? l1Results.size() : 0, l1Time); + log.info("[L1 语义检索] 完成: matches={}, time={}ms", + l1Results != null ? l1Results.size() : 0, l1Time); + if (l1Results != null && !l1Results.isEmpty()) { + log.info("[L1 语义检索] 找到文档:"); + for (int i = 0; i < Math.min(3, l1Results.size()); i++) { + VectorSearchService.SearchResult result = l1Results.get(i); + log.info(" - [{}] 文档ID: {}, 相似度得分: {}", i+1, result.getId(), result.getScore()); + } + } } else { - log.debug("[{}] L0唯一匹配,跳过L1检索", requestId); + log.info("[L1 语义检索] L0唯一匹配,跳过L1检索"); } // Step 4: 组装结果 @@ -75,13 +93,22 @@ public class LookupKnowledgeTool { // 记录完整结果 long totalTime = System.currentTimeMillis() - startTime; - log.info("[{}] 查询完成: found={}, hasL0={}, hasL1={}, confidence={}, totalTime={}ms", - requestId, + log.info("----------------------------------------"); + log.info("<<< [工具返回] lookup_knowledge"); + log.info("<<< 结果: found={}, matchType={}, confidence={}", result.isFound(), - result.getPrimary() != null, - result.getSupplement() != null, - result.getPrimary() != null ? result.getPrimary().getConfidence() : "N/A", - totalTime); + result.getPrimary() != null ? result.getPrimary().getMatchType() : "N/A", + result.getPrimary() != null ? result.getPrimary().getConfidence() : "N/A"); + log.info("<<< 总耗时: {}ms (L0={}ms, L1={}ms)", + totalTime, l0Time, l1Results != null ? (totalTime - l0Time) : 0); + if (result.isFound() && result.getPrimary() != null) { + String content = result.getPrimary().getContent(); + log.info("<<< 返回内容长度: {} 字符", content != null ? content.length() : 0); + if (content != null && content.length() > 200) { + log.info("<<< 内容预览: {}", content.substring(0, 200) + "..."); + } + } + log.info("========================================"); return result; } diff --git a/src/test/java/com/superbiz/agent/repository/DiagnosisRecordRepositoryTest.java b/src/test/java/com/superbiz/agent/repository/DiagnosisRecordRepositoryTest.java index da07f12..1ffac11 100644 --- a/src/test/java/com/superbiz/agent/repository/DiagnosisRecordRepositoryTest.java +++ b/src/test/java/com/superbiz/agent/repository/DiagnosisRecordRepositoryTest.java @@ -67,7 +67,7 @@ class DiagnosisRecordRepositoryTest { DiagnosisRecord record = DiagnosisRecord.builder() .diagnosisId(diagnosisId) .businessId("order-test-001") - .faultCategory(FaultCategory.DATABASE) + .faultCategory(FaultCategory.API) .status(DiagnosisStatus.PENDING) .build(); @@ -84,14 +84,14 @@ class DiagnosisRecordRepositoryTest { // 创建测试数据 DiagnosisRecord record1 = DiagnosisRecord.builder() .diagnosisId(UUID.randomUUID().toString()) - .faultCategory(FaultCategory.EXTERNAL_API) + .faultCategory(FaultCategory.API) .errorCode("40003") .status(DiagnosisStatus.SUCCESS) .build(); DiagnosisRecord record2 = DiagnosisRecord.builder() .diagnosisId(UUID.randomUUID().toString()) - .faultCategory(FaultCategory.EXTERNAL_API) + .faultCategory(FaultCategory.API) .errorCode("40003") .status(DiagnosisStatus.FAILED) .build(); @@ -101,7 +101,7 @@ class DiagnosisRecordRepositoryTest { // 查询 List results = repository.findByFaultCategoryAndErrorCode( - FaultCategory.EXTERNAL_API, "40003"); + FaultCategory.API, "40003"); assertFalse(results.isEmpty()); assertTrue(results.size() >= 2); @@ -113,7 +113,7 @@ class DiagnosisRecordRepositoryTest { DiagnosisRecord record = DiagnosisRecord.builder() .diagnosisId(UUID.randomUUID().toString()) .status(DiagnosisStatus.RUNNING) - .faultCategory(FaultCategory.CACHE) + .faultCategory(FaultCategory.API) .build(); repository.save(record);