| | |
| | | ); |
| | | messages.add(system); |
| | | |
| | | // 2. user:把具体的数据组织成文本(JSON 形式方便模型看结构) |
| | | ChatCompletionRequest.Message user = new ChatCompletionRequest.Message(); |
| | | user.setRole("user"); |
| | | user.setContent(buildUserContent(request)); |
| | | user.setContent(buildDiagnosisUserContent(request)); |
| | | messages.add(user); |
| | | |
| | | // 调用大模型 |
| | |
| | | |
| | | ChatCompletionRequest.Message user = new ChatCompletionRequest.Message(); |
| | | user.setRole("user"); |
| | | user.setContent(buildUserContent(request)); |
| | | user.setContent(buildDiagnosisUserContent(request)); |
| | | messages.add(user); |
| | | |
| | | llmChatService.chatStream(messages, 0.2, 2048, s -> { |
| | | try { |
| | | // SSE 协议不允许原样携带换行,先转为 \n 传输,前端再还原 |
| | | String safe = s == null ? "" : s.replace("\r", "").replace("\n", "\\n"); |
| | | if (!safe.isEmpty()) { |
| | | emitter.send(SseEmitter.event().data(safe)); |
| | | } |
| | | } catch (Exception ignore) {} |
| | | }, () -> { |
| | | try { emitter.complete(); } catch (Exception ignore) {} |
| | | }, e -> { |
| | | try { emitter.completeWithError(e); } catch (Exception ignore) {} |
| | | }); |
| | | } |
| | | |
| | | public void askStream(WcsDiagnosisRequest request, String prompt, SseEmitter emitter) { |
| | | List<ChatCompletionRequest.Message> messages = new ArrayList<>(); |
| | | |
| | | ChatCompletionRequest.Message system = new ChatCompletionRequest.Message(); |
| | | system.setRole("system"); |
| | | system.setContent( |
| | | "你是一名资深 WCS(仓储控制系统)与自动化立库专家,熟悉:堆垛机、输送线、提升机、穿梭车等设备的任务分配和运行逻辑,也熟悉常见的系统卡死、任务不执行、设备空闲但无任务等问题模式。\n\n" + |
| | | "在回答用户问题时,需要结合下面给出的系统当前上下文信息(任务、设备实时状态、设备配置、系统日志等),以简洁、明确的中文作答,并在需要时给出可执行的排查建议。" |
| | | ); |
| | | messages.add(system); |
| | | |
| | | ChatCompletionRequest.Message contextMsg = new ChatCompletionRequest.Message(); |
| | | contextMsg.setRole("user"); |
| | | contextMsg.setContent(buildUserContent(request)); |
| | | messages.add(contextMsg); |
| | | |
| | | ChatCompletionRequest.Message questionMsg = new ChatCompletionRequest.Message(); |
| | | questionMsg.setRole("user"); |
| | | questionMsg.setContent("【用户提问】\n" + (prompt == null ? "" : prompt)); |
| | | messages.add(questionMsg); |
| | | |
| | | llmChatService.chatStream(messages, 0.2, 2048, s -> { |
| | | try { |
| | | String safe = s == null ? "" : s.replace("\r", "").replace("\n", "\\n"); |
| | | if (!safe.isEmpty()) { |
| | | emitter.send(SseEmitter.event().data(safe)); |
| | |
| | | |
| | | ChatCompletionRequest.Message contextMsg = new ChatCompletionRequest.Message(); |
| | | contextMsg.setRole("user"); |
| | | contextMsg.setContent(buildUserContent(request)); |
| | | contextMsg.setContent(buildAskUserContent(request)); |
| | | base.add(contextMsg); |
| | | |
| | | ChatCompletionRequest.Message questionMsg = new ChatCompletionRequest.Message(); |
| | |
| | | return p.length() > 20 ? p.substring(0, 20) : p; |
| | | } |
| | | |
| | | private String buildUserContent(WcsDiagnosisRequest request) { |
| | | private String buildDiagnosisUserContent(WcsDiagnosisRequest request) { |
| | | StringBuilder sb = new StringBuilder(); |
| | | |
| | | sb.append("【问题描述】\n"); |
| | | if (request.getAlarmMessage() != null && !request.getAlarmMessage().isEmpty()) { |
| | | sb.append("【问题描述】\n"); |
| | | sb.append(request.getAlarmMessage()).append("\n\n"); |
| | | } else { |
| | | sb.append("系统当前不执行任务,但具体原因不明,请根据以下信息帮助判断。\n\n"); |
| | | } |
| | | |
| | | sb.append("【设备信息】\n"); |
| | |
| | | |
| | | return sb.toString(); |
| | | } |
| | | |
| | | private String buildAskUserContent(WcsDiagnosisRequest request) { |
| | | StringBuilder sb = new StringBuilder(); |
| | | |
| | | if (request.getExtraContext() != null && !request.getExtraContext().isEmpty()) { |
| | | sb.append("【额外上下文 extraContext】\n"); |
| | | sb.append(JSON.toJSONString(request.getExtraContext(), true)).append("\n\n"); |
| | | } |
| | | |
| | | if (request.getTasks() != null && !request.getTasks().isEmpty()) { |
| | | sb.append("【任务信息 tasks】\n"); |
| | | sb.append("下面是当前相关任务列表的 JSON 数据:\n"); |
| | | sb.append(JSON.toJSONString(request.getTasks(), true)).append("\n\n"); |
| | | } |
| | | |
| | | if (request.getDeviceRealtimeData() != null && !request.getDeviceRealtimeData().isEmpty()) { |
| | | sb.append("【设备实时数据 deviceRealtimeData】\n"); |
| | | sb.append("下面是各设备当前实时状态的 JSON 数据:\n"); |
| | | sb.append(JSON.toJSONString(request.getDeviceRealtimeData(), true)).append("\n\n"); |
| | | } |
| | | |
| | | if (request.getDeviceConfigs() != null && !request.getDeviceConfigs().isEmpty()) { |
| | | sb.append("【设备配置信息 deviceConfigs】\n"); |
| | | sb.append("下面是各设备配置的 JSON 数据:\n"); |
| | | sb.append(JSON.toJSONString(request.getDeviceConfigs(), true)).append("\n\n"); |
| | | } |
| | | |
| | | sb.append("【系统日志 logs(按时间顺序)】\n"); |
| | | if (request.getLogs() != null && !request.getLogs().isEmpty()) { |
| | | for (String logLine : request.getLogs()) { |
| | | sb.append(logLine).append("\n"); |
| | | } |
| | | } |
| | | |
| | | return sb.toString(); |
| | | } |
| | | } |